git cherry pick是否与git show+;git申请?

git cherry pick是否与git show+;git申请?,git,git-cherry-pick,Git,Git Cherry Pick,会是这样吗 git cherry-pick <rev> git樱桃采摘 事实上与 git show <rev> | git apply -3 - git show | git apply-3- 因为运行其中任何一个都会给我带来完全相同的结果,如果我知道它们确实是等效的,我可以更好地理解GIT的樱桃采摘是如何工作的,因为它并不总是给我预期的结果,但这可能是因为无法应用唯一的更改,cherry pick会退回到三方合并(这是-3在第二个命令中所做的),这可以解释意外

会是这样吗

git cherry-pick <rev>
git樱桃采摘
事实上与

git show <rev> | git apply -3 -
git show | git apply-3-


因为运行其中任何一个都会给我带来完全相同的结果,如果我知道它们确实是等效的,我可以更好地理解GIT的樱桃采摘是如何工作的,因为它并不总是给我预期的结果,但这可能是因为无法应用唯一的更改,cherry pick会退回到三方合并(这是
-3
在第二个命令中所做的),这可以解释意外的结果。

从技术上讲,git cherry pick的工作方式类似于git合并,而不是查找“两个分支上都存在的最佳修订版”要检查差异并将其合并,合并逻辑的“通用修订版”将被迫成为您选择的修订版的父版本。

从技术上讲,git cherry pick的工作方式类似于git合并,而不是寻找“两个分支上都存在的最佳修订版”“为了检查差异并合并它们,合并逻辑的“通用修订版”被强制为您正在挑选的修订版的父版本。

此外,这是正确的,我对它投了更高的票,还有许多其他琐碎的细节,包括关于二进制文件的细节。”(
git show
需要
--binary
来生成一个二进制补丁),并且您可能还需要
--full index
,在一些罕见的情况下,缩写的
索引:
行不足。1

当然,还有,
git apply
(带或不带
-3
)不介意脏索引和工作树,而
git cherry pick
需要干净的索引和工作树,除非添加
-n
。如果省略
-n
git cherry pick
继续进行提交,而
git apply
永远不会这样做

尽管如此,是的,在正常情况下,这两者在功能上应该是等效的


1要做到这一点,blob哈希在缩写时必须是非唯一的。这在Git版本1.7.2中是自动更正的,但如果您使用
core.abbrev
或命令行标志强制使用特定的缩写长度,您仍然可以获得非唯一的哈希缩写。添加
--full index
可确保得到独一无二的

(如果要长期保存差异,请向存储库中添加一组新对象,然后尝试
git apply-3
diff,那么以前不含糊的缩写
索引:
行现在可能变得含糊不清。)

此外,这是正确的,我对它投了更高的票,还有一些其他琐碎的细节,包括关于二进制文件(
git show
需要
--binary
来生成二进制补丁)以及您可能还需要
--full index
,在一些罕见的情况下,缩写的
索引:
行不足。1

当然,还有,
git apply
(带或不带
-3
)不介意脏索引和工作树,而
git cherry pick
需要干净的索引和工作树,除非添加
-n
。如果省略
-n
git cherry pick
继续进行提交,而
git apply
永远不会这样做

尽管如此,是的,在正常情况下,这两者在功能上应该是等效的


1要做到这一点,blob哈希在缩写时必须是非唯一的。这在Git版本1.7.2中是自动更正的,但如果您使用
core.abbrev
或命令行标志强制使用特定的缩写长度,您仍然可以获得非唯一的哈希缩写。添加
--full index
可确保得到独一无二的


(如果要长期保存一个差异,请向存储库中添加一堆新对象,然后尝试
git apply-3
diff,那么缩写的
Index:
行可能会变得模糊。)

现在我想知道,“意外结果”是什么你从cherry pick中得到了什么?因为我个人认为cherry pick是git中可用的最好的工具之一。好吧,当我cherry pick
rev30
时,我希望在结果中只找到
rev30
rev29
之间的变化,但我经常会发现
rev30
rev29
没有触及的行aybe是通过
rev20
添加的,因此它们完全不相关,仍然在cherry pick结果中,这表明合并失败。这不是我所期望的。我期望两次Rev之间的更改会被添加,而不会在这两次Rev之间更改任何内容。这是公开的吗,以便我们可以尝试因为,如你所说,如果你选择rev30,你应该在rev29和rev30之间进行更改,如果rev29是rev30的唯一直接父级。现在我想知道,“意外结果”是什么你从cherry pick中得到了什么?因为我个人认为cherry pick是git中可用的最好的工具之一。好吧,当我cherry pick
rev30
时,我希望在结果中只找到
rev30
rev29
之间的变化,但我经常会发现
rev30
rev29
没有触及的行aybe是通过
rev20
添加的,因此它们完全不相关,仍然在cherry pick结果中,这表明合并失败。这不是我所期望的。我期望两次Rev之间的更改会被添加,而不会在这两次Rev之间更改任何内容。这是公开的吗,以便我们可以尝试因为,正如你所说,如果你选择rev30,那么如果rev29是rev30的唯一直接父版本,那么你应该在rev29和rev30之间进行更改