2013-04-04 3 views
4

Я начинаю с слияния обучения в git 1.8.2. Я создал простой пример, чтобы протестировать изменение стороннего репо, перенесенного в основной проект.Git Subtree Слияние конфликтов сообщений при слиянии простого восходящего изменения

Я следую примеру 6.7 Git Tools - Subtree Merging.

Проект «под» включен в качестве подкаталога в «основном» проекте.

После того, как я внес изменения в проект «sub», git сообщает о конфликте, когда я пытаюсь объединить это изменение в «основной» проект.

Test Summary

  1. Создано операции РЕПО для «основного» и «суб» проектов (суб вместо стойки)
  2. Добавить удаленный именованный sub_remote к основному, который относится к югу
  3. Track sub_remote с использованием sub_branch
  4. Изменение и фиксация одной строки в файле в проекте «под»
  5. Извлечь изменения с субрука на главный/sub_branch
  6. Объединить main/sub_branch в main/master.

Слияние происходит с конфликтом. Слияние смущает о том, какую версию измененной строки сохранить.

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

Complete Test Script

#!/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 # Другие типы слияний Но, я думаю, это все еще страдает от этой же проблемы. –

ответ

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 позволит вам увидеть, как объединяются разные коммиты.

Смежные вопросы