我有一个 git 存储库,几乎每个文件都需要重命名,并进行了对 ~5% 的行进行实质性更改的转换,但几乎每行都更改了前导空格。
我在两次提交中执行此操作。在第一次提交中,我将每个文件从旧文件名重命名为新文件名,但没有进行任何其他更改。在第二次提交中,我将转换应用于内容。
现在,我希望能够在转换之前合并到分支中。似乎这样的事情会起作用:
git merge foo-branch -s recursive -Xignore-all-space -Xpatience
但看起来-Xignore-all-space
不适用于重命名检测,所以我得到的输出如下:
CONFLICT (modify/delete): old-filename.js deleted in HEAD and modified in foo-branch. Version foo-branch of old-filename.js left in tree.
要合并转换,请至少通过两个步骤进行:
$ git checkout mybranch
$ git merge <the-rename-commit>
[deal with any issues here and commit if the merge failed]
$ git merge <commit-after-rename>
对于特别棘手或困难的情况,您需要三个步骤:
$ git checkout mybranch
$ git merge <commit-just-before-mass-rename>
[deal with any issues here and commit if the merge failed]
$ git merge <the-rename-commit>
$ git merge <commit-after-rename>
这里的想法是处理重命名之前(可能包括(的所有内容,然后处理重命名(仅(,然后处理重命名后的所有内容。
(在您的情况下,您需要至少在第一个和最后一个上使用 -X
标志运行所有三个步骤。 对于中间步骤可能没有区别。
请注意,Git 版本 2.18 有一个新功能:当它检测到某个更高级别目录中的文件大量重命名时,它将以相同的方式重命名新添加的文件。 有关(不多(详细信息,请参阅发行说明。 如果您的 Git 早于 2.18,或者该功能出现故障,您可能需要将重命名本身与 --no-commit
合并,以便在手动提交之前修复路径名。