gitcherry-pick 没有共同历史记录的提交之间的差异?

问题描述 投票:0回答:3

场景:历史记录完全不相关的存储库。例如。来自没有共同 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.


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

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

git git-cherry-pick
3个回答
9
投票

@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 历史记录将是相同的。如果我错了请纠正我。


4
投票

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

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
在子树的情况下是否有帮助。


0
投票

gitcherry-pickRevision_Number

然后 git reset --soft origin/HEAD

© www.soinside.com 2019 - 2024. All rights reserved.