解决冲突以支持我们/他们保持不冲突的变化

时间:2020-02-12 15:21:42

标签: git git-checkout merge-conflict-resolution

例如,

git checkout --theirs .仅获取整个“他们的”文件。

我正在寻找一种使用“我们的”或“他们的”的方法,但仅用于冲突,就像总是删除各自的其他部分和冲突标记一样。

1 个答案:

答案 0 :(得分:0)

您可以在开始git merge操作之前 ,使用-X选项进行选择。这些选项 1 允许您选择在低级别(文件内部)冲突期间覆盖“我们的”或“他们的”,而不会影响双方无冲突变更的合并。 / p>

如果您已经开始合并并解决了一些冲突,那么中止合并并以-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副本。

您还有一个未解决的文件。在该一个剩余文件的那三个副本上重复三个提取命令和git merge-file命令。

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


1 我称它们为“扩展选项”或“扩展策略选项”,以说明字母X。 Git文档只是将它们称为“策略选项”,这是令人困惑的,因为-s选项选择了策略,因此是策略选项。因此-X自变量是策略选项选项,与策略选项不同。 (正如他们所说,“清澈见底”。)说-s是策略选择,而-X提供扩展的选择似乎就不那么混乱了。