使用不同的树结构将更改从一个repo合并到另一个repo

Rav*_*rsT 12 git git-merge git-subtree git-branch

我有两个Git repos,foo/master和bar/master:

在foo:

code_root
->dirA
  ->dirB
    -> *some files*
Run Code Online (Sandbox Code Playgroud)

在酒吧:

code_root
  -> *same files as above*
Run Code Online (Sandbox Code Playgroud)

现在有人对*some files*... 进行了更改,如何将这些更改合并到一起*same files as above*

当我说"合并"时,我的意思是我需要提交增量的历史(提交消息,日志哈希等).

joh*_*003 5

您可以将更改拆分为子树级别,然后与其他分支合并:

# from your foo project
git subtree split --prefix=dirA/dirB/ --branch=temp-branch [--onto=<onto-sub-note1>] [<commit-sub-note2>]
Run Code Online (Sandbox Code Playgroud)

在子笔记1上:似乎自从bar项目存在以来,您必须在某个时间点复制它,并将其作为新库启动,在这种情况下,如果您希望在此之后进行所有更改,那么d 引入更改时指定此提交ID.

提交子注释2:然后,您需要指定在第一个位置复制子项目时使用的提交ID,这样您才能获得此后的更改,以便合并到您已经拥有的bar副本中(这将保持你错过的历史).使用这样的语法将commit id本身包含在最新版本中:0abc210^..

你也可以用--rejoin做一个提交回你项目,这将使它更容易在以后更改推,如果你想继续发展从withing您FOO项目.提交回foo是有点无意义的,除了帮助子树命令库它将来更容易拆分.

运行split命令后,您将位于foo的一个分支中,该分支只包含这些文件.从那里,你可以做一个正常的合并与项目或启动新项目和合并成(因为它可能没有正确的历史).在尝试进行合并之前,您可能想要重新分配到分歧点或其他东西.

编辑:这里也是git子树命令参考