我可以恢复交互式变基期间丢失的提交吗?

bot*_*bot 3 git github gitlab git-interactive-rebase

所以我遇到了这种奇怪的情况。

我正在对 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'.
Run Code Online (Sandbox Code Playgroud)

我决定运行git rebase --edit-todo,当我这样做时,只出现了最后一次提交。我将其从 更改为squashpick然后运行git rebase --continue,但现在看来我试图压缩的其他 3 个提交已经不存在了。
所以我早上的工作似乎失败了。
一定有办法恢复这些,对吗?
我该怎么做?

mat*_*att 7

这是吉特。没有什么是永远不会失去的。整个变基是不可撤销的!

只需用于git reflog定位您在变基之前所在的位置即可。很明显它是哪一个,因为第一个将描述变基。

现在只需硬重置该提交即可。很快,您已经撤消了变基。

现在只需下次正确执行变基即可。


例子。我从这种情况开始:

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

我交互式变基,清除yyxx.

% git rebase -i main
Successfully rebased and updated refs/heads/what.
Run Code Online (Sandbox Code Playgroud)

现在的情况是:

* e2d37cd (HEAD -> what) zz
* 45ebca0 (origin/main, origin/HEAD, main) zzz
Run Code Online (Sandbox Code Playgroud)

但这不是我想要做的!xxyy消失了!哦,注意!

可是等等。没问题。我们可以撤消。首先,查看转发日志:

% 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]
...
Run Code Online (Sandbox Code Playgroud)

好的,撤消:

% git reset --hard HEAD@{3}
Run Code Online (Sandbox Code Playgroud)

全部修好了!我又回到了变基之前的位置:

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

派对!