将补丁从一个 git repo 导入另一个

ros*_*uav 3 git

我有两个共享一些代码的存储库,但不是全部。有时,我需要从一个存储库(上游)中挑选一个提交到另一个(下游)。探索git loggitk提供提交哈希,但我需要一种简单的方法来说“从存储库 ../UpstreamRepo 中获取提交 1234abcd 并在此处应用它”。

在这种特殊情况下,我还希望能够将新提交限制为原始文件中的一个(已知名称)文件。NEWS 等辅助文件在此处不适用,只会导致不必要的合并冲突。这是首选但不是必需的(其他人可能有类似的情况,不需要这样做)。

Elp*_*Kay 5

如果 repos A 和 B 在同一台机器上,或者在可以相互通信的两台机器上。目标是获取 B 的提交之一并将其应用于 A 的分支之一。

cd <path_A>
git checkout <branch_A>
git fetch <path_B> <ref_that_contains_commitB>
git cherry-pick <commitB>
Run Code Online (Sandbox Code Playgroud)

如果 A 和 B 在两台无法直接通信的机器上。这种方法也适用于同一台机器上的 A 和 B。

cd <path_B>
git format-patch <commitB> -1
#a xxx.patch is generated
#move this patch to A's workground.
cd <path_A>
git checkout <branch_A>
git am <path_xxx.patch>
Run Code Online (Sandbox Code Playgroud)

您可能想知道的另一种方法。

cd <path_B>
git bundle create B.bundle <ref_that_contains_commitB>
#B.bundle is generated
#move this bundle to A's workground.
cd <path_A>
git checkout <branch_A>
git fetch <path_B.bundle>
git cherry-pick <commitB>
Run Code Online (Sandbox Code Playgroud)

如果 A 和 B 无法直接通信,但他们都可以访问 repo C,可能在 github 或某些公共服务器中。

cd <path_B>
git push <url_C> <ref_that_contains_commitB>:<ref_in_C>
cd <path_A>
git fetch <url_C> <ref_in_C>
git checkout <branch_A>
git cherry-pick <commitB>
Run Code Online (Sandbox Code Playgroud)

在某些特定情况下,该git cherry-pick部分可能是git rebasegit merge替代。

更新:如果 commitB 更改了某些文件,但您只想要 file_b 的更改,

cd <path_B>
git diff <commitB>^ <commitB> -- <file_b>    >   b.patch
#move b.patch to A's workground
cd <path_A>
git checkout <branch_A>
git apply <path_b.patch>
git add .
git commit -m 'xxx'
Run Code Online (Sandbox Code Playgroud)

或者

cd <path_B>
git format-patch <commitB> -1 -- <file_b>
#xxx.patch is generated
#move xxx.patch to A's workground
cd <path_A>
git checkout <branch_A>
git am <path_b.patch>
Run Code Online (Sandbox Code Playgroud)