无法拉取/推送到GitHub仓库,分支分歧导致拉取失败求助
问题场景
我的操作步骤:
- 直接在GitHub仓库修改README文件,提交了3次commit
- 未拉取上述commit的情况下,本地进行了4次commit
推送时系统提示需先拉取远程commit,执行git pull时收到警告:
warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the following commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
执行git config pull.ff only后,再次拉取出现错误:
fatal: Not possible to fast-forward, aborting.
解决方案
现在远程和本地分支已经分叉了——两边各有独立的提交,没有包含关系,而pull.ff only只允许「快进合并」(也就是本地分支必须是远程分支的直接后代才能合并),所以才会报错。你可以选下面两种方法解决:
方法1:合并远程分支(保留完整提交历史)
这种方式会生成一个新的合并提交,把本地和远程的所有提交历史都保留下来:
- 先取消之前设置的
pull.ff only:
git config --unset pull.ff
- 执行普通拉取(默认用merge策略):
git pull
- 这时会自动打开编辑器让你写合并提交的说明,保存退出就完成合并了
- 最后把合并后的分支推上去:
git push
方法2:变基(让提交历史变成线性)
这种方式会把你本地的4个提交,“移”到远程那3个提交的后面,让整个提交历史是一条直线,看起来更整洁:
- 先设置拉取时用rebase策略:
git config pull.rebase true
- 执行拉取变基:
git pull
- 如果碰到冲突,手动修改冲突文件后,执行:
git add <冲突的文件名> git rebase --continue
- 变基完成后推送分支(因为变基改写了提交历史,需要加
--force,多人协作的公共分支别用这个):
git push --force
注意点
- 要是多人一起用的公共分支,优先选「合并」的方式,变基会改写历史,容易给其他协作的人搞出问题
- 要是你自己的个人分支,变基能让提交历史更清爽,用着更舒服
内容的提问来源于stack exchange,提问作者Ayan Das
相关产品推荐
相关产品推荐

