Git切换分支执行硬重置后如何恢复原分支未提交更改
Git跨分支操作未提交改动防丢与恢复方案
首先明确Git的基础行为:未被提交到版本库的改动(未暂存/已暂存未提交)不会绑定当前分支,切分支时会直接跟随工作区跨分支移动,你遇到的风险本质就是带着未隔离的branch1改动切到branch2后,执行硬重置把混在工作区的改动清掉了。
事前操作:执行你列的4步前怎么保证不丢改动
不要带着未提交的改动跨分支操作,两种可靠方案选一个就行:
- 最优时机是在branch1上切新分支前就处理
- 临时存储用stash:执行
git stash push -m "branch1临时改动",工作区清空后再切branch2做任意操作(包括git reset --hard都不会影响stash内容),后续切回branch1执行git stash pop就能完整恢复改动。 - 怕stash忘的话就做临时提交:在branch1上把所有改动提交为临时commit,后续需要调整时执行
git reset --soft HEAD^就能把提交内容退回工作区,只要commit存在于分支历史里,硬重置也不会删掉这部分内容。
- 临时存储用stash:执行
- 如果你已经切到branch2,还没做提交、没执行硬重置,在branch2上执行
git stash也能把跨分支带过来的改动存住,但这时候如果你已经在branch2改了新内容,stash会把branch1的旧改动和branch2的新改动混存,后续恢复时容易出冲突,不推荐拖到这一步才处理。
事后恢复:已经做完4步操作后怎么找回丢失的改动
执行完git reset --hard不代表改动完全没了,按下面的顺序排查:
- 先查提交记录
你在branch2上曾经提交过部分文件,如果这些提交里包含了原branch1的改动内容,直接执行git reflog找到branch2上那次部分提交的哈希值,切回branch1后执行git checkout <提交哈希> -- 目标文件路径,就能把对应文件的改动恢复到当前工作区。 - 找悬空对象
如果原branch1的改动从来没被add、没进过任何提交,git reset --hard清掉的工作区内容会被作为悬空blob存在Git对象库中,默认保留30天:- 立刻停止对当前仓库的其他写操作(避免新内容覆盖旧对象),执行
git fsck --lost-found,命令执行完后所有悬空的文件内容会被放到.git/lost-found/other/目录下 - 逐个查看该目录下以哈希命名的文件,匹配到你之前写的改动后,复制到工作区对应路径即可恢复。
注意:如果你执行硬重置后跑过
git gc手动清理仓库,或者间隔时间超过30天,这部分悬空对象会被永久删除,无法恢复。 - 立刻停止对当前仓库的其他写操作(避免新内容覆盖旧对象),执行
关键提醒
git reset --hard属于高危操作,执行前必须确认工作区、暂存区没有需要留存的未提交内容;跨分支切换前如果工作区不干净,优先用stash或者临时提交隔离改动,不要带着未提交的内容跨分支操作,很容易出现改动混淆、误删的问题。
内容的提问来源于stack exchange,提问作者Artorias2718
相关产品推荐
相关产品推荐

