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

tak*_*hin 107 git

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

/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Run Code Online (Sandbox Code Playgroud)

如何应用commit提交<some_sha>repo1更改repo2

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

如何做同样但提交范围?

kni*_*ttl 191

您可能希望使用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
Run Code Online (Sandbox Code Playgroud)

或者,在一行中:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,这个解决方案比使用`GIT_ALTERNATE_OBJECT_DIRECTORIES`直接采摘樱桃更容易和更安全(那会破坏我的存储库). (8认同)
  • 如果您只想要最新的提交:`git format-patch HEAD^1` (3认同)
  • 当存在冲突时,它将无法工作,因为它无法在另一个分支上找到提交. (2认同)
  • 将 `--ignore-whitespace` 添加到 `git am` 命令可以解决任何冲突并避免需要执行 3 路合并 (2认同)

wRA*_*RAR 89

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

  • 这实际上是正确的方法. (10认同)
  • 我宁愿说:在第二个回购中执行`git fetch [remote-name],然后在`git cherry-pick [sha1]`. (9认同)
  • 这对我来说也是正确的方式.我只是用它而且对我来说效果很好. (5认同)
  • 这种方法对我很有用,谢谢.由于第二个repo也是本地的,因此在将其添加为远程时只需使用文件URI. (3认同)
  • 在我的情况下,我有一个巨大的远程git存储库的两个克隆(允许并行工作),这意味着它的所有历史记录已经下载并存储在我的HD中两次.如果我还必须将每个添加为另一个的远程,那么将创建相同历史的两个额外副本,并且在我能够"樱桃挑选"之前可能需要在它们之间进行同步.因此即使它可能感觉像是"正确"的方式,但它并不总是最实用的. (2认同)

Jak*_*ski 30

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

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

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

使用现代Git,您可以使用多个修订和修订范围与樱桃挑选.

$(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
Run Code Online (Sandbox Code Playgroud)

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

没有测试过.


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

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

  • 这太棒了 - 你会怎么做一系列的提交?只是sha1 ... sha2? (3认同)

归档时间:

查看次数:

49081 次

最近记录:

9 年,5 月 前