git rebase冲突,如何删除HEAD中删除的所有冲突文件

时间:2018-06-08 22:50:09

标签: git

在某些情况下,我正试图将我的分支机构从主人那里改掉。但是在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

2 个答案:

答案 0 :(得分:1)

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

如你所说,你有一个:

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

因此,您将在 base 提交中存在一个文件(在索引的第1阶段),并存在于其他提交中(索引中的第3阶段) ),但不在 HEAD 提交中(索引中的第2阶段)。该文件也将存在于工作树

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

因此,作为一种非常作弊的方法,这个可以工作:

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

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

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

答案 1 :(得分:1)

大规模追溯只是任何事情都是git filter-branch的工作。

git diff --name-only --diff-filter=D  ...master

将生成一个列表,列出自您分支以来从主服务器中删除的所有文件。

wipelist=`mktemp`
git checkout -b WIP
git diff  --name-only  --diff-filter=D   ...master    >$wipelist
git filter-branch --prune-empty --index-filter "
                git update-index --force-remove --stdin  <$wipelist
        " -- master..

现在你有一个WIP分支,它与之前签出的分支完全相同,除了它上面没有任何文件在主分支上不再存在,WIP上的第一个提交删除master上随后删除的所有内容。