git:将一个repo中commit提交的更改应用到另一个repo

时间:2010-09-28 18:49:46

标签: git

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

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

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

我是否需要准备一些补丁,或者是否可以在回购之间做一些cherry-pick

如何做同样但提交范围?

4 个答案:

答案 0 :(得分:180)

您可能希望使用git format-patch,然后使用git 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

答案 1 :(得分:84)

如果您将第二个回购添加为第一个回复(然后是cherry-pick),则可以执行fetch

答案 2 :(得分:29)

作为黑客,您可以尝试修改recipe for comparing commits in two different repositories on GitTips page,即:

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

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

使用现代Git,您可以使用cherry-pick多个修订和修订范围。

$(git --git-dir=../repo/.git rev-parse --verify <commit>) 此处将<commit>(例如HEAD,或v0.2master~2(您复制的第二个存储库中的值)转换为提交的SHA-1标识符。如果您知道要选择的更改的SHA-1,则没有必要。

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

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

这将从第二个存储库借来的那些对象放在原始存储库存储

未经过测试。


一个不太苛刻的解决方案是遵循knittl answer

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

答案 3 :(得分:5)