樱桃采摘
F' = (F-B) + Z 对吗?
不,这也会引入 C、D 和 E 中引入的更改。
git-cherry-pick 通过隔离提交中的唯一更改来进行挑选(即,在此示例中为 FE,忽略包括合并基础在内的其他祖先),并将它们应用于目标.
这不是通过补丁应用程序完成的,而是通过使用三向合并算法 - 要被挑选的提交的父级将用作共同祖先,要被挑选的提交将是一侧的合并,以目标为另一边。其结果是包含在精心挑选的提交和目标中的更改。
例如,如果 E 是要挑选的提交的父级,其内容(作为共同祖先)是:
Line 1
Line 2
Line 3
Line 4
Line 5
例如,如果 F 是要挑选的提交,其内容是:
Line 1
Line 2
Line Three
Line 4
Line 5
而樱桃挑选Z的目标是:
LINE 1
Line 2
Line 3
Line 4
Line 5!
那么三路合并的结果是(带有关于每行来自哪里的注释):
LINE 1
Line 2
Line Three
Line 4
Line 5!
还原
D' = G - D 对吗?
是的,粗略地说。 D 独有的更改已从 G 中删除。与git-cherry-pick 一样,git-revert 是使用三向合并实现的,虽然这次将要还原的提交视为共同祖先,一侧是当前提交,另一侧是要还原的父提交。
这意味着当要恢复的提交与当前提交之间的行相同时,将选择来自其父级的行。
如果是D的内容,则revert的提交是作为共同祖先,其内容是:
Line 1
Line 2
Line THREE
Line 4
Line FIVE
C(D的父级)的内容是:
Line 1
Line 2
Line 3
Line 4
Line 5
而G的内容又做了进一步的改动,其内容为:
Line One
Line 2
Line THREE
Line 4
Line FIVE
那么三路合并的结果会是:
Line One
Line 2
Line 3
Line 4
Line 5
这是在父 C 和目标 G 中取唯一行的结果。
合并提交
正如torek 所指出的(如下),由于这些机制都涉及使用父提交,因此当有多个父提交时,这些机制就会崩溃。 (即,有问题的提交是一个合并,并且有多个父级。)在这种情况下,您需要指定要考虑的 git 哪个 父级(使用-m 标志)。
冲突
当然,这两种机制中的任何一种都可能导致冲突。例如,如果当前的冲突进一步发生了变化,那么您将不得不解决冲突。例如,如果在 revert 示例(上面)中,后续提交也更改了第 5 行,那么 G 实际上是:
Line One
Line 2
Line THREE
Line 4
LINE FIVE!
那么就会有冲突。工作目录(合并文件)将是:
Line One
Line 2
Line 3
Line 4
<<<<<<<
LINE FIVE!
=======
Line 5
>>>>>>>
您需要决定是要原始更改 (Line 5) 还是最新更改 (LINE FIVE!)。