# 合并改動
保持你的提交只在獨立分支環境下是很有意義的。但是當你想要將這個提交的改動整合到別的分支中去時,就會需要一些額外的工作。例如,你完成了一個新功能的開發,你想要把這個功能整合到你的 “產品” 分支中去。或者相反的流程,你正在一個分支中開發這個新的功能,同時在你所開發項目中發生了一些改變(比如一些嚴重的錯誤被修復了),你很需要這些改動也能被整合到你正在使用的分支中。
無論是哪一種情況我們都稱這種整合叫做 “合并(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 就不能自動地連接那些改動。例如,在兩個分支中都修改了同一個文件的同一行,這時你要自己來決定哪些改動是你想要最終保留的。我們將在本書之后的章節里會為你介紹這方面的操作 [處理合并沖突](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