2016-03-02 48 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選項。