Git分支出现非自身提交的原因及解决方法咨询
问题原因分析
你遇到的情况是因为设置git config pull.rebase true后,git pull会执行fetch + rebase操作,而非默认的merge。如果远程的<branch_name>分支已经包含了其他用户合并到master的提交(比如有人把master的更新合并到了这个远程分支),拉取时Git会把你本地分支的提交变基到远程分支的最新提交之上——这就导致那些原本属于master的提交被加入到了你本地分支的历史里。
另外也有可能是你的本地分支基于旧版master,而远程<branch_name>已经同步了master的最新状态,拉取时的rebase操作会把本地分支的基础更新到远程分支的最新版本,自然就带上了master的那些提交。
能否移除这些提交?
完全可以,不用删除分支。这里有两种常用方法:
直接回退到pull前的状态:
- 用
git reflog查看操作历史,找到执行git pull之前的提交哈希值(比如类似abc123 HEAD@{2}: commit: 我的上次提交的条目)。 - 执行
git reset --hard <找到的哈希值>,把本地分支强制回退到pull前的状态。 - 因为本地分支历史已修改,需要强制推送到远程:
git push origin <branch_name> --force(注意如果有其他同事也在这个分支工作,要提前沟通,避免覆盖他们的修改)。
- 用
交互式变基删除多余提交:
如果在pull之后你又做了新的提交,可以用交互式变基删掉多余的master提交:- 同样用
git reflog找到pull前的提交哈希,执行git rebase -i <哈希值>。 - 在弹出的编辑界面里,把那些不属于你分支的master提交前面的
pick改成drop,保存退出。 - 完成变基后,执行
git push origin <branch_name> --force强制推送。
- 同样用
是否需要删除分支重新开始?
不需要。上面的方法足够修复分支历史,除非你的分支已经和远程分支的历史完全混乱到无法梳理,但这种情况极少发生。直接用回退或变基的方式就能恢复到你想要的状态,没必要重新创建分支。
内容的提问来源于stack exchange,提问作者rosierose12
相关产品推荐
相关产品推荐

