git 交互式变基:停止而不提交

git interactive rebase: stop without commit

(TLDR) git rebase -i 中是否有一种方法可以在没有提交 ID 的情况下停止编辑? (/TLDR)

更长的版本:

背景

使用 git rebase -i,我得到一个文本编辑器,我可以在其中定义命令列表,每行以 pick COMMIT_ID 开头。

其中一个选项是将"pick COMMIT_ID"替换为"edit COMMIT_ID",这意味着它会在提交后停止让我修改提交,或者做一些手动操作。然后我可以继续 git rebase --continue.

来自选项列表:

#  e, edit = use commit, but stop for amending

问题

我想知道是否有一个选项可以停止编辑,而不选择任何提交。

动机/用例

例如如果我想压缩一系列提交,然后停止进行一些手动操作,我将不得不将 edit + squash 放在相同的提交 id 前面——这是不允许的。

相反,我会这样做:

pick COMMIT_0 Change some colors
pick COMMIT_1 Make it faster
squash COMMIT_2 Fix a typo in previous commit
squash COMMIT_3 Fix another typo in previous commit
edit
pick COMMIT_4 Refactor some things
pick COMMIT_5 Introduce new options

这样的选项也允许在序列中的第一个提交之前停止。

(我本来想说它允许在整个历史的初始提交之前进行编辑,但这不是真的——初始提交永远不是变基序列的一部分)

如果我这样做,git 会这样说:

Warning: the SHA-1 is missing or isn't a commit in the following line:

有趣的是,效果差不多是我想要的,它停止了,我可以做事了。但我确信这不是预期的方式。

我不知道这是否可能。压缩后,您必须进行第二次交互式变基,然后修改提交。

您有一个、两个或三个选项,具体取决于某些情况。

第一个选项

插入

exec false

或其简称

x false

在你想停下来的地方。你可能知道,exec在命令出现的地方运行shell命令;但是如果命令失败退出,git rebase 停止,命令 false 总是失败退出。

第二个选项

如果您使用的是 Git 2.20 或更高版本,您可以插入

break

或其简称

b

在你想停下来的地方。引入此命令正是为了满足您的要求。

第三个选项

edit 而不是 pick 标记要停止的点之前的提交。显然,如果您想在第一次提交之前或 squashfixup 提交之后停止,这将不起作用。