对于比较复杂,需要长期更新的项目,分支管理十分重要,在使用分支前一定要了解分支管理的一些基本原理。
首先要知道的是,本地仓库的版本都是以Object Graph形式进行管理的,Object Graph如下:
这个图被存储在本地初始仓库后的.git文件中,当然文件夹中还有其他文件(也可以存在多个这样的图)。
这里需要注意的是,箭头指向的是上一个版本,箭头起点端是在上一个版本基础上更新的版本。
以上面为例,41c4b8f是最早的版本,1255f4e是在41c4b8f基础上更新后的版本。HEAD永远指向当前操作版本(而不是master!!!)。
分支只是一个指向某个版本的指针,因此就上面图而言,只有一个分支:master(因为只有master指针),但绝不能认为在此之前没有出现过分支,显然,一定出现过,因为在版本1255f4e后出现了分叉,如果没有分支,则整个Object Graph一定是线性的,至于为什么,看完后面就会明白。
然后需要知道的是,分支操作基本上就是创建,删除,合并等。
对上面图来说,1255f4e版本之后一定创建了分支,至于为什么没有别的分支,因为该指针被删除了。
而版本3e62e60是版本82e049e和6400936合并的结果。
下面详细讲解分支基本操作和内部Object Graph的具体变化:
以下面图为例:
当前只有一个master分支(默认分支,不用创建)。
我们使用如下命令创建一个新分支:
git checkout –b 分支名(以iss53为例)
可以发现,两个指针指向同一个版本。
此时就会产生一个名为iss53的指针指向C2,同时git会切换到该分支:
当你对C2修改后(不修改也行),commit则会得到如下图:
这时iss53会单独形成一个新的版本,同时master并没有改变,这就是分支创建。
你可以使用如下命令进行分支切换:
git checkout 分支名
让我们在master下再创建一个名为hotfix的分支。
git checkout master
git checkout –b hotfix
git commit
结果如下:
假设C4版本已经成熟,C3是C4的中某个功能的改进版本但不成熟,则我们需要将master指向C4版本,即将master与hotfix进行合并,命令如下:
git checkout master
git merge hotfix
先切换到master分支,然后让它指向hotfix指向的版本,Object Graph如下:
然后我们就可以删除hotfix分支了,同时切换到iss53分支,使用如下命令:
git branch –d hotfix
git checkout iss53
git commit
假设我们iss53版本更新完成,需要将修改后的版本和C4合并,则可以使用如下命令:
git checkout iss53
git commit
git checkout master
git merge iss53
注意:
merge时,git会自动评测两个带merge的版本,然后通过某种机制进行merge(本人也不太懂),而且不是所有的版本都能merge,如果两个版本有逻辑上的矛盾,则会提示merge失败,这时需要人为对两个版本矛盾点进行修改,然后才能正常merge。
想要在远程仓库中拥有分支,只需在本地切换到对应分支,然后push即可:
git push -u 远程仓库地址 分支名
下面是对分支管理的命令总结:
git checkout –b XXX //创建分支
git checkout XXX //切换分支
git branch –d XXX //删除分支
git merge XXX //合并分支
git branch //查看当前已创建的分支名
git branch -a //查看所有分支
git branch -r //查看远程分支情况
在github中可以直接查看远程分支情况,在
Insights->Netork栏中。
下面是本人某个远程仓库的版本变化情况,供大家分析:
如果知道本人大概如何操作的,那么你就已经较为熟练的掌握分支管理原理了。
左半部分图是先前版本,右半部分图是将整个项目copy后重新进行修改后的提交。
可以发现,copy后修改提交会生成第二个Object Graph。