2

(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 会这样说:

警告:SHA-1 丢失或不是以下行中的提交:

有趣的是,效果或多或少是我想要的,它停下来,我可以做事。但我确信这不是预期的方式。

4

2 回答 2

4

根据某些情况,您有一个、两个或三个选项。

第一个选项

插入

exec false

或其缩写形式

x false

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

第二种选择

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

break

或其缩写形式

b

在你想停下来的地方。引入此命令的目的正是您所要求的。

第三个选项

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

于 2018-11-14T13:05:49.167 回答
1

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

于 2018-11-14T12:16:52.417 回答