Использование git-svn: Pull, Merge или Rebase? - PullRequest
24 голосов
/ 24 февраля 2009

Я боролся с кривой обучения 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 ]

16 голосов
/ 24 февраля 2009

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

$ git checkout feature1
$ git rebase trunk

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

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

0 голосов
/ 24 февраля 2009

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

...