冲突里的三个版本
冲突发生时,Git 会把冲突文件的三个版本同时放进索引:阶段 1 是共同祖先版本,阶段 2 是当前分支版本,阶段 3 是对方版本。用 git show :1:文件 这样的写法可以把它们分别取出来看,比盯着冲突标记推测更快弄清双方各自改了什么。
基本信息
| 读取方式 | git show :1:<文件> / :2:<文件> / :3:<文件> |
|---|---|
| 含义 | 1=共同祖先,2=当前分支,3=对方 |
| 派生用法 | git diff :2:文件 :3:文件 直接对比两方版本 |
| 适用时机 | 三路合并产生冲突时排查 |
| 配套命令 | git ls-files -u 列出冲突文件的阶段信息 |
典型使用场景
- 冲突标记看不懂时,分别取出三个版本对照判断
- 想弄清对方到底改了什么,先比对共同祖先与对方版本
- 冲突文件较多时逐个导出到临时目录,用对比工具统一查看
- 解决完成后再回看原始三方版本,确认没有漏掉任何一侧的改动
- 排查自动合并结果异常时,确认基线版本的实际内容
常用示例
常用示例
git show :1:src/app.js > /tmp/app.base.js # 共同祖先版本
git show :2:src/app.js > /tmp/app.ours.js # 当前分支版本
git show :3:src/app.js > /tmp/app.theirs.js # 对方分支版本
git diff --no-index /tmp/app.ours.js /tmp/app.theirs.js # 直接对比两方
git ls-files -u src/app.js # 列出该文件的冲突阶段信息阶段读法
| 写法 | 含义 | 什么时候看 |
|---|---|---|
| :1:文件 | 共同祖先版本 | 判断双方各自偏离了哪里 |
| :2:文件 | 当前分支版本 | 确认为自己这一侧改了什么 |
| :3:文件 | 对方分支版本 | 确认对方改了什么 |
想弄清对方到底改了什么,先对比共同祖先与对方版本,比直接读冲突标记更快,也更不容易误判。
冒号版本语法读取的是索引与树对象,工作区里的普通文件要用普通路径读取,两种写法不要混用。冲突较多时,把这些版本导出到临时目录再用对比工具逐个查看,比在终端里反复切换命令效率高得多,也能避免看错文件。