修改已推送提交作者后git push失败,如何安全解决?
Git分支推送失败(non-fast-forward)问题解决
为什么会出现"本地分支落后"的错误?
你修改了已经推送到远程的两个旧提交的作者信息——git commit --amend和git rebase -i本质是创建新提交替换旧提交,这会直接改变这些提交的哈希值。
远程的branchA还保留着原来的旧提交历史,而你的本地branchA现在的历史是:[修改后的旧提交1] -> [修改后的旧提交2] -> [新提交],和远程的[旧提交1] -> [旧提交2]完全分叉。Git判断分支"领先/落后"的逻辑是:本地分支的当前提交能否追溯到远程分支的最新提交?现在你的本地历史和远程没有共同的后续提交,Git就会误认为本地分支没有包含远程的旧提交,从而提示"落后"。
解决方案
情况1:只有你一个人使用branchA(无其他开发者基于它开发)
这种情况可以安全地强制推送,推荐用--force-with-lease(比git push --force更安全,会先检查远程分支是否被其他人修改过,避免误覆盖):
# 确保当前在branchA分支 git checkout branchA # 强制推送本地修改到远程 git push --force-with-lease origin branchA
如果确认绝对没人碰这个分支,也可以用git push --force origin branchA,但前者是更稳妥的选择。
情况2:有其他开发者在使用branchA
强制推送会覆盖远程分支的历史,导致其他开发者的本地分支与远程脱节,此时需要:
- 先通知所有开发者将他们基于
branchA的未推送提交暂存到临时分支; - 你执行上述强制推送操作;
- 其他开发者需要将他们的临时分支rebase到新的远程
branchA上,重新整合修改:# 拉取更新后的远程branchA git fetch origin # 切换到自己的临时分支 git checkout my-temp-branch # 将临时分支的修改rebase到新的branchA上 git rebase origin/branchA # 推送到远程(如果需要) git push origin my-temp-branch
注意事项
修改已经推送到公共远程仓库的提交历史是高风险操作,会破坏其他开发者的本地分支与远程的一致性。除非分支是你个人专用,否则尽量避免这么做。如果需要修改作者信息,建议在提交未推送前操作,或者通过Git邮箱配置避免后续出现类似问题。
内容的提问来源于stack exchange,提问作者astra.xvi
相关产品推荐
相关产品推荐

