# 合并改动
保持你的提交只在独立分支环境下是很有意义的。但是当你想要将这个提交的改动整合到别的分支中去时,就会需要一些额外的工作。例如,你完成了一个新功能的开发,你想要把这个功能整合到你的 “产品” 分支中去。或者相反的流程,你正在一个分支中开发这个新的功能,同时在你所开发项目中发生了一些改变(比如一些严重的错误被修复了),你很需要这些改动也能被整合到你正在使用的分支中。
无论是哪一种情况我们都称这种整合叫做 “合并(merging)”。在 Git 中我们使用 “git merge” 命令来进行合并的操作。
##### 概念
#### 整合分支-不是单独提交
在开始准备合并时,你不必(当然也不能)把那些要整合的改动打包为一个_单独的提交_。相反,你要告诉 Git ,你想要和那个_分支(branch)_进行整合,Git 会从那个分支中判断出哪些提交还没有被整合到你当前工作的 HEAD 分支中。只有这些提交才会被整合进来。
此外,你不需要去考虑这些改动最终会到了哪里,整合的目标永远是你的当前的 HEAD 分支,也就是你的工作副本。
![basic-merging](https://box.kancloud.cn/2016-05-04_572967da5db81.png)
在 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” 进行一次单独的提交。你可以把这种提交想象成连接两个分支的节点。
![merge-commit](https://box.kancloud.cn/2016-05-04_572967da7cb6e.png)
你可以随时经常性地合并两个分支。每次 Git 都会检查那个将要合并进来的分支上的提交,并且只整合那些还没有合并过的提交。
##### 参考
有时进行合并操作会产生一个或多个 “合并冲突(merge conflicts)”,在这种情况下 Git 就不能自动地连接那些改动。例如,在两个分支中都修改了同一个文件的同一行,这时你要自己来决定哪些改动是你想要最终保留的。我们将在本书之后的章节里会为你介绍这方面的操作 [处理合并冲突](https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/merge-conflicts)。
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基础知识
- 什么是版本控制?
- 为什么要使用版本控制系统?
- 准备工作
- 版本控制的基本工作流程
- 从一个未被纳入版本控制的项目开始
- 从一个已被纳入版本控制的项目开始
- 工作在你的项目上
- Part 2 - 分支与合并
- 分支可以改变你的生命
- 在分支上工作
- 暂时保存更改
- 切换一个本地分支
- 合并改动
- 分支的工作流程
- Part 3 - 远程仓库
- 关于远程仓库
- 连接一个远程仓库
- 查看远程数据
- 整合远程的改动
- 发布一个本地分支
- 删除分支
- Part 4 - 高级应用
- 撤销操作
- 用 diff 来检查改动
- 处理合并冲突
- Rebase 代替合并
- 子模块
- git-flow 的工作流程
- 使用 SSH 公钥验证
- Part 5 - 工具与服务
- 桌面应用程序
- 比较和整合工具
- 代码托管服务
- 更多学习资源
- 附录
- 版本控制的最佳实践
- 命令 101
- 从 Subversion 过渡到 Git
- 为什么选择 Git