Git 什么';“--abort”和“--quit”作为“cherry pick”的sequencer子命令有什么不同?
根据,在Git 什么';“--abort”和“--quit”作为“cherry pick”的sequencer子命令有什么不同?,git,git-cherry-pick,Git,Git Cherry Pick,根据,在cherry pick的三个sequencer子命令中,我们有两个,对我来说,奇怪地相似: --quit 忘记当前正在进行的操作。可用于在樱桃拾取或还原失败后清除sequencer状态 取消操作并返回到预排序状态 到目前为止,我一直使用--abort,而且效果很好。如果--quit不同/更可取,那么会出现什么样的用例?--abort会将您带回到您开始cherry pick操作之前的位置,而--quit会退出操作,并保持您当前的版本。我想不出一个用例,除了你在遇到一个无法自动cherr
cherry pick
的三个sequencer子命令中,我们有两个,对我来说,奇怪地相似:
--quit
忘记当前正在进行的操作。可用于在樱桃拾取或还原失败后清除sequencer状态
取消操作并返回到预排序状态
到目前为止,我一直使用
--abort
,而且效果很好。如果--quit
不同/更可取,那么会出现什么样的用例?--abort
会将您带回到您开始cherry pick操作之前的位置,而--quit
会退出操作,并保持您当前的版本。我想不出一个用例,除了你在遇到一个无法自动cherry-pick的修订版后想要改变方向,这就是cherry-pick首先停止的原因,对吗?如果你记得git-rebase
是一系列git-cherry-pick
操作,1加上开头和结尾的几个有用的噱头,它更有意义
假设您有以下一系列提交:
...--o--*--...--o <-- mainline
\
A--B--C <-- feature
Git首先枚举可从功能访问的提交(C
,B
,A
,*
,…)以及可从主线访问的提交(未命名,*
,…)。它从功能
集合2中减去主线
集合,并使用相反的拓扑顺序,这样它现在就有了hash idA
、B
、和C
,列在Git调用sequencer的东西中。(定序器还记录操作,在本例中为重定基/重定基。定序器还用于多次还原。定序器可以中途停止,然后使用--continue
继续。这就是为什么它需要知道操作:我们是继续重定基、重定基还是重定基?)
Git然后在mainline
顶端的提交处分离HEAD
,并通过sequencer运行op,不管它是什么。由于op是“rebase”,sequencer的每个步骤都是一个简单的选择:
(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
假设这也成功了,我们继续尝试挑选C
,但是这次尝试失败了。sequencer停止,在索引和工作树中留下一团混乱,上面的图与我们看到的相同:a'
和B'
存在,但C'
不存在
假设我们决定停下来:完成C
的切磋对于目前来说太难了,我们需要退后一步,做点别的事情。您现在有两个选项,中止或退出
如果选择--abort
,Git会将头部重新连接到功能
,给出:
...--o--*--...--o <-- mainline
\
A--B--C <-- feature (HEAD)
而是一个干净的索引和工作树。因此,您不必非常聪明地在退出之前附加分支名称
这基本上就是它的全部内容。:-)但是在经历了一段长时间的、令人沮丧的、充满冲突的重定基础之后,如果你想保存到目前为止所取得的成果,并在稍后再次回到重定基础之前回到非重定基础的工作中,那么“退出”变体不知何故会感到更满意
(我认为这里真正缺少的是保存sequencer状态的剩余部分并在以后恢复它的选项。然而,sequencer状态是每个工作树的,因此如果您有一个正在进行的重新基址任务,并且必须用一个更高优先级的任务中断它,您可以只为更高优先级的任务添加一个工作树。添加的work-t中的各种错误通过Git 2.15实现的REE并不是那么令人自信,但它们现在确实表现得很好。添加的工作树还掩盖了另一个更大的缺失部分,即保存正在进行的冲突合并并在以后恢复的能力。)
1但是,请注意,旧式的非交互式git-rebase--am
仍然使用git-format-patch
和git-am
。在重命名文件的某些情况下,此过程不起作用,并且无法复制“不做任何更改”提交,但运行得更快。在大多数情况下,尽管底层机制发生了变化,但此样式和cherry pick样式都会给出相同的结果,特别是因为cherry pick变体默认不复制“不做任何更改”的提交
2重基还会减去主线
集合中存在的任何提交,这些提交与功能
集合中的任何提交具有相同的git补丁id
,当然,默认情况下,它会减去所有合并。嗯……我仍然不明白。我必须阅读更多关于整个樱桃拾取过程的详细信息。我想不同之处在于,当有多个提交被选中时。--abort
将撤消您已经合并的任何提交,而--quit
将保留这些提交。这一点现在更清楚了。我想我早就将这些过程视为一种事务。要么一直到令人满意的状态,要么永远回滚这是一个有用但有点幼稚的方法,在管道水平上真正发生了什么。也要感谢eftshit0和chepner!
(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'-B' <-- HEAD
/
...--o--*--...--o <-- mainline
\
A--B--C <-- feature
...--o--*--...--o <-- mainline
\
A--B--C <-- feature (HEAD)
A'-B' <-- HEAD
/
...--o--*--...--o <-- mainline
\
A--B--C <-- feature