Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将git存储库与相关分支合并_Git_Merge_Repository_Branch - Fatal编程技术网

如何将git存储库与相关分支合并

如何将git存储库与相关分支合并,git,merge,repository,branch,Git,Merge,Repository,Branch,出于历史原因,我目前有以下项目结构: 第0部分: 主人 分支0 branch1 第1部分: 主人 分支0 branch1 该项目的二进制文件是通过从两个存储库中检出相同日期的提交来构建的,因此我需要例如part0-master(01.04.2013)和part1-master(01.04.2013)。检查不同日期的零件将不起作用 现在,我想将这两个存储库结合到一个存储库中 梳子: 主人 分支0 branch1 其中主控中的提交按提交日期从part0-master和part1-

出于历史原因,我目前有以下项目结构:

  • 第0部分:

    • 主人
    • 分支0
    • branch1
  • 第1部分:

    • 主人
    • 分支0
    • branch1
该项目的二进制文件是通过从两个存储库中检出相同日期的提交来构建的,因此我需要例如part0-master(01.04.2013)和part1-master(01.04.2013)。检查不同日期的零件将不起作用

现在,我想将这两个存储库结合到一个存储库中

  • 梳子:
    • 主人
    • 分支0
    • branch1
其中主控中的提交按提交日期从part0-master和part1-master排序

如果我使用我找到的描述的合并方案,我将获得

第0部分-掌握(一切)+第1部分-掌握(一切)之后


因此,任何提交的签出都不起作用,因为要么我只得到part0(在合并part1之前),要么我得到的是最新的part0-master和过时的part1-master。

我终于从上面发布的链接中找到了解决方案。首先是图片中的问题:

repo0: A -- B -- C -- D -- E \ F -- G -- H repo1: A' -- B' -- C' -- D' -- E' \ F' -- G' -- H' repo0:A--B--C--D--E \ F--G--H 报告1:A'--B'--C'--D'--E' \ F'--G'--H' 如果提交A和A'对应,并以运行的形式获取项目,则需要同时将A和A'签出到各自的目录中,例如proj0和proj1

在存储库中,文件和目录放在/

目标存储库应如下所示:

A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E' \ F -- F' -- G -- G' -- H -- H' A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E' \ \ \ A' -- B -- B' -- F -- F' -- G -- G' -- H -- H' A--A'--B--B'--C--C'--D--D'--E--E' \ F--F'--G--G'--H--H' 因此,我首先将存储库提交的所有内容移动到最终目录中(当然是在副本中):

git克隆--镜像路径/repo0 repo0 git筛选器分支--树筛选器“(mkdir-p proj0;find*-maxdepth 0!-iname proj0-exec mv{}proj0/\)”--all git克隆--镜像路径/repo1 repo1 git筛选器分支--树筛选器“(mkdir-p proj1;find*-maxdepth 0!-iname proj1-exec mv{}proj1/\)”--all 现在我可以合并这两个存储库,首先创建一个新存储库,将旧存储库作为远程存储库:

git init new git remote add proj0 path/repo0 git remote add proj1 path/repo1 git fetch --all git init new git远程添加项目0路径/repo0 git远程添加proj1路径/repo1 git fetch——全部 然后我一个分支一个分支地合并,我只把它们命名为BranchE和BranchH。由于它们从项目开始就存在,我必须得到第一次提交,这是通过虚拟分支完成的:

git checkout -b dummy remotes/proj0/BranchE git checkout -b start `git log --topo-order --reverse | head -n 1 | sed s/"commit \(.*\)"/"\1"/` git checkout -b merge start git merge -m "merge" remotes/proj1/BranchE git rebase --onto start start merge git branch -D start git branch -D dummy git branch -m merge BranchE git签出-b虚拟远程/proj0/BranchE git签出-b start`git log--topo order--reverse | head-n1 | sed s/“commit\(.*)”/“\1”/` git签出-b合并开始 git merge-m“merge”远程/proj1/BranchE git rebase--开始合并 git分支-D启动 git分支-D虚拟 git分支-m合并分支 我也为布兰奇做了同样的事。到目前为止的缺点是,历史现在看起来是这样的:

A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E' \ F -- F' -- G -- G' -- H -- H' A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E' \ \ \ A' -- B -- B' -- F -- F' -- G -- G' -- H -- H' A--A'--B--B'--C--C'--D--D'--E--E' \ \ \ A'--B--B'--F--F'--G--G'--H--H' 最后要做的是将历史的类似部分合并在一起,这是通过以下命令完成的:

git checkout BranchE git rebase `git log --oneline | grep "commit comment of last common commit B'" | sed -r s/"(^[a-f0-9]+) .*"/"\1"/` BranchH 吉特结帐部 git-rebase`git-log--oneline | grep“上一次公共提交的提交注释B'”| sed-rs/“(^[a-f0-9]+).*/'/'\1/`BranchH
等等,你得到了想要的结果。

你能展示一下你特别使用的“合并方案”吗?我通读了我在这篇文章中找到的“合并”两个不共享公共文件的分支,基本上我也是这样:剩下的唯一一件事就是将分支内容移动到单独的目录中,以获得我在文章中提到的布局。