我在本地计算机上有repo1
和repo2
。它们非常相似,但后者是某种其他分支(repo1
不再维护)。
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
如何将<some_sha>
中提交repo1
所做的更改应用于repo2
?
我是否需要准备一些补丁,或者是否可以在回购之间做一些cherry-pick
?
如何做同样但提交范围?
答案 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.2
或master~2
(您复制的第二个存储库中的值)转换为提交的SHA-1标识符。如果您知道要选择的更改的SHA-1,则没有必要。
注意然而,Git可以跳过从源存储库复制对象,因为它不知道备用对象存储库只是临时的,用于一个操作。您可能需要使用以下命令从第二个存储库复制对象:
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f
这将从第二个存储库借来的那些对象放在原始存储库存储
中未经过测试。
一个不太苛刻的解决方案是遵循knittl answer:
git format-patch
git am --3way
应用修补程序答案 3 :(得分:5)
我写了一个小脚本来应用repo diff的diff输出 https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0