2013-04-04 55 views
4

我開始學習git 1.8.2中的子樹合併。我創建了一個簡單的示例來測試對第三方回購協議遷移到主項目中的更改。合併簡單的上游變更時Git Subtree報告衝突

我正在關注6.7 Git Tools - Subtree Merging示例。

'sub'項目作爲'main'項目的一個子目錄包含在內。

當我對'sub'項目進行更改後,當我嘗試將更改合併到'main'項目中時,git會報告衝突。

測試總結

  1. 對項目的主要「和「子」(子而非機架)
  2. 遠程命名sub_remote加入主要是指子
  3. 軌道創建回購使用sub_remote sub_branch
  4. 更改並提交'sub'項目文件中的一行
  5. 將sub轉換爲主/ sub_branch
  6. 將main/sub_branch合併到主/主設備中。

合併因衝突而失敗。合併關於要保留的更改行的哪個版本感到困惑。

<<<<<<< HEAD 
main 
======= 
main upstream change 
>>>>>>> sub_branch 
main.git 
sub 
sub.git 
tm 

完整的測試腳本

#!/bin/sh 

# initialize empty repos 
for i in main sub 
do 
    rm -rf $i{,.git} 
    mkdir $i.git 
    cd $i.git; 
    git --bare init; 
    cd ..; 
    git clone $i.git 
    cd $i 
    echo $i > readme.md 
    git add readme.md 
    git commit -a -m "added readme.md" 
    git push origin master 
    cd .. 
done 

# add data to sub 
ls > sub/data 
cd sub 
git add data 
git commit -m "Added data" 
git push origin master 
cd .. 

# add sub as a sub-tree in main 
cd main 
git remote add sub_remote ../sub.git 
git fetch sub_remote 
git checkout -b sub_branch sub_remote/master 
git checkout master 
git read-tree --prefix=sub/ -u sub_branch 
git commit -m "Added sub" 
git push origin master 
cd .. 

# make change to sub 
cd sub 
sed -i -e 's/main$/main upstream change/' data 
git commit -a -m "upstream change made to data" 
git push origin master 
cd .. 

# merge sub change to main 
cd main 
git checkout sub_branch 
git pull 

#merge sub_branch changes into master 
git checkout master 
git merge -s subtree sub_branch 
cat sub/data 
+0

覆蓋子樹合併的git-scm書中的新頁面位於:https:// git-scm。com/book/en/v2/Git-Tools-Advanced-Merging#其他類型的合併但是,我認爲它仍然遭受同樣的問題。 – 2016-03-30 23:36:15

回答

6

什麼read-tree在這種情況下做的只是增加了一個目錄在當前的樹另一棵樹的內容。這個內容就像正在創建和添加的常規文件和目錄一樣添加,沒有歷史記錄結束。所有這些文件將被視爲您創建它們。

當您嘗試合併時,由於過程失敗,因爲它看到sub_branch歷史創建了data文件,並且目標目錄也包含由您創建的不同data文件。

您正在使用的頁面缺少一個使子樹正常工作的非常重要的步驟,以便您實際上能夠將更新提供給它。

適當的例子可以看出,在這兩個網頁: https://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html https://help.github.com/articles/working-with-subtree-merge

什麼它缺少你的情況是,當你創建的子樹正確鏈接歷史:

# create the merge record but not change anything in your tree yet 
git merge -s ours --no-commit sub_branch 
# bring the changes and place them in the proper subdirectory 
git read-tree --prefix=sub/ -u sub_branch 

後此main存儲庫將包含sub存儲庫的歷史記錄。調用失敗的合併現在應該可以正常工作。調用git log --graph可以讓你看到不同的提交是如何被合併的。