“ --abort”和“ --quit”作为“ cherry-pick”的音序器子命令有什么区别?

时间:2019-03-30 13:10:01

标签: git git-cherry-pick

根据doc,在cherry-pick的三个音序器子命令中,有两个对我来说很奇怪:

--quit
  

忘记当前正在进行的操作。樱桃拾取或还原失败后,可用于清除音序器状态。

--abort
  

取消操作并返回到先序状态。


到目前为止,我一直使用--abort,效果很好。 --quit不同/更可取的用例是什么?

2 个答案:

答案 0 :(得分:3)

如果您还记得git rebasegit cherry-pick个操作的序列, 1 加上开始和结束时的几个有用的头,则更有意义。

假设您有以下一系列提交:

...--o--*--...--o   <-- mainline
         \
          A--B--C   <-- feature

您想使featuremainline保持最新,所以您:

git checkout feature
git rebase mainline

Git首先枚举featureCBA*,...)可到达的提交,以及mainline(未命名,...,*,...)。它从mainline set 2 中减去feature集,并使用相反的拓扑顺序,因此它现在具有哈希ID AB,和C列在Git称为 sequencer 的内容中。 (定序器还记录操作,在这种情况下为rebase / cherry-pick。定序器还用于多个还原。定序器可以中途停止,然后用--continue恢复。这就是为什么它需要知道的原因操作:我们是继续进行选择,还原还是变基?)

然后,Git在HEAD尖端的提交处分离mainline,并通过定序器运行op,无论它是什么。由于op是“ rebase”,因此音序器的每个步骤都是一个简单的一次提交的选择:

(with)

...--o--*--...--o   <-- mainline, HEAD
         \
          A--B--C   <-- feature

(execute git cherry-pick A to produce)

                  A'   <-- HEAD
                 /
...--o--*--...--o   <-- mainline
         \
          A--B--C   <-- feature

这可能会因合并​​冲突而失败。如果是这样,定序器将暂停,从而使索引和工作树中出现一堆合并冲突。您可以修复它们并继续执行音序器(如果需要,A'会自动使您生成A',或者选择两种停止方式之一“中止”)或“退出”。如果您恢复工作(或一切顺利),我们将继续(尝试)选择B

                  A'-B'   <-- HEAD
                 /
...--o--*--...--o   <-- mainline
         \
          A--B--C   <-- feature

假设这也成功了,我们继续尝试挑选C,但此尝试失败。定序器停止运行,使您的索引和工作树变得一团糟,具有上面我们看到的同一张图:A'B'存在,但C'不存在。

比方说,我们决定停止:完成C的挑选工作目前太难了,我们需要退后一步,然后做点其他事情。现在,您有两个选择,中止退出

如果您选择--abort,Git会将您的HEAD重新附加到feature,给出:

...--o--*--...--o   <-- mainline
         \
          A--B--C   <-- feature (HEAD)

A'B'在哪里?好吧,如果您知道自己在做什么,则可以将它们从reflog中删除,或者您已经聪明地将分支或标签名称附加到B' 之前选择--abort 。但是,如果您选择--quit,Git会在不移动HEAD 的情况下终止变基,因此您最终会得到:

                  A'-B'   <-- HEAD
                 /
...--o--*--...--o   <-- mainline
         \
          A--B--C   <-- feature

但干净的索引和工作树。因此,您没有足够聪明,无法在--quit 之前附加分支名称​​。

基本上就是全部。 :-)但是在经历了长时间的,令人沮丧的冲突后,又出现了很多冲突,在这里您想保存到目前为止所取得的成就,并返回到非基础工作,然后再回到基础上后来,“退出”变体以某种方式让人感到更加满足。

(我认为这里真正缺少的是保存顺控程序状态的其余部分并在以后还原的选项。但是,顺控程序状态是每个工作树的,因此,如果您有正在进行的变基任务并且必须中断它对于优先级较高的任务,您可以为优先级较高的任务添加一个工作树,通过Git 2.15添加的工作树中的各种bug都不足以激发信心,但现在看来它们的表现还不错。 -tree还会覆盖其他较大的缺失部分,这是一种保存进行中的冲突合并并稍后恢复的功能。)


1 ,但是请注意,旧式的非交互式git-rebase--am仍使用git format-patchgit am。在某些情况下,此过程不适用于重命名的文件,并且无法复制“不做任何更改”的提交,但是可以更快地运行 。在大多数情况下,尽管底层机制发生了变化,但这种样式和cherry-pick样式都应产生相同的结果,尤其是由于cherry-pick变体 defaults 不会复制“不做任何更改”的提交

2 rebase还减去mainline集中存在的所有提交,并且与git patch-id集中的所有提交相同的feature提交,并且当然,默认情况下,它会减去所有合并。

答案 1 :(得分:2)

--abort将带您回到开始进行樱桃拾取操作之前的位置,而--quit将退出该操作并保持您当前使用的修订版本。除了您想在无法自动选择樱桃的修订版本后想要往另一个方向走外,我想不出一个用例,这就是为什么樱桃选择首先停止的原因,对吧?