git:将一个仓库中的commit提交给另一个仓库

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

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

如何将<some_sha>的commit <some_sha> repo1应用于repo2

我需要准备一些补丁吗,还是可以在回购之间进行一些cherry-pick

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

作为一个黑客,你可以尝试在GitTips页面的两个不同的仓库中修改比较提交的配方 ,即:

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

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

使用现代Git,您可以使用多个版本和修订范围与樱桃select 。

$(git --git-dir=../repo/.git rev-parse --verify <commit>)在这里翻译<commit> (例如HEAD ,或者v0.2或者v0.2 ,是您复制的第二个存储库中的值)转换为提交的SHA-1标识符。 如果你知道你想要select的SHA-1,那就没有必要了。

但是, 注意 Git可以跳过从源存储库复制对象,因为它不知道备用对象存储库只是一个操作。 您可能需要从第二个存储库复制对象:

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

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

没有testing。


一个不那么hacky的解决scheme是遵循knittl的答案 :

  • 转到第二个存储库,您想要复制提交,并使用git format-patch从提交中提交git format-patch
  • 或者,将补丁(0001- *等)复制到存储库
  • 使用git am --3way来应用补丁

你可能想要使用git format-patch ,然后把你的补丁应用到你的版本库。

 /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