当我们利用git init初始化一个目录的时候,这个时候是没有任何分支的,因为还没有任何文件纳入Git管理流程呢。
当我们添加第一个文件,并将其提交的时候,Git就会为我们默认创建一个分支,如下:
利用git status命令,可以看到当前Git所处的分支是master分支。
当提交之后,输入git branch 命令,可以看到:
可以看到,此时Git系统中只有一个分支,如果有多个分支,*号则表明为当前的分支。
而利用-v参数,则可以将当前分支的最新提交 8119ddd,还有其提交信息给显示出来。
利用cat 命令来看当前first.txt中的内容,如下:
之后,可以在这个时候再创建另外一个分支,比如叫做second分支,为其创建一个文件叫second.txt,如下:
利用git branch <分支名>,可以创建一个分支,而此时,再利用git branch 可看到已经存在两个分支了,*号表明目前还是处于master分支。
可以利用git checkout 命令来切换分支,如下:
可看到" Switched to branch 'second' " 字样,而且 * 号也在second 前面了,表明当前是处于second分支。
为second分支添加一个文件,如下:
可以看到second分支的最新提交是b981d42,就是添加了second.txt的提交。
此时切换到master分支,来看看此文件夹下面的文件,如下:
可以看到second.txt文件并不在此分支下面。
这就是分支的主要作用。在一个新的分支上面所做的提交,不会影响到其他分支的内容。
那么如何将second分支所做的修改整合到master分支中呢?
这有两种做法,有一种叫merge,有一种叫rebase。
在我看来,merge跟rebase就是谁主动谁被动的差别。
对于merge来说,要由master主动去将发生在second中的改变给整合过来。
对于rebase来说,要将在third的改变去在master中再全部走一遍,然后会得到一个新的third提交。
一般来说,rebase是为了得到一个干净的提交记录,有助于项目管理者去整合其他工作者提交的文件。
我们先创建一个thrid分支,利用second分支来学习merge,利用third分支来学习rebase。
此时三个分支的提交如上,我们再分别看看各分支下的内容:
third分支:
second分支:
master分支:
接下来,我们将second分支merge到master分支中,如下,在master分支下,利用merge命令:
这样,就将second分支给整合进来了,再看一下当前分支下的内容:
可看到 master和second分支的最新引用都是 b9d81d42。
接下来,我们要切换到third分支,利用rebase,将在third分支发生的改变在master分支上重演。
在这里,可以看到"rewinding head"等字样,这是因为master分支先整合了second分支,所以它的最新引用比当时切换出third分支的时候要往前,这个时候,会得到一个新的third提交,如下:
可以看到,third的最新提交的引用已经由上面的4150467变成6dc82e8了。
它其实就是一个master提交,上面再重演了一遍third提交。
不过此时master还是在它原来的位置上,所以需要对master做一次fast forward,如下:
在这里,由于示例的文件比较简单,结构也不复杂,所以看起来,跟merge其实差别不大,但是本质上,这是两种不同的整合方式。
好了,现在我们已经将second和third分支都给整合进来了,不再需要它们了,可以把它们删掉。
在上面添加分支的时候,我们是利用下面两个命令来进行添加分支跟切换分支,
而事实上很多情况,我们在创建分支的时候,就会想顺便切换过去了,所以通过指定 -b 参数,就可以实现我们的目的。
这跟上一章Git中提交中使用 -a 参数直接将添加进暂存区和提交到本地仓库整合成一步的道理是一样的。
Git中提供了多种这样的方式供我们使用。
在Git中,除了提供merge,rebase这两种工具来帮助我们整合文件之外,还提供了一个reset工具,根据其中文意思就是“重置”。它可以帮助我们将混乱的文件或者错误提交的文件给重置到某一次我们指定的提交上。
比如,现在在master分支中second.txt中不小心添加了一些错误的内容,并将其提交了,如下:
那我们想将这一次的提交去掉,不要它了,那么就可以利用reset命令,如下:
这个时候,我们可以看到master已经回到之前的版本了,而我们这一次改变的内容还留在second.txt中,
处于已修改,未暂存的状态,这个时候我们就可以自己去对这些错误的内容进行修正,再次提交了。
reset还有几个参数可供选择,如下:
可利用各参数重置到不同的程度,其中index指的就是暂存区域。
假设用--soft,只会重置HEAD,也就是说改变的内容会被添加到暂存区域(index),只要再次提交就可以,如下:
而如果使用--hard,则会将工作目录的改变也给重置掉,切记。
好了,到这里,关于在本地如何利用Git的分支管理,相信大家在心中也有一个初步的理解了。
结束。