# 分支与合并
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 底层命令