## 7.8 高级合并
### 7.8.1 合并冲突
在做一次可能有冲突的合并前尽可能保证工作目录是干净的。
**中断一次合并**
不想处理冲突这种情况,完全可以通过`--abort`选项来简单地退出合并。
```
$ git merge --abort
```
它会尝试恢复到运行合并前的状态。
**忽略空白**
在某些特定的情况中,冲突与空白有关。通过 `-Xignore-all-space` (忽略任意数量已有的空白修改)和 `-Xignore-space-change`(忽略所有空白修改)。
**检出冲突**
通过 `checkout` 的 `--confict` 选项,可以检出具体文件中的冲突。
```
$ git checkout --conflict=diff3 [file]
```
**合并日志**
通过 `log` 中的 `--merge` 选项,可以合并两个分支中的日志信息。
```
$ git log --oneline --left-right --merge
```
### 7.8.2 撤消合并
如果想要撤销一次失败的合并,有两种不同的策略。

**修复引用**
如果这个不想要的合并提交只存在于本地仓库中,最简单且最好的解决方案是移动分支到想要它指向的地方。例如 `git reset --hard HEAD~`。
**还原提交**
如果移动分支指针并不适合,可以选择生成一个新提交的选项,提交将会撤消一个已存在提交的所有修改,Git 称这个操作为 “还原”。
```
$ git revert -m 1 HEAD
```
`-m 1`标记指出 “mainline” 需要被保留下来的父结点。 当引入一个合并到`HEAD`,新提交有两个父结点:第一个是`HEAD`(`C6`),第二个是将要合并入分支的最新提交(`C4`),而 `-m 1` 表示选择留下第一个父节点。

此时新的提交`^M`与`C6`是完全一样的内容,如果想要重新合并分支 `topic` ,会碰到无法合并的情况,因为`topic`中并没有东西不能从`master`中追踪到达。这种情况下,最有效的做法是撤消还原原始的合并。
```
$ git revert ^M
```
### 7.8.3 其他类型的合并
**忽略冲突**
默认情况下,当 Git 看到两个分支合并中的冲突时,它会将合并冲突标记添加到你的代码中并标记文件为冲突状态来让你解决。 如果你希望 Git 简单地选择特定的一边并忽略另外一边而不是让你手动合并冲突,你可以传递给`merge`命令一个`-Xours`或`-Xtheirs`参数。
**子树合并**
子树合并的思想是你有两个项目,并且其中一个映射到另一个项目的一个子目录,或者反过来也行。 当你执行一个子树合并时,Git 通常可以自动计算出其中一个是另外一个的子树从而实现正确的合并。
首先,需要先将被合并的项目添加到当前项目上:
```
# 添加远程库
$ git remote add rack_remote [url]
# 抓取远程库的数据
$ git fetch rack_remote
```
此时,`master` 分支和 `rack_remote` 分支的根目录是不同的。而通过 `-Xsubtree` 选项可以将一个分支合并到另一个分支的子目录上。
```
$ git merge --squash -s recursive -Xsubtree=rack rack_branch
```
- 介绍
- 第一章 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获得帮助
- 第二章 基础
- 2.1 获取仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤销操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 第三章 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 第四章 服务器上的 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 第三方托管的选择
- 第五章 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 第六章 GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 第七章 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 凭证存储
- 第八章 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 第九章 Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 第十章 Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
