出现 Git pull 报错 error: Your local changes 时,必须先提交或暂存本地修改才能继续拉取。直接强制拉取会导致本地未提交代码丢失,建议优先使用 stash 或 commit 处理。
先说结论:该报错是 Git 的保护机制,阻止远程更新覆盖本地未提交的工作区修改。
- 先确认修改内容:使用 git status 查看具体被修改的文件列表。
- 先处理暂存或提交:根据代码重要性选择 git stash 暂存或 git commit 提交。
- 再验证拉取结果:执行 git pull 后检查 git status 确保工作区干净。
命令速用版
如果希望保留本地修改但暂时不提交,使用 stash 命令序列最快:
git stash
git pull
git stash pop如果本地修改已完成且需要保留历史,使用 commit 命令序列:
git add .
git commit -m "保存本地修改"
git pull为什么会这样
Git 拒绝拉取是因为工作区存在未提交的更改,合并操作可能覆盖这些更改。
Git 的 merge 或 pull 操作要求工作树(working tree)在涉及冲突文件时处于干净状态,以防止数据丢失。当远程分支的更新与本地未提交修改涉及同一文件时,Git 无法自动决定保留哪个版本,因此报错停止。
分步处理
第一步:检查本地状态
git status确认哪些文件被修改,判断是否需要保留。
第二步:选择处理策略
策略 A:保留修改但不提交(推荐临时切换场景)
git stash save "临时保存"策略 B:保留修改并提交(推荐正式开发场景)
git add .
git commit -m "feat: 完成本地功能"策略 C:放弃本地修改(风险高,仅确认无用时使用)
git checkout -- .
git clean -fd第三步:执行拉取
git pull第四步:恢复暂存(仅策略 A 需要)
git stash pop怎么验证是否生效
执行 git status 查看输出。
生效标志:显示 working tree clean 或仅显示刚刚提交的历史记录,没有红色或绿色的未暂存/已暂存文件提示。
如果执行了 stash pop,需检查是否有冲突提示,如有冲突需手动解决后再次提交。
常见坑
- git stash 默认不暂存未跟踪文件(untracked files),新创建的文件拉取后可能丢失,需加 -u 参数。
- git stash pop 可能产生冲突,冲突解决前无法继续提交。
- git reset `--hard` 会永久删除本地修改,操作前务必确认备份。
常见问题
能不能强制 git pull 覆盖本地修改?
可以但不推荐。使用 git reset `--hard` origin/branch 会永久删除本地未提交代码,仅适用于确认本地代码完全无用的场景。
git stash 后拉取失败怎么办?
检查远程分支是否存在或权限是否正确,stash 仅处理本地工作区,不影响远程连接问题。
未跟踪文件为什么会报错?
默认 git stash 不处理未跟踪文件,拉取时如果远程有同名文件会冲突,建议使用 git stash -u 暂存所有文件。
参考来源
- Git SCM Documentation, "Git Stash", https://git-scm.com/docs/git-stash
- Git SCM Documentation, "git-pull", https://git-scm.com/docs/git-pull