AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 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 撤消合并 如果想要撤销一次失败的合并,有两种不同的策略。 ![](https://img.kancloud.cn/c2/29/c22948bd6b4255adc45070d56ca3f4c6_800x363.png) **修复引用** 如果这个不想要的合并提交只存在于本地仓库中,最简单且最好的解决方案是移动分支到想要它指向的地方。例如 `git reset --hard HEAD~`。 **还原提交** 如果移动分支指针并不适合,可以选择生成一个新提交的选项,提交将会撤消一个已存在提交的所有修改,Git 称这个操作为 “还原”。 ``` $ git revert -m 1 HEAD ``` `-m 1`标记指出 “mainline” 需要被保留下来的父结点。 当引入一个合并到`HEAD`,新提交有两个父结点:第一个是`HEAD`(`C6`),第二个是将要合并入分支的最新提交(`C4`),而 `-m 1` 表示选择留下第一个父节点。 ![](https://img.kancloud.cn/e7/b5/e7b5227cd74ebd9b4f323bdea82ab4d0_800x302.png) 此时新的提交`^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 ```