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

don*_*ote 6 git git-cherry-pick

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

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

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

git cherry-pick -X subtree=vendor/package aaa/aaa..bbb/bbb
Run Code Online (Sandbox Code Playgroud)

没有子树,这会更简单:

git cherry-pick aaa/aaa..bbb/bbb
Run Code Online (Sandbox Code Playgroud)

其中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.


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

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

don*_*ote 7

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

创建补丁并应用它会更简单:

但是,这可以通过一个简单的单线完成(我试过这个,它对我有用):

git diff aaa/aaa bbb/bbb | git apply --directory=vendor/package
Run Code Online (Sandbox Code Playgroud)

或者在非子树场景中:

git diff aaa/aaa bbb/bbb | git apply
Run Code Online (Sandbox Code Playgroud)

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

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

git --git-dir="/path/to/package/repo/.git" diff aaa bbb | git apply --directory=vendor/package
Run Code Online (Sandbox Code Playgroud)

按照我的理解,这一切仍然与通常的git subtree工作流程大致相同。我的意思是,主项目的 git 历史将是相同的。如果我错了纠正我。


Von*_*onC 4

由于樱桃采摘应用了差异,因此创建补丁并应用它会更简单:

git checkout aaa/aaa
git cherry-pick -n bbb/bbb
git diff --cached > my.patch
Run Code Online (Sandbox Code Playgroud)

然后检查您的常规分行并git apply my.patch

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