场景:历史记录完全不相关的存储库。例如。来自没有共同 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,而不显示 a.
注意:我的个人用例是带有子树背景的。我提到这一点是为了避免人为的用例,人们通常开始争论用例的有效性而不是实际问题。
理想的答案将首先解决一般情况,然后解决子树情况。
@VonC 指出了一个好的方向。感谢这个想法并+1。
创建补丁并应用它会更简单:
但是,这可以通过简单的一句话来完成(我尝试过这个,它对我有用):
git diff aaa/aaa bbb/bbb | git apply --directory=vendor/package
或者在非子树场景中:
git diff aaa/aaa bbb/bbb | git apply
无需 git checkout、gitcherry-pick 或创建本地文件。
显然,你仍然需要提交这些东西..
以下是如何在不添加和/或获取任何子树遥控器的情况下执行此操作。相反,您可以将包存储库克隆到主项目存储库外部的单独目录中。
git --git-dir="/path/to/package/repo/.git" diff aaa bbb | git apply --directory=vendor/package
以我的理解,这仍然基本上等同于通常的
git subtree
工作流程。我的意思是,主项目的 git 历史记录将是相同的。如果我错了请纠正我。
由于樱桃采摘应用了差异,因此创建补丁并应用它会更简单:
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
在子树的情况下是否有帮助。
gitcherry-pickRevision_Number
然后 git reset --soft origin/HEAD