git将来自多个回购的工作合并到没有共同祖先的新回购

时间:2016-03-02 03:18:36

标签: git version-control merge

我有一些我想要合并到一个新的主仓库的回购,所有这些回购都有独特的历史(绝对没有共同的提交)。我已经创建了新的主仓库,在每个其他仓库上创建了一个分支,并将每个分支推送到主仓库。现在在master_repo中,将每个分支合并到主分支不会产生任何冲突,使用git merge -s ours和简单的git merge(我从头开始尝试)...但是我没有尝试合并这些尝试从其他分支到主分支的文件夹。我相信问题的一部分是没有共同的祖先提交。我可以按如下方式重现问题:

test_merge中设置的目录结构: master_repo(文件夹01) other_repoA(文件夹03) other_repoB(包含文件夹01和09)

然后在Cygwin终端(“...”=裁剪的终端消息):

$ cd master_repo/
$ git init
Initialized empty Git repository in .../test_merge/master_repo/.git/

在master_repo的主分支上添加文件和进行委托

$ echo "text in file01" > 01/file01
$ git add *
warning: LF will be replaced by CRLF in 01/file01.
The file will have its original line endings in your working directory.
$ git commit -m "master_repo: first commit"
[master (root-commit) ...blah, blah...
1 file changed, 1 insertion(+)...blah, blah

添加文件,在other_repoA的主分支上进行调用,添加新分支,并向master_repo推送新分支

$ cd ../other_repoA
$ git init
Initialized empty Git repository...blah,blah
$ echo "text in file03" > 03/file03
$ git add *
...
$ git commit -m "other_repoA: first commit"
...
$ git checkout -b branchA
...
$ git status
On branch branchA
nothing to commit, working directory clean
$ git push ../master_repo branchA
To ../master_repo
 * [new branch]      branchA -> branchA

添加文件,在other_repoB的主分支上进行调用,添加新分支,并向master_repo推送新分支

$ cd ../other_repoB
$ git init
...
$ echo "text in file01 from other_repoB" > 01/file01
$ echo "text in file09 from other_repoB" > 09/file09
$ git add *
$ git commit -m "other_repoB: first commit"
...
$ git checkout -b branchB
...
$ git status
On branch branchB
nothing to commit, working directory clean
$ git push ../master_repo branchB
To ../master_repo
 * [new branch]      branchB -> branchB

了解master_repo

$ cd ../master_repo
$ git status
On branch master
nothing to commit, working directory clean
$ git branch
  branchA
  branchB
* master
$ ls
01
$ git checkout branchA
Switched to branch 'branchA'
$ ls
03
$ git checkout branchB
Switched to branch 'branchB'
$ ls
01  09

MERGE ATTEMPT:请注意,分支A和B中的内容似乎被忽略

$ git checkout master
Switched to branch 'master'
$ git merge -s ours branchA
$ ls
01
$ git merge -s ours branchB
Merge made by the 'ours' strategy.
$ ls
01
$ cat 01/file01
text in file01
$ git checkout branchB
Switched to branch 'branchB'
$ ls
01  09
$ cat 01/file01
text in file01 from other_repoB

我想看到的最终结果是将文件夹03和09添加到master_repo并将“from other_repoB”添加到01 / file01。我正在寻找甚至可能使用git(而不是手动复制任何东西)?

2 个答案:

答案 0 :(得分:0)

您需要添加一些read-tree工作以使用-s ours null合并:

git merge -s ours --no-commit branchA    # null `-s ours` for `branchA` parent
git read-tree -u --prefix= branchA       # add the branchA tree at the project root
git commit

git read-tree docs

读取树是结帐和合并的核心,还有许多其他的,你想要做的任何结合树和索引以及通常一些工作树更新的东西,你都是这样构建的。

答案 1 :(得分:0)

我在文档中找到了答案:

https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#Other-Types-of-Merges

解释了-Xours选项......

  

该分支上的所有其他非冲突更改都已成功合并。

以及-s ours所做的事情,这有点不同......

  

如果你想做这样的事情但是没有让Git尝试合并来自另一方的更改,那么有一个更严苛的选择,即“我们的”合并策略。这与“我们的”递归合并选项不同。

     

这基本上会做假合并。它将记录一个新的合并提交,将两个分支作为父项,但它甚至不会查看您正在合并的分支。它只会记录合并后当前分支中的确切代码。

我要找的是-Xours选项。