交互式变基未完成时切换分支,修改内容丢失的问题求助
找回你丢失的修改
别慌,你的修改其实没真丢,只是Git在分支切换时把工作区恢复到了变基前的状态,但你通过commit --amend生成的提交还好好躺在Git的对象数据库里。按下面的步骤操作就能找回来:
1. 确认变基进程是否还在运行
先执行这个命令看看当前状态:
git status
如果输出里有类似interactive rebase in progress; onto xxxxxxx的提示,说明变基还没中断,只是工作区被临时重置了。
2. 定位你修改后的提交
用git reflog查看所有操作记录(包括那些没被分支引用的隐藏提交):
git reflog
在输出里找带有(amend)标记的条目,它对应的哈希值就是你修改后的提交。比如可能会看到这样的行:
abc1234 HEAD@{2}: commit (amend): 你的提交信息
3. 恢复A文件的修改内容
把找到的哈希值(比如上面的abc1234)代入下面的命令,提取出A文件的修改后版本:
git checkout abc1234 -- A
执行完这条命令,A文件就会恢复到你修改后的状态了。
4. 继续完成交互式变基
确认A文件内容没问题后,执行下面的命令完成变基:
git rebase --continue
这样你的修改就会正式合并到foo分支里了。
为啥会出现这个问题?
当你在交互式变基过程中(还没执行git rebase --continue),Git其实是在一个临时的游离HEAD状态下处理提交。此时切换到其他分支,Git会把当前工作区和暂存区重置为目标分支的状态,但变基的进度会保留在.git/rebase目录中。切回foo分支时,Git会回到变基进程,但工作区会被重置为变基开始时的状态,所以你之前的修改看起来“消失”了——但实际上那个修改的提交一直存在,只是没被当前工作区引用而已。
内容的提问来源于stack exchange,提问作者Mikhail




