2014-02-07 70 views
0

分支BRA部分合並文件:
topfolder/
- 的fileA
- folderA/
....
- folderZ/Git是如何從另一個分支

分支BRB :
topfolder/
- 的fileA
- folderA/
....
- folderZ/

假設我在brA上,我想合併除了fileA之外的brB中的所有文件並創建一個新的brB提交。 也就是說,新的提交應該包含原始的brA/fileA以及除brB/fileA之外的brB的所有文件。
我該怎麼辦啊?

回答

0

所以,你想要什麼,除了在一個文件中合併的一切。這是一個有點乏味,但應該工作:

$ git checkout -b brB-wo-fileA brB 
$ git checkout <commit before changes to fileA> -- fileA 
$ git commit -m 'brB-w-fileA-reverted' -- fileA 
$ git checkout brA 
$ git merge brB-wo-fileA 

,然後你可以用

$ git branch -d brB-wo-fileA 

完成它關於<commit before changes to fileA>,你可能會發現,用(不承諾):

$ git merge-base brA brB 
0

你在做什麼可能會更好地配合

git checkout brA -- fileA 
git commit -m "copy fileA from [email protected]$(git rev-parse --short brA)" 

產生

原來的文胸/的fileA和BRB的所有文件,除了BRB /的fileA

關於你的一切,而不做廣告它作爲一個合併後是結果。

如果由於某種原因有記錄的合併有很重要的,最簡單的方法是

git checkout brB 
git merge -s ours --no-commit brA 
git checkout brA -- fileA 

git commit -m 'just fileA from brA' 

這將做到這一點,但要強調的是這樣做的合併標誌着胸罩的整個歷史上迄今是非常重要的作爲合併,因此沒有未來的合併將胸罩集成任何東西到這一點,即

...X---B---M  brB 
     /
    ...Y---A  brA 

這次合併提交M顯示A的整個歷史和B爲正確的合併。如果你後來想要從A的歷史中找到任何其他的變化,你就必須自己追捕他們並挑選他們。


現在:在你的歷史,保持極度精確,您可以隔離在歷史的變遷到的fileA,通過做

git checkout $(git merge-base brA brB) 
git checkout brA -- fileA 
git commit -m "brA changes to fileA as of [email protected]$(git rev-parse brA --short)" 
git tag wip 

git checkout brB 
git merge wip -m "brA:fileA" 
git checkout brA 
git merge wip -m "Identical to previous, recording separately-merged fileA" 
git tag -d wip 

這將產生

Z---o...X---B---B+fAA  brB # merge of fileA as of commit A 
|\   /
| \-----------(fAA)    # fileA as of commit A 
|    \ 
\---...Y---A---A'  brA # A' identical to A, recording separate fileA merges 

和任何人閱讀(包括git merge)將能夠準確無誤地確定發生了什麼。但這樣做很少見(很少有用),因此這樣做可能會混淆不瞭解歷史圖的人,所以任何下游衝突(甚至不涉及fileA的衝突)都可能導致不必要的驚愕。

相關問題