【问题标题】:Git shows merge conflicts on old resolved commit while rebasingGit 在变基时显示旧已解决提交的合并冲突
【发布时间】:2021-05-07 19:08:26
【问题描述】:

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

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 突然意识到那些超级旧的提交中存在冲突? rebase 不应该考虑我当时申请的冲突解决方案吗?

【问题讨论】:

    标签: git rebase


    【解决方案1】:

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

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

    您可能想看看git filter-branch

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

    【讨论】:

    • 我不知道git filter-branch,我会尝试使用它
    【解决方案2】:

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

    为此,请使用大规模重写工具,如git filter-repo,或较旧的git filter-branch


    [编辑]

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

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

    【讨论】:

    • --rebase-merges 的文档特别指出它不会自动应用冲突解决方案(或其他修正 - 即“邪恶合并”),因此这并不是真正的解决方案。我不太确定他们为什么要在 rebase 中提供半心半意的合并支持;最好的建议仍然是不要通过合并进行变基,除非您试图展平历史记录(并且您知道合并不包含原始更改)
    • 感谢您的评论,更新了答案
    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2011-12-19
    • 2014-03-27
    相关资源
    最近更新 更多