在交互式变基过程中,我能恢复丢失的提交吗?

3
所以我有一个奇怪的情况。
我正在对4个提交进行交互式变基。我试图合并,但是我弄错了顺序,出现了以下错误:
error: cannot 'squash' without a previous commit You can fix this with
'git rebase --edit-todo' and then run 'git rebase --continue'. Or you
can abort the rebase with 'git rebase --abort'.

我决定运行git rebase --edit-todo,当我这样做时,只有最后一次提交出现了。我将它从squash更改为pick,然后运行git rebase --continue,但现在似乎我试图合并的其他3个提交不再存在。
所以我的早上的工作似乎丢失了。
肯定有办法可以恢复它们,对吧?
我该如何做呢?

1
这个回答解决了你的问题吗?撤销 Git rebase - Hasturkun
1
git reflog show the_branch_I_rebased 能够提供帮助。 - j6t
2个回答

7

这是Git。永远不会有丢失的情况发生。整个变基操作都可以撤销!

只需使用git reflog命令定位到变基之前的位置。显然,因为最前面几个条目将描述变基。

现在只需将硬重置到那个提交。完成了,您已经撤消了变基操作。

下次只需要正确执行变基操作即可。


例如:我从这种情况开始:

* 18c9859 (HEAD -> what) zz
* e1af86b yy
* 47853b7 xx
* 45ebca0 (origin/main, origin/HEAD, main) zzz

使用交互式变基,清除 yyxx
% git rebase -i main
Successfully rebased and updated refs/heads/what.

现在的情况是:
* e2d37cd (HEAD -> what) zz
* 45ebca0 (origin/main, origin/HEAD, main) zzz

但这不是我想做的!xxyy都没了!糟糕极了!

但不要担心,我们可以撤消。首先,在reflog中查看:

% git reflog
e2d37cd (HEAD -> what) HEAD@{0}: rebase (finish): returning to refs/heads/what
e2d37cd (HEAD -> what) HEAD@{1}: rebase (pick): zz
45ebca0 (origin/main, origin/HEAD, main) HEAD@{2}: rebase (start): checkout main
18c9859 HEAD@{3}: commit: zz [this is it]
...

好的,撤销:

% git reset --hard HEAD@{3}

问题已经解决了!我现在回到了重新定义之前完全相同的位置:

* 18c9859 (HEAD -> what) zz
* e1af86b yy
* 47853b7 xx
* 45ebca0 (origin/main, origin/HEAD, main) zzz

狂欢吧!


为什么要使用“--hard”?这是必要的吗? - pauljohn32

0

你应该:

git reflog

# Write down the lost commit hash

git cherry-pick <LOST_COMMIT_HASH>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接