首页 > 解决方案 > git rebase 冲突,如何删除在 HEAD 中删除的所有冲突文件

问题描述

在某些情况下,我正在尝试将我的分支从 master 中重新定位。但是在 master 上进行了一些更改,删除了大部分代码库(这很好,并且是预期和讨论的)。现在我正在重新调整我的更改,但我收到了大量的文件冲突,说 CONFLICT (modify/delete): someFile.fileType deleted in HEAD and modified in added commitName. Version added commitName of someFile.fileType left in tree. 手动处理 10 个文件很好,但我有超过 1000 个这些文件。我怎样才能git rm这些文件并继续变基?

一些额外的信息:我运行了以下命令 git rebase master

标签: git

解决方案


该方法很简单,但这种方法的应用需要小心,因为它很容易产生可怕的结果。您需要做的是确定哪些文件存在于索引中的哪个阶段,然后相应地更新索引。

正如你所说,你有一个:

CONFLICT (modify/delete): someFile.fileType deleted in HEAD and modified in ...

因此,您将有一个文件存在于基本提交中(在索引中的第 1 阶段),并且存在于另一个提交中(在索引中的第 3 阶段),但不在HEAD提交中(在索引中的第 2 阶段)。该文件也将存在于work-tree中。

要找出索引中有哪些文件,在哪些阶段下,请运行git ls-files --stage. 然后,您需要更改索引内容以解决任何冲突并确定将提交的内容。如果您希望通过在最终提交中删除git rm someFile.fileType文件来解决此冲突,您可以简单地运行,这将删除所有索引条目文件的工作树版本。

因此,作为一种非常欺骗性的方法,这可能有效:

git ls-files --stage | awk $'/ 3\t/ { print $4 }' | xargs git rm

对此要非常小心!如果你一味地套用一些你不懂的食谱,你可能会烤出一个有毒的蛋糕。请注意,这完全忽略了同一文件是否具有阶段 2 条目,并且仅在索引中查找阶段 3 条目。对于其中包含空格的任何路径名,它也行为不端,因为awk这里是由空格分隔的。

请注意,所有已解决git rm的文件都在索引中作为第 0 阶段,因此如果您有除修改/删除之外的任何冲突,您可以先手动解决它们,然后对其余的使用上述命令。


推荐阅读