Git冲突“都删除”

问题描述:

我不明白为什么“两个删除”是未合并路径的状态。Git冲突“都删除”

如果:

  • OldStandard是基础
  • NewStandard是最后一次提交的树干
  • OldCustom是分支(叉从OldStandard)我们尝试在主合并回

为什么与标有“同时删除”的文件有冲突?

我了解“两个添加”的冲突,当在NewStandard中添加一个文件,并在OldCustom中添加另一个版本的文件时。

但是,对于删除,如果文件已在NewStandard中删除,并且在OldCustom中也被删除,那么问题是什么?这是一个等同的状态,不是?

+1

Git需要将提交哈希与删除关联。哪个提交应该在这里取得删除的所有权? – Tom

+0

[重现Git合并冲突:DD]的可能重复(https://stackoverflow.com/questions/43702944/reproducing-git-merge-conflict-dd) – LeGEC

我找到了答案here(我建议为重复):

很明显,你可以看到一个“既删除”时branchAgit mv oldfile newstandard提交和branchBgit mv oldfile newcustom提交。

在这种情况下,当试图合并customBranchstandardBranchgit将在三个文件报告冲突:

both deleted: oldfile 
added by them: newcustom 
added by us: newstandard 

像任何冲突,最终选择驻留在你的手中:

git只是强调了这样一个事实,即也许这可能是一个问题,因为newcustomnewstandard住在你的最终代码版本中,而也许这可能与这两个事实相关,因为它们都是由oldfile的副本创建的。

你去手动修复:

  • 如果去除oldfile是预期的结果:git reset oldfile && git rm oldfile
  • 如果保持newstandard是预期的结果,删除其他:git reset newcustom && git rm newcustom
  • 如果某些零件newstandardnewcustom应合并:手动编辑它们,或使用3路合并工具:meld newstandard newstandard newcustom
  • 等...
+0

在这种情况下,我们该如何决定保留哪些东西?接受删除操作是合理的,然后在完成合并时选择'newcustom'或'newstandard'。但是我们怎么能清楚地看到我们必须在这两个文件之间做出选择(当有数百个冲突时)?使用'git mergetool'在这里没有帮助,对吗? – user3341592

+0

@ user3341592:你说得对,'mergetool'只会在解决单个文件上的“两个修改”冲突时才会显示“正确”3种方式合并。 – LeGEC