如何解决Git推送后执行git commit --amend引发的分支分歧问题
问题描述
我先做了两次修改并提交,推送到裸仓库:
edit 1 git commit -a edit 2 git commit -a git push
之后我修改了已推送到裸仓库的最新提交(用git commit --amend),接着又做了多次修改提交:
edit 3 git commit --amend edit 4 git commit -a edit 5 git commit -a
现在Git状态显示分支分歧:
git status On branch master Your branch and 'origin/master' have diverged, and have 6 and 1 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours) nothing to commit, working tree clean
我知道不该修改已推送的提交,但已经操作了,请问该怎么解决?
解决方法
情况1:远程仓库仅你使用/团队允许改写历史
你修改了已推送到远程的提交,导致本地和远程的提交历史出现分歧。如果这个远程仓库只有你在用,或者团队明确同意改写远程历史,可以直接强制推送本地分支覆盖远程:
git push -f origin master
注意:强制推送会替换远程仓库的原有提交历史,如果有其他开发者已经拉取过旧版本的代码,他们的本地仓库会出现冲突,必须先和团队沟通确认后再执行。
情况2:不能改写远程历史(多人协作场景)
如果不允许改写远程历史,就通过合并的方式整合远程与本地的历史,再推送:
- 拉取远程分支,使用
--no-ff参数生成一个显式的合并提交,保留两边的提交历史:
git pull --no-ff origin master
- 若拉取过程中出现冲突,先手动解决冲突,然后提交合并结果:
git commit -a
- 最后将合并后的分支推送到远程:
git push origin master
这种方式不会修改远程原有历史,仅新增一个合并提交,不会影响其他协作开发者的本地仓库。
内容的提问来源于stack exchange,提问作者phunsoft
相关产品推荐
相关产品推荐

