git 挑选一个没有共同历史记录的提交之间的差异



>场景:一个完全断开连接的历史片段的存储库。 例如,来自没有共同 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 显示 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 签出、git 挑选或创建本地文件。
然后你仍然需要提交这些东西,显然。

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

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

以我的理解,这一切仍然基本等同于通常的git subtree工作流程。我的意思是,主项目的 git 历史记录将是相同的。如果我错了,请纠正我。

由于樱桃采摘应用 diff,因此创建一个补丁并应用它会更简单:

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

相关内容

  • 没有找到相关文章

最新更新