git cherry在没有共同历史的提交之间选择差异?

git cherry在没有共同历史的提交之间选择差异?,git,git-cherry-pick,Git,Git Cherry Pick,场景:具有完全断开连接的历史片段的存储库。例如,来自没有共同git历史记录的不同远程设备。(这通常发生在具有git子树的场景中。) 即使这两个提交没有共同的历史记录,也有可能挑出它们之间的区别吗?(并且主动提交与这两种提交都没有共同的历史记录) 我尝试了这一点(在带有-X subtree=sub/dir选项的子目录中): 如果没有子树,这会更简单: git cherry-pick aaa/aaa..bbb/bbb 其中aaa/aaa和bbb/bbb是具有断开连接的历史记录的两个提交 不幸的是,

场景:具有完全断开连接的历史片段的存储库。例如,来自没有共同git历史记录的不同远程设备。(这通常发生在具有git子树的场景中。)

即使这两个提交没有共同的历史记录,也有可能挑出它们之间的区别吗?(并且主动提交与这两种提交都没有共同的历史记录)

我尝试了这一点(在带有
-X subtree=sub/dir
选项的子目录中):

如果没有子树,这会更简单:

git cherry-pick aaa/aaa..bbb/bbb
其中aaa/aaa和bbb/bbb是具有断开连接的历史记录的两个提交

不幸的是,这不起作用:aaa/aaa..bbb/bbb不被解读为差异,而是其他东西

同样的情况也可以用
git show aaa/aaa..bbb/bbb
显示,这与
git diff aaa/aaa bbb/bbb
有很大不同。例如,如果两者都有相同的文件,那么git diff将为空,但git show a..b将只显示b,而不显示a


注意:我的个人用例具有子树背景。我提到这一点是为了避免人为的用例,人们通常会开始争论用例的有效性,而不是实际问题


理想的答案是先解决一般情况,然后再解决子树情况。

因为樱桃采摘应用了差异,所以更简单的方法是:

然后签出您的常规分支并
git应用my.patch

这需要提交“
bbb/bbb
”,将其与其直接祖先进行比较,然后在“
aaa/aaa
”之上应用该差异:可能会发生冲突。

测试在子树的情况下,
-X subtree=vendor/package
是否有帮助。

@VonC指向了一个好的方向。此想法的信用和+1

创建修补程序并应用它会更简单:

但是,这可以通过一个简单的单行程序来完成(我尝试过这个,它对我很有效):

或者在非子树场景中:

git diff aaa/aaa bbb/bbb | git apply
无需git签出、git cherry pick或创建本地文件。
很明显,你仍然需要提交这些东西

下面是如何做到这一点,而不添加和/或获取任何子树远程。相反,您可以将包存储库克隆到主项目repo之外的单独目录中

git --git-dir="/path/to/package/repo/.git" diff aaa bbb | git apply --directory=vendor/package

按照我的理解,这仍然基本上等同于通常的
git子树
工作流程。我的意思是,主要项目的git历史将是相同的。如果我错了,请纠正我。

git apply是个好主意!但我不确定您的命令是否能做到承诺的效果。我看到樱桃选择的问题是,它只会选择最后一次提交,而不会选择从aaa/aaa到bbb/bbb的整个提交范围(这一点并不存在)。当然,git diff可能更直接(我在diff和樱桃选择之间犹豫)+1.
git diff aaa/aaa bbb/bbb | git apply --directory=vendor/package
git diff aaa/aaa bbb/bbb | git apply
git --git-dir="/path/to/package/repo/.git" diff aaa bbb | git apply --directory=vendor/package