Git: 将一个回购中的提交引入的更改应用于另一个回购

本地机器上有 repo1repo2。它们非常相似,但后者是某种其他分支(repo1不再维护)。

/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X

如何将 repo1中的 <some_sha>提交所做的更改应用到 repo2

我需要准备一些补丁,或者有可能做一些 cherry-pick之间的回购协议?

如何做同样的,但提交范围?

64315 次浏览

您可能希望使用 git format-patchgit am将该补丁应用到存储库。

/path/to/1 $ git format-patch sha1^..sha1
/path/to/1 $ cd /path/to/2
/path/to/2 $ git am -3 /path/to/1/0001-…-….patch

或者,用一句话来说:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3

如果将第二个回购作为远程操作添加到第一个(然后是 fetch) ,则可以执行 cherry-pick

作为一个黑客,你可以尝试修改 用于比较 GitTips 页面上两个不同存储库中的提交的配方,比如:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \
git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)

其中 ../repo是另一个存储库的路径。

使用现代 Git,您可以使用 选择的多个修订版本和修订范围。

$(git --git-dir=../repo/.git rev-parse --verify <commit>) 在这里将 <commit>(例如 HEADv0.2master~2,它们是您从中复制的第二个存储库中的值)转换为 SHA-1提交标识符。如果你知道 SHA-1的一个变化,你想选择,这是没有必要的。

不过,注意 Git 可以跳过从源存储库复制对象,因为它不知道替代对象存储库只是临时的,只用于一个操作。您可能需要使用以下方法从第二个存储库复制对象:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f

这会将从第二个存储库借用的对象放入原始存储库中

未经测试。


一个不那么拙劣的解决方案是遵循 编织答案:

  • 转到您想要从中复制提交的第二个存储库,并使用 git format-patch从您想要的提交中生成补丁
  • 可以选择将补丁(0001-* 等)复制到存储库
  • 使用 git am --3way应用补丁

我编写了一个小脚本,用于应用 repo diff 的 diff 输出 Https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0