Подтвердить что ты не робот

Использование git -svn: Pull, Merge или Rebase?

Я боролся с кривой обучения git/git-svn и прошлой ночью, как часть этой кривой обучения, я сделал что-то очень, очень плохое. С тех пор я получил исправление, но я надеюсь понять ошибку в моих путях.

У меня есть репозиторий svn, из которого я клонировал багажник и ветки (теги, которые я игнорировал, поскольку мы не работаем над ними). Используя git, я создал локальные ветки для каждой из ветвей, с которыми мне сейчас нужно работать:

$ git checkout -b trunk svn/trunk
$ git checkout -b feature1 svn/branches/development/feature1
$ git checkout -b maint svn/branches/maintenance/previous-version

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

С feature1 в качестве моей активной ветки я сделал "git rebase trunk", думая, что я буду вытаскивать изменения из сундука в ветвь feature1. Оказывается, я был очень, очень неправ. После слияния всех конфликтов я сделал git svn dcommit и обнаружил, что мои изменения были применены к соединительной линии.

Мой первый вопрос - просто где была основная ошибка в моем мыслительном процессе? Во-вторых, после многого чтения и поиска в Google, я вижу, что люди поддерживают тяги, слияния и переделки. Учитывая тот факт, что я хочу объединить изменения, применяемые в одном локальном филиале, к другому локальному ветки, что я должен был сделать? Какая наилучшая практика для этого сценария?

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Проблема, с которой вы столкнулись, заключается в том, что синтаксис командной строки для rebase не соответствует вашим ожиданиям (очень разумным, IMO).

$ git checkout feature1
$ git rebase trunk

В этой последовательности добавляется незашифрованная функция1, которая фиксируется на HEAD соединительной линии, и вы ожидали, что она поместит новый сундук на HEAD функции1. Синтаксис действительно имеет смысл, когда вы знаете, как реализуется модель данных Git (что, несомненно, так оно и есть). Но для меня это противоположность тому, что я ожидаю, функционально. Лучше всего изучить его как произвольную конструкцию и не пытаться оправдать ожидания.

Вы правы, что понимаете, как взаимодействовать с репо SVN с помощью git -svn. Поэтому игнорируйте то, что вы нашли в Googling, о том, что нужно нажать и вытащить и слить - там почти правильное обсуждение людьми, которые действуют так, как будто push и pull и merge одинаковы в Git и svn. Почти право по-прежнему не так.

Ответ 2

Вы должны использовать git svn clone -s для клонирования полного дерева svn, включая все ветки. С этого момента используйте git svn rebase и git svn dcommit в master для работы с svn, и вы можете создавать регулярные ветки git для вашего личного использования.