# 分支與合并
Git 有幾個實現大部的分支及合并功能的實用命令。
## git branch
`git branch`?命令實際上是某種程度上的分支管理工具。 它可以列出你所有的分支、創建新分支、刪除分支及重命名分支。
[Git 分支](70182)?一節主要是為?`branch`?命令來設計的,它貫穿了整個章節。 首先,我們在?[分支創建](70183)?一節中介紹了它,然后我們在?[分支管理](70185)?一節中介紹了它的其它大部分特性(列舉及刪除)。
在?[跟蹤分支](http://git-scm.com/book/zh/v2/1-git-branching/_tracking_branches)?一節中,我們使用?`git branch -u`?選項來設置一個跟蹤分支。
最后,我們在?[Git 引用](70242)?一節中講到了它在背后做一什么。
## git checkout
`git checkout`?命令用來切換分支,或者檢出內容到工作目錄。
我們是在?[分支切換](70183)?一節中第一次認識了命令及?`git branch`?命令。
在?[跟蹤分支](http://git-scm.com/book/zh/v2/1-git-branching/_tracking_branches)?一節中我們了解了如何使用?`--track`?標志來開始跟蹤分支。
在?[檢出沖突](70221)?一節中,我們用此命令和?`--conflict=diff3`?來重新介紹文件沖突。
在?[重置揭密](70220)?一節中,我們進一步了解了其細節及與?`git reset`?的關系。
最后,我們在?[HEAD 引用](http://git-scm.com/book/zh/v2/1-git-internals/_the_head)?一節中介紹了此命令的一些實現細節。
## git merge
`git merge`?工具用來合并一個或者多個分支到你已經檢出的分支中。 然后它將當前分支指針移動到合并結果上。
我們首先在?[新建分支](http://git-scm.com/book/zh/v2/1-git-branching/_basic_branching)?一節中介紹了?`git merge`?命令。 雖然它在本書的各種地方都有用到,但是`merge`?命令只有幾個變種,一般只是?`git merge <branch>`?帶上一個你想合并進來的一個分支名稱。
我們在?[派生的公開項目](http://git-scm.com/book/zh/v2/1-distributed-git/_public_project)?的后面介紹了如何做一個?`squashed merge`?(指 Git 合并時將其當作一個新的提交而不是記錄你合并時的分支的歷史記錄。)
在?[高級合并](http://git-scm.com/book/zh/v2/1-git-tools/_advanced_merging)?一節中,我們介紹了合并的過程及命令,包含?`-Xignore-space-change`?命令及?`--abort`?選項來中止一個有問題的提交。
在?[簽署提交](http://git-scm.com/book/zh/v2/1-git-tools/_signing_commits)?一節中我們學習了如何在合并前驗證簽名,如果你項目正在使用 GPG 簽名的話。
最后,我們在?[子樹合并](http://git-scm.com/book/zh/v2/1-git-tools/_subtree_merge)?一節中學習了子樹合并。
## git mergetool
當你在 Git 的合并中遇到問題時,可以使用?`git mergetool`?來啟動一個外部的合并幫助工具。
我們在?[遇到沖突時的分支合并](http://git-scm.com/book/zh/v2/1-git-branching/_basic_merge_conflicts)?中快速介紹了一下它,然后在?[外部的合并與比較工具](http://git-scm.com/book/zh/v2/1-customizing-git/_external_merge_tools)?一節中介紹了如何實現你自己的外部合并工具的細節。
## git log
`git log`?命令用來展示一個項目的可達歷史記錄,從最近的提交快照起。 默認情況下,它只顯示你當前所在分支的歷史記錄,但是可以顯示不同的甚至多個頭記錄或分支以供遍歷。 此命令通常也用來在提交記錄級別顯示兩個或多個分支之間的差異。
在本書的每一章幾乎都有用到此命令來描述一個項目的歷史。
在?[查看提交歷史](http://git-scm.com/book/zh/v2/1-git-basics/_viewing_history)?一節中我們介紹了此命令,并深入做了研究。 研究了包括?`-p`?和?`--stat`?選項來了解每一個提交引入的變更,及使用`--pretty`?和?`--online`?選項來查看簡潔的歷史記錄。
在?[分支創建](http://git-scm.com/book/zh/v2/1-git-branching/_create_new_branch)?一節中我們使用它加?`--decorate`?選項來簡單的可視化我們分支的指針所在,同時我們使用?`--graph`?選項來查看分叉的歷史記錄是怎么樣的。
在?[私有小型團隊](http://git-scm.com/book/zh/v2/1-distributed-git/_private_team)?和?[提交區間](http://git-scm.com/book/zh/v2/1-git-tools/_commit_ranges)?章節中,我們介紹了在使用?`git log`?命令時用`branchA..branchB`?的語法來查看一個分支相對于另一個分支, 哪一些提交是唯一的。 在?[提交區間](http://git-scm.com/book/zh/v2/1-git-tools/_commit_ranges)?一節中我們作了更多介紹。
在 > 和?[三點](http://git-scm.com/book/zh/v2/1-git-tools/_triple_dot)?章節中,我們介紹了?`branchA...branchB`?格式和?`--left-right`?語法來查看哪些僅其中一個分支。 在?[合并日志](http://git-scm.com/book/zh/v2/1-git-tools/_merge_log)?一節中我們還研究了如何使用?`--merge`選項來幫助合并沖突調試,同樣也使用?`--cc`?選項來查看在你歷史記錄中的合并提交的沖突。
在?[引用日志](http://git-scm.com/book/zh/v2/1-git-tools/_git_reflog)?一節中我們使用此工具和?`-g`?選項 而不是遍歷分支來查看 Git 的?`reflog`。
在?[搜索](http://git-scm.com/book/zh/v2/1-git-tools/_searching)?一節中我們研究了`-S`?及?`-L`?選項來進行來在代碼的歷史變更中進行相當優雅地搜索,如一個函數的歷史。
在?[簽署提交](http://git-scm.com/book/zh/v2/1-git-tools/_signing_commits)?一節中,我們了解了如何使用?`--show-signature`?來為每一個提交的?`git log`輸出中,添加一個判斷是否已經合法的簽名的一個驗證。
## git stash
`git stash`?命令用來臨時地保存一些還沒有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目錄。
[儲藏與清理](http://git-scm.com/book/zh/v2/1-git-tools/_git_stashing)?一整個章節基本就是在講這個命令。
## git tag
`git tag`?命令用來為代碼歷史記錄中的某一個點指定一個永久的書簽。 一般來說它用于發布相關事項。
我們在?[打標簽](http://git-scm.com/book/zh/v2/1-git-basics/_git_tagging)?一節中介紹了此命令及相關細節,并在?[為發布打標簽](http://git-scm.com/book/zh/v2/1-distributed-git/_tagging_releases)?一節實踐了此命令。
我也在?[簽署工作](http://git-scm.com/book/zh/v2/1-git-tools/_signing)?一節中介紹了如何使用?`-s`?標志創建一個 GPG 簽名的標簽,然后使用?`-v`?選項來驗證。
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 3. Git 分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 4. 服務器上的 Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令