执行git pull origin production拉取到分支后本地变更丢失问题咨询
问题原因
git pull 是 git fetch + git merge(默认配置)或 git fetch + git rebase(配置了pull.rebase = true时)的组合命令,本次问题触发原因属于以下两类之一:
- 本地分支开启快进合并(fast-forward)且远程production分支提交进度完全覆盖本地
image_carousel分支的提交基线,git直接将本地分支指针移动到production分支最新提交,未提交的本地变更若和拉取代码无冲突会被静默合并,视觉上表现为原变更消失;若存在冲突时你选择了以远程代码为准的冲突解决策略,会直接覆盖本地变更。 - 本地变更未执行过
git add或git commit操作,属于工作区未追踪变更,合并时若和远程production分支同路径文件完全冲突,git会直接用远程文件覆盖本地未提交内容,这部分变更不会录入git提交记录,容易出现丢失。
恢复已丢失的本地变更
- 若之前的本地变更已经执行过
git commit,执行git reflog查看操作记录,找到pull操作之前的提交哈希值,执行git reset --hard <提交哈希>即可恢复到pull之前的分支状态。 - 若之前的变更只执行过
git add未提交,执行git fsck --lost-found扫描git暂存区的悬空对象,对应变更的blob文件会保存在.git/lost-found/other目录下,手动提取恢复即可。 - 若之前的变更完全没执行过git add/commit,属于工作区未追踪文件,git本身没有留存记录,可通过编辑器的本地历史记录、系统还原点等第三方方式恢复。
后续pull操作保留本地代码的正确流程
需要在持有本地变更的分支拉取其他分支代码时,按以下步骤操作即可避免变更丢失:
- 暂存本地所有变更:
git add . git stash push -m "临时存储image_carousel本地变更"
- 执行pull操作拉取远程production分支:
git pull origin production
- 拉取完成后恢复之前暂存的本地变更:
git stash pop
如果恢复时出现代码冲突,手动解决冲突后正常提交即可。
内容的提问来源于stack exchange,提问作者kbc
相关产品推荐
相关产品推荐

