合并改动

保持你的提交只在独立分支环境下是很有意义的。但是当你想要将这个提交的改动整合到别的分支中去时,就会需要一些额外的工作。例如,你完成了一个新功能的开发,你想要把这个功能整合到你的 “产品” 分支中去。或者相反的流程,你正在一个分支中开发这个新的功能,同时在你所开发项目中发生了一些改变(比如一些严重的错误被修复了),你很需要这些改动也能被整合到你正在使用的分支中。

无论是哪一种情况我们都称这种整合叫做 “合并(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 <support@learn-git.com>
Date: Fri Jul 26 10:56:16 2013 +0200

    Add new contact form page

commit 2dfe283e6c81ca48d6edc1574b1f2d4d84ae7f1
Author: Tobias Günther <support@learn-git.com>
Date: Fri Jul 26 10:52:04 2013 +0200

    Implement the new login box

commit 2b504bee4083a20e0ef1e037eea0bd913a4d56b6
Author: Tobias Günther <support@learn-git.com>
Date: Fri Jul 26 10:05:48 2013 +0200

    Change headlines for about and imprint

然而,合并操作的结果并不是都能很清楚地被显示出来。 Git 并不是简单地将那些需要的提交整合到你的 HEAD 分支中去,它经常会结合出一个新的改动,然后执行 “merge commit” 进行一次单独的提交。你可以把这种提交想象成连接两个分支的节点。

你可以随时经常性地合并两个分支。每次 Git 都会检查那个将要合并进来的分支上的提交,并且只整合那些还没有合并过的提交。

参考

有时进行合并操作会产生一个或多个 “合并冲突(merge conflicts)”,在这种情况下 Git 就不能自动地连接那些改动。例如,在两个分支中都修改了同一个文件的同一行,这时你要自己来决定哪些改动是你想要最终保留的。我们将在本书之后的章节里会为你介绍这方面的操作 处理合并冲突

Get our popular Git Cheat Sheet for free!

About Us

As the makers of Tower, the best Git client for Mac and Windows, we help over 100,000 users in companies like Apple, Google, Amazon, Twitter, and Ebay get the most out of Git.

Just like with Tower, our mission with this platform is to help people become better professionals.

That's why we provide our guides, videos, and cheat sheets (about version control with Git and lots of other topics) for free.