合并改动
保持你的提交只在独立分支环境下是很有意义的。但是当你想要将这个提交的改动整合到别的分支中去时,就会需要一些额外的工作。例如,你完成了一个新功能的开发,你想要把这个功能整合到你的 “产品” 分支中去。或者相反的流程,你正在一个分支中开发这个新的功能,同时在你所开发项目中发生了一些改变(比如一些严重的错误被修复了),你很需要这些改动也能被整合到你正在使用的分支中。
无论是哪一种情况我们都称这种整合叫做 “合并(merging)”。在 Git 中我们使用 “git merge” 命令来进行合并的操作。
概念
整合分支-不是单独提交
在开始准备合并时,你不必(当然也不能)把那些要整合的改动打包为一个单独的提交。相反,你要告诉 Git ,你想要和那个分支(branch)进行整合,Git 会从那个分支中判断出哪些提交还没有被整合到你当前工作的 HEAD 分支中。只有这些提交才会被整合进来。
此外,你不需要去考虑这些改动最终会到了哪里,整合的目标永远是你的当前的 HEAD 分支,也就是你的工作副本。
在 Git 中,进行合并是非常简单方便的。它只需要两个步骤:
- (1) 切换到那个需要接收改动的分支上。
- (2) 执行 “git merge” 命令,并且在后面加上那个将要合并进来的分支的名称。
来让我们把 “contact-form” 分支的改动合并到 “master” 中去:
$ git checkout master
$ git merge contact-form
现在如果你执行 “git log” 命令,你会看到那个提交 “Add new contact form page” 已经被成功地合并到 master 分支中来了!
$ git log
commit 56eddd14cf034f4bcb8dc9cbf847b33309fa5180
Author: Tobias Günther <[email protected]>
Date: Fri Jul 26 10:56:16 2013 +0200
Add new contact form page
commit 2dfe283e6c81ca48d6edc1574b1f2d4d84ae7f1
Author: Tobias Günther <[email protected]>
Date: Fri Jul 26 10:52:04 2013 +0200
Implement the new login box
commit 2b504bee4083a20e0ef1e037eea0bd913a4d56b6
Author: Tobias Günther <[email protected]>
Date: Fri Jul 26 10:05:48 2013 +0200
Change headlines for about and imprint
然而,合并操作的结果并不是都能很清楚地被显示出来。 Git 并不是简单地将那些需要的提交整合到你的 HEAD 分支中去,它经常会结合出一个新的改动,然后执行 “merge commit” 进行一次单独的提交。你可以把这种提交想象成连接两个分支的节点。
你可以随时经常性地合并两个分支。每次 Git 都会检查那个将要合并进来的分支上的提交,并且只整合那些还没有合并过的提交。
参考
有时进行合并操作会产生一个或多个 “合并冲突(merge conflicts)”,在这种情况下 Git 就不能自动地连接那些改动。例如,在两个分支中都修改了同一个文件的同一行,这时你要自己来决定哪些改动是你想要最终保留的。我们将在本书之后的章节里会为你介绍这方面的操作 处理合并冲突。