情况:在其中一个中间的命令行上对三个编辑进行交互式 rebase,我突然意识到我把提交倒错了地方。
当屏幕类似于:
# This is a combination of 2 commits.
# The first commit's message is:
commit 1
# This is the 2nd commit message:
commit 2
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# HEAD detached at 299f1c3
# You are currently editing a commit while rebasing branch 'master' on '2ece15c'.
#
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: aaaaaaaaaaa.txt
# modified: bbbbbbbbbbb.txt
# new file: ccccccccccc.txt
#
~
~
~
~
我看到这个新文件必须合并到一个完全不同的提交中。
我解决了我的问题......我打开了一个新控制台,询问git status(我确保我准时rebase)并要求这样做git rebase --abort,之后我vi没有保存在第一个控制台中就退出了(git运行它无法应用提交,因为需要一个稍微不同的提交 SHA ID),然后从中删除临时文件vi(我不记得它叫什么,它似乎与交换有关)。轻微的时间损失(我不得不再次进行第一次手术)被忽略了。但是,如果我一次对故事进行十几个编辑,并且在我注意到的时候已经完成了五个呢?
因此,现在我在想是否有更简单、最重要的常规方法。我可以想到比我使用的方法更多的方法。例如,有可能到达 end rebase,然后在阅读后reflog回滚到 rebase 之前的时刻。或者转到 rebase 操作的末尾,然后开始一个新的 - 将错误合并的提交分解为两个(以及一个更多 - 在必要时合并)。无论如何,这些都是我对服务器的未提交更改,我正准备在发送之前对其进行梳理。
在这种情况下,最好的选择是什么?
在所有情况下最重要的事情:始终有备份。它可以是
originGitHub 上或 GitHub 上某处的推送,也可以是保留原始提交以防万一的单独分支:特别是,如果您尝试此答案中的建议,最好在单独的线程中进行:
例如,让我们删除一个提交:
如您所见,我们删除了一个提交:
但现在我们意识到我们错了,我们想把一切都原样归还。最简单的方法是回到原来的分支,删除并创建一个临时分支,然后重新开始。
如果没有备份,或者困难并不可怕,该命令
git reflog将显示哪些提交曾经是顶级的(即它们被 指向HEAD):在这个计算中,它指向了它指向后三步
HEAD@{3}的地方,也就是说,在我们的例子中,正好在我们开始做 rebase 之前。HEAD当然,您不会计算步骤,而只是查看记录的记录是哪个命令完成的时刻,并在下面的点停止。如您所见,我们已将分支返回到与所有操作之前相同的状态和相同的提交。没有什么复杂或可怕的。
如果您在编辑文件时意识到自己做错了什么怎么办?没问题!只要写一些 Git 不理解的东西,执行就会中止,并建议在一个命令中恢复所有内容。
让我们用一个命令回到起点: