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

时间:2016-02-01 05:20:14

标签: git git-cherry-pick

场景:具有完全断开的历史记录的存储库。例如。来自不同的遥控器,没有共同的git历史。 (这通常发生在使用git子树的场景中。)

是否有可能在这两个提交之间挑选差异,即使它们没有共同的历史? (并且主动提交与这两者中的任何一个都没有共同的历史记录)

我尝试了这个(进入带有-X subtree=sub/dir选项的子目录):

git cherry-pick -X subtree=vendor/package aaa/aaa..bbb/bbb

没有子树,这会更简单:

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,但不显示。

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

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

2 个答案:

答案 0 :(得分:3)

由于挑选采用差异,因此create a patch and apply it更简单:

git checkout aaa/aaa
git cherry-pick -n bbb/bbb
git diff --cached > my.patch

然后检查您的常规分支和git apply my.patch

这需要提交“bbb/bbb”,将其与其直接祖先进行比较,然后在“aaa/aaa”之上应用该差异:可能会出现冲突。
测试-X subtree=vendor/package是否有助于子树。

答案 1 :(得分:3)

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

  

创建补丁并将其应用起来会更简单:

然而,这可以通过一个简单的单线程来完成(我试过这个,它适用于我):

git diff aaa/aaa bbb/bbb | git apply --directory=vendor/package

或者在非子树场景中:

git diff aaa/aaa bbb/bbb | git apply

无需git checkout,git cherry-pick或创建本地文件 然后你仍然需要提交这些东西,显然......

以下是如何在不添加和/或获取任何子树遥控器的情况下执行此操作。相反,您可以将软件包存储库克隆到主项目存储库中的单独目录中。

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

我理解它的方式,这仍然大致相当于通常的git subtree工作流程。我的意思是,主要项目的git历史将是相同的。如果我错了,请纠正我。