Используя 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 я вижу людей, поддерживающих вытягивания, слияния и перестановки. Учитывая тот факт, что я хочу объединить изменения, внесенные в одну локальную ветвь, в другую локальную ветвь, что я должен был сделать? Что лучше всего подходит для этого сценария?

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

Ответов (2)

Решение

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

$ git checkout feature1
$ git rebase trunk

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

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

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