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

时间:2016-09-11 13:02:03

标签: git

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

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

2 个答案:

答案 0 :(得分:3)

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

cd <path_A>
git checkout <branch_A>
git fetch <path_B> <ref_that_contains_commitB>
git cherry-pick <commitB>

如果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>

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

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>

如果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>

在某些特定情况下,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'

OR

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>

答案 1 :(得分:0)

我目前的最佳解决方案是:

git -C ../UpstreamRepo show 1234abcd|sed '1d; 2s/^Author/From/'|git am -

管道中的sed有两个原因:首先,git show将提交哈希放在第一行,git am对象为;其次,Author:无法将第二行的git am识别为作者标记。所以这有点难看。

所有常见的git show子命令都可用,包括将其限制为特定文件,并使用与分支相关的提交命名而不是抓取特定的哈希值。