Git 显示变基时旧已解决提交的合并冲突

Git shows merge conflicts on old resolved commit while rebasing

我有一个现有的回购协议,我需要更改所有提交的所有作者电子邮件(我是唯一一个在该回购协议上工作的人)。

git rebase --root --exec 'git commit --amend --author="Arthur ATTOUT <new.email@company.com>" --no-edit'

虽然前 ~100 次提交得到了正确处理,但在特定提交时,git 吓坏了并抱怨存在冲突

error: could not apply 0709cb2... Unit32 default value watermark
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 0709cb2... Unit32 default value watermark
Auto-merging ViewModels/ViewModels/DataprepControl.cs
CONFLICT (content): Merge conflict in ViewModels/ViewModels/DataprepControl.cs
me@home MINGW64 ~/source/repos/soft (dev|REBASE-i 129/320)

为什么 git 突然意识到那些超旧的提交存在冲突?变基不应该考虑我当时应用的冲突解决方案吗?

您似乎想要重写您的存储库的完整历史记录,以修复现有提交的作者字段。

为此,请使用批量重写工具,例如 git filter-repo 或较旧的 git filter-branch


[编辑]

我最初建议使用 git rebase [-r|--rebase-merges] 重播过去的合并,并且 我(错误地)认为它使用现有合并提交的结果来重新创建合并内容,
但@MarkAdelsberger 正确地报告说 git rebase -r 完全重新运行合并,并将重新触发合并冲突。

正如@MarkAdelsberger 所说,最好的建议是不要通过合并使用 git rebase

这可能是因为您要变基的不是单个线性分支,而是包含多个合并点的分支(来自已集成到主分支中的附件分支)。

当 运行 您启动命令时,Git 会将他能找到的所有提交清除回您存储库的根目录,然后一一重新应用它们,但 不会保留结构。然后,您将放弃到目前为止必须执行的所有合并决议。

您可能想看看 git filter-branch

此外,如果您想将所有作者重置为默认作者(您),请考虑改用 --reset--author,它不需要传递参数。