Git 分支管理

当我们利用git init初始化一个目录的时候,这个时候是没有任何分支的,因为还没有任何文件纳入Git管理流程呢。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git init
Initialized empty Git repository in /cygdrive/f/test_workspace/.git/

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch

当我们添加第一个文件,并将其提交的时候,Git就会为我们默认创建一个分支,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   first.txt
#

利用git status命令,可以看到当前Git所处的分支是master分支。
当提交之后,输入git branch 命令,可以看到:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
* master

可以看到,此时Git系统中只有一个分支,如果有多个分支,*号则表明为当前的分支。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master 8119ddd Add Content to first.txt

而利用-v参数,则可以将当前分支的最新提交 8119ddd,还有其提交信息给显示出来。

利用cat 命令来看当前first.txt中的内容,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ cat first.txt
Test content in first.txt

之后,可以在这个时候再创建另外一个分支,比如叫做second分支,为其创建一个文件叫second.txt,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch second

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
* master
  second

利用git branch <分支名>,可以创建一个分支,而此时,再利用git branch 可看到已经存在两个分支了,*号表明目前还是处于master分支。

可以利用git checkout 命令来切换分支,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch
  master
* second

可看到" Switched to branch 'second' " 字样,而且 * 号也在second 前面了,表明当前是处于second分支。

为second分支添加一个文件,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
* second b981d42 Add second txt in second branch

可以看到second分支的最新提交是b981d42,就是添加了second.txt的提交。

此时切换到master分支,来看看此文件夹下面的文件,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt

可以看到second.txt文件并不在此分支下面。
这就是分支的主要作用。在一个新的分支上面所做的提交,不会影响到其他分支的内容。


那么如何将second分支所做的修改整合到master分支中呢?
这有两种做法,有一种叫merge,有一种叫rebase。
在我看来,merge跟rebase就是谁主动谁被动的差别。
对于merge来说,要由master主动去将发生在second中的改变给整合过来。
对于rebase来说,要将在third的改变去在master中再全部走一遍,然后会得到一个新的third提交。
一般来说,rebase是为了得到一个干净的提交记录,有助于项目管理者去整合其他工作者提交的文件。

我们先创建一个thrid分支,利用second分支来学习merge,利用third分支来学习rebase。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
  second b981d42 Add second txt in second branch
* third  4150467 Add third txt in third branch

此时三个分支的提交如上,我们再分别看看各分支下的内容:

third分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master 8119ddd Add Content to first.txt
  second b981d42 Add second txt in second branch
* third  4150467 Add third txt in third branch

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  third.txt

second分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt

master分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt

接下来,我们将second分支merge到master分支中,如下,在master分支下,利用merge命令:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git merge second
Updating 8119ddd..b981d42
Fast-forward
 second.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 second.txt

这样,就将second分支给整合进来了,再看一下当前分支下的内容:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master b981d42 Add second txt in second branch
  second b981d42 Add second txt in second branch
  third  4150467 Add third txt in third branch

可看到 master和second分支的最新引用都是 b9d81d42。

接下来,我们要切换到third分支,利用rebase,将在third分支发生的改变在master分支上重演。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout third
Switched to branch 'third'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: Add third txt in third branch

在这里,可以看到"rewinding head"等字样,这是因为master分支先整合了second分支,所以它的最新引用比当时切换出third分支的时候要往前,这个时候,会得到一个新的third提交,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  master b981d42 Add second txt in second branch
  second b981d42 Add second txt in second branch
* third  6dc82e8 Add third txt in third branch

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls
first.txt  second.txt  third.txt

可以看到,third的最新提交的引用已经由上面的4150467变成6dc82e8了。
它其实就是一个master提交,上面再重演了一遍third提交。

不过此时master还是在它原来的位置上,所以需要对master做一次fast forward,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout master
Switched to branch 'master'

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git merge third
Updating b981d42..6dc82e8
Fast-forward
 third.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 third.txt

在这里,由于示例的文件比较简单,结构也不复杂,所以看起来,跟merge其实差别不大,但是本质上,这是两种不同的整合方式。

好了,现在我们已经将second和third分支都给整合进来了,不再需要它们了,可以把它们删掉。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -d third
Deleted branch third (was 6dc82e8).

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
* master 6dc82e8 Add third txt in third branch
  second b981d42 Add second txt in second branch

在上面添加分支的时候,我们是利用下面两个命令来进行添加分支跟切换分支,

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch second

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout second
Switched to branch 'second'

而事实上很多情况,我们在创建分支的时候,就会想顺便切换过去了,所以通过指定 -b 参数,就可以实现我们的目的。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git checkout -b forth
Switched to a new branch 'forth'

这跟上一章Git中提交中使用 -a 参数直接将添加进暂存区和提交到本地仓库整合成一步的道理是一样的。
Git中提供了多种这样的方式供我们使用。

在Git中,除了提供merge,rebase这两种工具来帮助我们整合文件之外,还提供了一个reset工具,根据其中文意思就是“重置”。它可以帮助我们将混乱的文件或者错误提交的文件给重置到某一次我们指定的提交上。

比如,现在在master分支中second.txt中不小心添加了一些错误的内容,并将其提交了,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  forth  6dc82e8 Add third txt in third branch
* master 37562da Add Wrong Data in second.txt
  second b981d42 Add second txt in second branch

那我们想将这一次的提交去掉,不要它了,那么就可以利用reset命令,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset 6dc82e8
Unstaged changes after reset:
M       second.txt
  
linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git branch -v
  forth  6dc82e8 Add third txt in third branch
* master 6dc82e8 Add third txt in third branch
  second b981d42 Add second txt in second branch

这个时候,我们可以看到master已经回到之前的版本了,而我们这一次改变的内容还留在second.txt中,
处于已修改,未暂存的状态,这个时候我们就可以自己去对这些错误的内容进行修正,再次提交了。

reset还有几个参数可供选择,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset --v
error: unknown option `v'
usage: git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]
   or: git reset [-q] <commit> [--] <paths>...
   or: git reset --patch [<commit>] [--] [<paths>...]

    -q, --quiet           be quiet, only report errors
    --mixed               reset HEAD and index
    --soft                reset only HEAD
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes
    -p, --patch           select hunks interactively

可利用各参数重置到不同的程度,其中index指的就是暂存区域。

假设用--soft,只会重置HEAD,也就是说改变的内容会被添加到暂存区域(index),只要再次提交就可以,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git reset --soft 6dc82e8

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   second.txt
#

而如果使用--hard,则会将工作目录的改变也给重置掉,切记。

好了,到这里,关于在本地如何利用Git的分支管理,相信大家在心中也有一个初步的理解了。

结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值