4.2 基本的分支及合并
让我们来分析一个简单的分支和合并的例子,这个工作流程你可能会在实际工作中用到。你将按照以下步骤来工作:
1. 在一个web site上工作
2. 为你正在工作的新的案例创建一个分支
3. 在那个分支上做一些工作。
此时,你会收到一个电话,另外一个事件更紧急需要你的火线修改。你会这么做:
1. 返回到你的产品分支上
2. 创建一个分支并增加这个修改
3. 在它测试后,合并这个hotfix分支,并把它推送到产品中去
4. 切换回你的初始的案例并继续工作。
4.2.1 基本分支(Basic Branching)
首先,让我们假定你正工作在你的项目上,这个项目已经有一些提交了(如图3-10):
你已经决定你要解决issue #53,这个问题可能会存储在任何你公司使用的问题跟踪系统中。为了清楚起见,Git并不试图进入到任何特定的问题跟踪系统中,但由于Issue 53#是一个你想工作的焦点,你可能想创建一个新的分支来解决这个问题。为了创建同时切换到一个新的分支,你可以以-b参数来运行git checkout命令:
$ git checkout -b iss53
Switched to a new branch "iss53"
这个命令是以下命令的简短方式:
$ git branch iss53
$ git checkout iss53
图3-11显示了结果:
你工作在你的web site上并有了一些提交。这么做将使iss53分支向前走,因为你已经将它checkout出来了(也就是说,你的HEAD是指向它的,查看图3-12):
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
现在,你接到一个电话说你的web site上存在一个问题,你需要立即解决这个问题。使用Git,你不需要将iss53分支上的改动和你的bug修复一起部署, 你不需要花费很大的力气来返回到你可以做Bug修复的那个版本。所有你需要做的只是切换回你的master分支。
然而,在你这么做之前,请注意如果你的工作目录或者缓存区中有未被提交的更改,这个更改与你正在检出的分支有冲突,那么Git不会让你切换分支。当你切换分支时,最好你要有一个干净的工作状态。我们后面介绍的很多办法可以达到这一点(即:隐藏并提交修订)。现在,你已经提交了你所有的更改,于是你可以切换回你的master分支了:
$ git checkout master
Switched to branch "master"
现在,你的项目工作目录正是你开始issue 53#工作之前的情况,你可以集中精力在你的热修复上(hotfix)来了。一个要点需要记住:Git重新设置你的工作目录使其看起来是你检出那个分支指向的提交的快照。它自动地增加,移除,以及修改文件并确保你的工作copy,使你的分支看上去与你的最后一个提交一致。
下一步,你有一个热修复需要做。让我们来创建一个热修复的分支,这样你可以在其上工作直到你完成它(如图3-13):
$ git checkout -b 'hotfix'
Switched to a new branch "hotfix"
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix]: created 3a0874c: "fixed the broken email address"
1 files changed, 0 insertions(+), 1 deletions(-)
你可以运行你的测试,确保热修复是你想要的,并把它合并回你的master分支中从而部署到产品中。你可以用git merge命令来实现:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast forward
README | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
你会注意到在这个合并中出现的短语”快速向前”(Fast forward)。因为你合并的那个分支指向的提交位于你工作的那个分支的提交的前端,Git移动指针向前。让我们用另外一种方式叙述它,当你试图合并一个提交到一个顺着第一个提交的历史可达的提交中,Git通过直接移动指针向前来简化它――因为并没有叉开的工作需要合并到一起――这被称为一个”快速向前”(fast forward)。
你的更改现在位于被master分支指向的那个提交的快照中了,你可以部署你的更改了(如图3-14):
在你更重要的修复被部署后,你准备好切换回你被打断前所作的工作。然而,首先你要删除掉hotfix分支,因为你不再需要它了--master分支指向了同样的位置。你可以使用-d选项的git branch命令:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
现在你可以切换回你的正在进行的工作分支来继续issue 53#的工作(如图3-15):
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53]: created ad82d7a: "finished the new footer [issue 53]"
1 files changed, 1 insertions(+), 0 deletions(-)
这里值得注意的是你在hotfix分支中所做的工作并不包含在你的iss53分支中。如果你需要把它包括进来,你可以使用git merge master命令来合并你的master分支到你的iss53分支中,或者你可以等待到以后你决定将iss53分支返回到master时再集成这些更改。