如何使用 git 获取冲突文件的共同祖先
How to get the common ancestor of a conflicting file with git
我合并了 2 个分支并发生了冲突。其中一个只是一团糟,因为它在一个分支 (B1) 上被强烈重构。但是,我希望另一个分支 (B2) 包含一个简单的更改,不幸的是,它影响了很多行。
所以我认为进行合并的最简单方法是保留 B1,然后重新执行对 B2 所做的更改。但我想在开始之前确定 B2 上的那些变化是什么,以确保我不会忘记任何东西。
这样做,
- 我想知道 2 个分支之间此文件的最新共同祖先提交
- 理想情况下,我想在我当前的 "conflicting-merge" 情况下完成此操作而无需结帐
刚想起来:
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 脚本包装器(使用略有不同的名称),然后在这三个文件上运行您选择的合并工具。
我合并了 2 个分支并发生了冲突。其中一个只是一团糟,因为它在一个分支 (B1) 上被强烈重构。但是,我希望另一个分支 (B2) 包含一个简单的更改,不幸的是,它影响了很多行。
所以我认为进行合并的最简单方法是保留 B1,然后重新执行对 B2 所做的更改。但我想在开始之前确定 B2 上的那些变化是什么,以确保我不会忘记任何东西。
这样做,
- 我想知道 2 个分支之间此文件的最新共同祖先提交
- 理想情况下,我想在我当前的 "conflicting-merge" 情况下完成此操作而无需结帐
刚想起来:
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 脚本包装器(使用略有不同的名称),然后在这三个文件上运行您选择的合并工具。