2016-03-02 107 views
1

我有几个回购,我想合并成一个新的主回购,所有这些回购有独特的历史(绝对没有共同承诺之间) 。我创建了新的主仓库,在其他每个仓库上创建了一个分支,并将每个分支推送到主仓库。现在在master_repo中,将每个分支合并到master分支中都不会产生使用git merge -s和我们的简单git合并(我已经从头开始尝试)的冲突......但是我无法合并这些尝试从其他分支进入主分支的文件夹。我相信问题的一部分是没有共同的祖先承诺。我可以重现该问题如下:git合并工作从多个回购没有共同的祖先到新的回购

目录结构设置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/ 

添加文件与COMMITING ON master_repo硕士BRANCH

$ 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 

添加文件,COMMITING ON 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 

添加文件,COMMITING ON 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尝试:注意是c ontent分支机构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加追加到01/file01的master_repo和“从other_repoB”。我正在寻找甚至可能使用git(而不是手动复制任何东西)?

+0

合并分支B后branchA的内容是什么? –

+0

branchA内容是包含“文件03中的文本”的03/file03。换句话说,master_repo中的branchA的内容与合并后的other_repoA的branchA的内容完全相同。为了澄清,branchA和branchB没有合并在一起;但是这两个分支都被合并到master_repo的master分支中(当然,最终结果并不理想 - master没有来自branchA和branchB的所有文件夹和文件)。感谢您尝试帮助。 – mangi07

回答

0

您需要添加一些read-tree工作去与-s ours空合并:

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

阅读树是结账的核心和合并和许多人一样,什么你想要做的是将树木和索引结合起来,并且经常进行一些工作树的更新,你就是这样构建的。

+0

谢谢你添加这个有用的信息。因为我只对git有基本的了解,所以我可能没有清楚地说明情况。无论如何,我发现我在找什么,并在下面回答我自己的问题(哈哈)。 – mangi07

0

,我发现我的答案在这里文档:

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

这也解释了有关...

所有其他非冲突是该分支的变化成功合并的-Xours选项在。

以及什么-s ours确实,这是一个有点不同......

如果你想要做这样的事情,但没有让Git甚至试图在合并来自对方的变化,有一个更严格的选择,这是“我们”的合并策略。这与“我们的”递归合并选项不同。

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

我在找的是-Xours选项。