git merge vs rebase с использованием git svn - PullRequest
5 голосов
/ 23 июня 2011

Я очень смущен, я прочитал несколько постов, блогов и статей и не знаю, куда идти. Я использую репозиторий svn-сервера, который я запускаю с помощью git svn и продолжаю работать. Я в настоящее время единственный человек, который развивает это (то есть никаких изменений в вышестоящей версии).

Итак, у меня есть локальная ветка git theme vacation, которую мне нужно объединить с master для dcommit, но я не хочу объединять все коммиты в один большой.

Я пытался сделать git rebase -i master, и это стерло 90% моих изменений.

я делаю

git checkout master
git rebase vacation
git svn docmmit

Или

git checkout vacation
git rebase master 
git checkout master 
git merge vacation --ff-only 
git svn docmmit?

Я так боюсь, что случилось, когда я пытался раньше Может кто-нибудь, пожалуйста, кратко объясните, что я должен делать и почему я должен делать это таким образом?

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

так что я думаю, что понял это.

git checkout vacation
git rebase master 
[ masters's chages put behind this branches, replay every commit ]
git checkout master
git merge --ff-only vacation
git svn dcommit 
[ each change goes into svn as seperate commit ]

У меня не было никаких изменений вверх по течению, но это было именно то, что я хотел.

3 голосов
/ 23 июня 2011

Вы должны слить или выбрать вишню в мастер, а не перебазировать.

Что касается вопроса, то это вопрос порядка.Rebase подразумевает, что вы хотите изменить историю, чтобы ветвь темы отображалась перед мастером в истории.Если вы объединяете или выполняете вишневые коммиты, то они добавляют ваши коммиты поверх мастера.

Таким образом, полный цикл будет выглядеть примерно так:

git checkout -b vacation
[make changes]
git commit -a -m "Commit message"
git checkout master
git merge vacation
git svn dcommit

Чтобы объяснить ребаз более подробно, пример измои персональные настройки: в дополнение к мастеру я также поддерживаю работу локального филиала, которую я использую в качестве основы для локальной конфигурации нашего проекта.В нем есть такие вещи, как файлы пользовательских свойств, которые я никогда не хочу фиксировать.Мне нужно синхронизировать это с веткой master, поэтому я делаю это, начиная с master:

git svn rebase
git checkout work
git rebase master

Теперь git восстанавливает историю рабочей ветки, помещая все локальные коммиты конфигурации в начало стека.В буквальном смысле воссоздает ветку BASEd на мастер ветке.Если бы я выпустил

git merge master 

вместо того, чтобы перебазировать, то результат для глаза ламена был бы таким же, но история была бы совсем другой.Две истории будут разрешены, что может привести к коммитам слияния, вместо одной, основанной поверх другой.

...