git交互式rebase:停止而不提交

时间:2018-11-14 11:48:05

标签: git rebase git-interactive-rebase

(TLDR) git rebase -i中有没有一种方法可以停止编辑而没有提交ID? (/ TLDR)

长版:

背景

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

选项之一是用“ edit COMMIT_ID”替换“ pick 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或不是该提交:

有趣的是,效果或多或少是我想要的,它停止了并且我可以做事。但是我敢肯定,这不是预期的方法。

2 个答案:

答案 0 :(得分:4)

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

第一个选项

插入

exec false

或其缩写

x false

在您要停止的位置。如您所知,exec在执行命令的位置运行shell命令;但是如果命令失败退出,则git rebase停止,并且命令false总是失败退出。

第二个选项

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

break

或其缩写

b

在您要停止的位置。引入此命令是出于您所要的目的。

第三种选择

edit而不是pick标记要停止的位置之前的提交。显然,如果您想在第一次提交之前或在squashfixup提交之后停止,则此方法不起作用。

答案 1 :(得分:1)

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