git pull失败主因是本地工作区/暂存区不干净或分支状态异常,需先用git status诊断,再依未提交修改、分支偏离、远程强推等情形分别用stash、rebase或reset处理。

不能直接提交——Git 拉取失败说明本地分支和远程存在冲突或状态异常,强行 git push 通常会被拒绝,必须先解决拉取问题。
为什么 git pull 会失败?常见原因和对应操作
拉取失败不等于网络断了,更多是本地工作区/暂存区/分支关系出了问题。先用 git status 看当前状态,再针对性处理:
- 本地有未提交的修改(
modified或untracked文件):Git 默认拒绝覆盖,可git stash暂存后git pull,再git stash pop - 本地分支和远程追踪分支不同源(比如手动改过
HEAD或重置过):运行git branch -vv查看追踪关系,必要时用git branch --set-upstream-to=origin/main main修复 - 远程分支已被强制推送(force push),本地记录过期:用
git fetch --all拉取最新引用,再git reset --hard origin/main(注意:这会丢弃本地未提交/未推送的 commit)
拉取失败后想保留当前修改并提交,该走哪条路径?
核心原则:提交只能发生在「干净」或「明确处理过冲突」的分支上。如果 git pull 报 conflict,说明远程有你没有的变更,且和你的修改碰上了同一段代码——此时必须先合并或变基:
- 想保留自己的 commit 顺序,用
git pull --rebase:它会把你的本地 commit 暂存、拉取远程更新、再一个个重放。遇到冲突时停在出问题的 commit,解决后git add . && git rebase --continue - 想保留合并历史,用
git pull(默认--merge):冲突后手动编辑文件,git add标记已解决,再git commit完成合并提交 - 不想处理冲突,又必须立刻交代码?建新分支:
git checkout -b feat/temp-submit,再git add+git commit+git push origin feat/temp-submit。后续再 cherry-pick 或 rebase 到主分支
git push 被拒后显示 non-fast-forward 怎么办?
这是最典型的“拉取失败后硬推”触发的错误,表示远程分支有你没有的 commit。Git 拒绝覆盖,除非你显式加 --force-with-lease(也不推荐乱用):
- 别用
--force,可能覆盖别人刚推的代码 - 先
git fetch origin看远程最新状态,再git log HEAD..origin/main确认缺了哪些 commit - 如果只是自己之前没
pull,就老实用git pull --rebase整理好再推;如果是协作分支,务必确认是否允许 force push - 某些 CI/CD 流程(如 GitHub Protected Branches)会彻底禁用 force push,此时唯一合法路径就是 merge 或 rebase 后正常推送
真正卡住的时候,往往不是命令不会打,而是没看懂 git status 和 git log --oneline --graph --all 输出的分支拓扑。多花 30 秒看清楚 HEAD 指在哪、origin/main 在哪、你的 commit 在哪,比试错五次 push 更快。


















