解决冲突以支持 our/their 保持不冲突的更改

Resolve conflicts in favor of our/their keeping unconflicting changes

git checkout --theirs . 例如只需要整个 "theirs" 文件。

我正在寻找一种使用 "ours" 或 "theirs" 的方法,但仅限于冲突,就好像总是删除各自的其他部分和冲突标记。

您可以,开始git merge操作之前,使用-X选项选择那个。这些选项1 允许您选择在低级别(文件内)冲突期间覆盖 "ours" 或 "theirs",而不影响非双方的冲突变化。

如果您已经开始合并并解决了一些冲突,则中止合并并使用 -X ours-X theirs 重新启动会很痛苦。这也是不必要的,因为 Git 提供了一个单独的命令 git merge-file,它对一组三个输入文件执行三向合并。

因此,假设您已经开始合并,但它有三个冲突并停止了。如果此时 运行 git status 您会看到这三个文件未合并。因此,您手动合并了三个文件中的一个,然后从第二个文件开始,然后想:等等,我想让 Git 为我做这件事。

此时您可以做的是停止手动解析工作树文件。退出您所在的任何编辑器,返回命令行。对于三个文件中的第二个,提取所有三个输入:

git show :1:file.ext > file.BASE
git show :2:file.ext > file.OURS
git show :3:file.ext > file.THEIRS

您现在拥有 Git 尝试自行合并但失败的三个输入。 Git 合并三者的尝试在 file.ext 中;这三个输入在这三个名为 .BASE.OURS.THEIRS.

的文件中

您现在可以调用 git merge-file 并将其传递给 --ours--theirs 以在存在冲突的地方选择我们或他们的更改:

git merge-file --ours file.OURS file.BASE file.THEIRS

合并结果写回 file.OURS。检查它,看看你是否喜欢这个结果;如果是这样,将其重命名为 file.extgit add file.ext 以标记此文件已解决。删除使您的工作树混乱的 file.BASEfile.THEIRS 副本。

您还有 1 个未解决的文件。对剩余文件的三个副本重复三个提取命令和 git merge-file 命令。

(应该有一个面向用户的 Git 命令可以为您完成所有这些,但没有。)


1我称他们为"eXtended options"或"eXtended strategy options"来占字母X。 Git 文档只称它们为 "strategy-options",这令人困惑,因为 -s 选项选择策略,因此是策略选项。 -X 参数因此是 strategy-option 选项,与 strategy 选项不同。 ("Clear as mud",正如他们所说。)说 -s 是策略选项,-X 提供扩展选项似乎不那么令人困惑。