版本控制SoEasy之Git-01

Git是什么?

Git是一种常用的版本控制系统,我们常见的版本控制系统有git和svn。 要知道怎么使用首先要了解它的概念。

什么是版本控制

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员的负担,节省时间,同时降低人为错误

Git常用术语

记住git的常用术语对后续理解git的基本操作有着至关重要的作用

  • 仓库(Repository)
    受版本控制的所有文件修订历史的共享数据库

  • 工作空间(WorkSpace)
    本地硬盘或Unix 用户帐户上编辑的文件副本

  • 工作树/区(Working tree)
    工作区包含了仓库的工作文件。您可以修改和提交更改然后提交到仓库。

  • 暂存区(Staging area)
    暂存区是工作区提交之后的地方。
    版本控制SoEasy之Git-01_第1张图片

  • 索引(index)
    索引是暂存区的另一种术语

  • 签入(Checkin)
    将新版本签入回仓库

  • 签出(checkout)

  • 从仓库中将文件的最新修订版本复制到工作空间

  • 提交(Commit)
    对各自文件的工作副本做了更改,并将这些更改提交到仓库

  • 冲突(Conflict)
    多人对同一文件的工作副本进行更改,并将这些更改提交到仓库

  • 合并(Merge)
    将某分支上的更改联接到此主干或同为主干的另一个分支

  • 分支(Branch)
    从主线上分离开的副本,默认分支叫master

  • 锁(Lock)
    获得修改文件的专有权限。

  • 头(HEAD)
    头是一个象征性的参考,最常用以指向当前选择的分支。

  • 修订(Revision)
    表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。

  • 标记(Tags)
    标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。

Git和SVN

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
版本控制SoEasy之Git-01_第2张图片
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
版本控制SoEasy之Git-01_第3张图片

GitBash常用命令

cd ~	回home

cd ..回退到上一个目录,直接cd进入默认目录

pwd:显示当前所在目录路径

ls(ll): 都是列出当前目录中的所有文件,只不过ll列出的内容更为详细

touch: 新建一个文件	

rm :删除一个文件

mkdir:新建一个文件

rm -r :删除一个文件夹,rm -r 	src删除src目录

mv :移动文件,mv index.

reset: 清屏

history: 查看命令历史

help 帮助

exit 推出

#表示注释

显示文件内容 cat

Git常用命令

查看配置,可以查看现在git环境配置

git config -l

查看系统

config git config --system --list

查看当前用户global的配置

git config --global --list

查看当前仓库配置

git config --local --list

设置用户名和邮箱

$ git config --global user.name "guogugo"  #名称
$ git config --global user.email [email protected]   #邮箱

总之–global为全局配置,不加则为某个项目的特定配置。

添加配置项

git config [--local|--global|--system]  section.key value

[--local|--global|--system]  #可选的,对应本地,全局,系统不同级别的设置

section.key #区域下的键

value #对应的值

删除配置项

git config [--local|--global|--system] --unset section.key

git 理论基础

工作区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
版本控制SoEasy之Git-01_第4张图片

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
    下面这张图能更好的说明
    版本控制SoEasy之Git-01_第5张图片
  • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
    Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
  • Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

git 的工作流程

Git基本git的工作流程一般是这样的:

  1. 在工作目录中添加、修改文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到git仓库。(这里是本地仓库)

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)操作
版本控制SoEasy之Git-01_第6张图片
图解教程
直接看图理解本地git的提交过程
版本控制SoEasy之Git-01_第7张图片

Git的基本操作

创建工作目录与常用指令

工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。

日常使用只要记住下图6个命令:
版本控制SoEasy之Git-01_第8张图片

获得git仓库

需要用GIT管理的项目的根目录执行(注意自己当前目录的位置):

# 在当前目录新建一个Git代码库
$ git init

执行后项目目录会多出一个.git文件夹,关于版本等信息都在这里面,如果没有看到可以百度怎么查看隐藏文件

使用如下命令,可以把创建目录与仓库一起完成

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

克隆远程仓库

另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout,语法格式如下:

# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]

注意url为https…的地址

git 文件操作

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

文件四种状态

版本控制SoEasy之Git-01_第9张图片

  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,
    而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git
    add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git
    checkout即从库中取出文件, 覆盖当前修改
  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致,
    文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
    版本控制SoEasy之Git-01_第10张图片

查看文件状态

#查看指定文件状态
git status [filename]

#查看所有文件状态
git status

添加文件和目录

版本控制SoEasy之Git-01_第11张图片

  • 工作区(Working Directory)就是你在电脑里能看到的目录。
  • 版本库(Repository)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

将untracked状态的文件添加到暂存区,语法格式如下:

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

移除文件与目录

版本控制SoEasy之Git-01_第12张图片

#直接从暂存区删除文件,工作区则不做出改变
git rm --cached 
#如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
git reset HEAD ...

当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

#移除所有未跟踪文件
#一般会加上参数-df,-d表示包含目录,-f表示强制清除。
git clean [options] 
#只从stage中删除,保留物理文件
git rm --cached readme.txt 

#不但从stage中删除,同时删除物理文件
git rm readme.txt 

#把a.txt改名为b.txt
git mv a.txt b.txt
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master
    指向的目录树就是提交时暂存区的目录树。
  • 当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行 “git rm –cached ” 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 “git checkout .” 或者 “git checkout — ”
    命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行 “git checkout HEAD .” 或者 “git checkout HEAD ” 命令时,会用 HEAD指向的 master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

查看文件修改后的差异

git diff用于显示WorkSpace中的文件和暂存区文件的差异

#查看文件修改后的差异
git diff [files]

-a表示修改之前的文件,+++b表示修改后的文件

#比较暂存区的文件与之前已经提交过的文件
git diff --cached

也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下:

#比较repo与工作空间中的文件差异
git diff HEAD~n

版本控制SoEasy之Git-01_第13张图片

签出

如果仓库中已经存在文件f4.txt,在工作区中对f4修改了,如果想撤销可以使用checkout,签出覆盖

检出命令git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区

语法:

#用法一
git checkout [-q] [] [--] ...
#用法二
git checkout []
#用法三
git checkout [-m] [[-b]--orphan] ] []

版本控制SoEasy之Git-01_第14张图片

$ git checkout branch
#检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch  指向的树更新暂存区和工作区。

$ git checkout
#汇总显示工作区、暂存区与HEAD的差异。

$ git checkout HEAD
#同上

$ git checkout -- filename
#用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。

$ git checkout branch -- filename
#维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相   应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。

$ git checkout -- . 或写作 git checkout .
#注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的  #修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!

$ git checkout commit_id -- file_name
#如果不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。

提交

通过add只是将文件或目录添加到了index暂存区,使用commit可以实现将暂存区的文件提交到本地仓库。

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

修订提交

如果我们提交过后发现有个文件改错了,或者只是想修改提交说明,这时可以对相应文件做出修改,将修改过的文件通过"git add"添加到暂存区,然后执行以下命令:

# 修订提交
git commit --amend

撤销提交(commit)

原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象

#撤销上一次的提交
git reset --hard HEAD~1

查看日志与历史

查看提交日志可以使用git log指令,语法格式如下:

#查看提交日志
git log [] [] [[\--] …?]

撤销暂存区跟新

使用"git add"把更新提交到了暂存区。这时"git status"的输出中提示我们可以通过"git reset HEAD …"把暂存区的更新移出到WorkSpace中

撤销本地库更新

在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用"HEAD",那么再钱一个版本可以使用"HEAD",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD=HEAD1,HEAD^^=HEAD2)

优质参考

张果教你用git

你可能感兴趣的:(git)