如何使用 git 获取冲突文件的共同祖先

How to get the common ancestor of a conflicting file with git

我合并了 2 个分支并发生了冲突。其中一个只是一团糟,因为它在一个分支 (B1) 上被强烈重构。但是,我希望另一个分支 (B2) 包含一个简单的更改,不幸的是,它影响了很多行。

所以我认为进行合并的最简单方法是保留 B1,然后重新执行对 B2 所做的更改。但我想在开始之前确定 B2 上的那些变化是什么,以确保我不会忘记任何东西。

这样做,

刚想起来:

git merge-base B1 B2

给出分支 B1 和 B2 的共同祖先。这是针对整个分支机构的。但是以后的更改不会应用于两个分支上的任何文件。

然后,要查看差异,只需

git diff common_ancestor..B2 path/to/the/file 

其中 common_ancestor 是通过 git merge-base

获得的提交

请注意,当您手动合并一些冲突文件时 file.ext该文件的所有三个 版本都存储在索引/暂存中-区域,在为这种情况保留的三个插槽中。它们的编号是:

  • 插槽 1 包含基本版本;
  • 插槽 2 包含来自 HEAD 提交的 --ours 版本;
  • 插槽 3 包含另一个提交的 --theirs 版本。

虽然 git checkout--ours--theirs 来提取这两个版本,但缺少基本版本的选项。但是,git show可以用来提取所有三个版本:

git show :1:file.ext > file.ext.base
git show :2:file.ext > file.ext.ours
git show :3:file.ext > file.ext.theirs

例如。

如果您曾经使用过 git mergetool 命令,它只是一个执行上述操作的 shell 脚本包装器(使用略有不同的名称),然后在这三个文件上运行您选择的合并工具。