提交代码推送PR后重新克隆,拉取PR遇non-fast-forward错误原因
git pull origin pull/52/head:COC-92-changed-3-files会报non-fast-forward错误? 先拆解下你这条命令的作用:它试图把GitHub上PR#52的最新代码拉取到本地名为COC-92-changed-3-files的分支里。出现! [rejected] ... (non-fast-forward)错误,核心原因是本地分支和远程PR分支的提交历史无法直接快进合并,具体分这几种情况:
本地分支已有独立提交
你重新克隆项目后,可能已经在本地的COC-92-changed-3-files分支上做了新的提交,而远程PR#52的分支也有了更新(比如你后续又往PR对应的分支push了代码,或者维护者给PR做了修改)。这时候两个分支的提交历史分叉了,Git没办法自动完成“快进”合并——因为快进要求本地分支的所有提交都包含在远程分支的历史里,现在两边各有新内容,自然会被拒绝。本地分支状态与PR分支差异过大
比如你误修改了PR分支里的文件,或者删除了PR中存在的内容,导致本地分支的当前状态和远程PR分支的head状态完全不兼容,没有共同的提交基础,Git无法直接合并。PR分支已更新但本地分支未同步
提交PR后,如果你又往PR对应的远程分支(比如你fork仓库里的源分支)推送了新的commit,远程PR的head指针已经向前移动了,但你本地的COC-92-changed-3-files分支还是克隆时的旧状态,这时候直接拉取就会因为历史不连续触发non-fast-forward错误。
简单的解决办法
如果本地分支没有需要保留的修改,最直接的方式是删除本地分支后重新拉取:
# 删除本地分支 git branch -D COC-92-changed-3-files # 重新拉取PR代码到本地分支 git pull origin pull/52/head:COC-92-changed-3-files
如果本地有需要保留的修改,可以先暂存修改,再强制合并(注意合并后可能需要手动解决冲突):
# 暂存本地未提交的修改 git stash # 允许合并无关联历史的分支 git pull origin pull/52/head:COC-92-changed-3-files --allow-unrelated-histories # 恢复暂存的修改 git stash pop
内容的提问来源于stack exchange,提问作者Reda Mousawi

