2014-02-08 3 views
0

В настоящее время я работаю над проектом python с использованием GIT, и у нас есть два основных мастера и релиз. Новые функции привязаны к главному ветви, тогда как исправления ошибок сделаны только в ветви релиза.Альтернативы миграции коммитов из одной ветви в другую в GIT

Мой вопрос в том, что было бы лучшим способом, чтобы исправления ошибок были перенесены в основную ветку из ветви релиза.

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

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

Спасибо заранее, нав

ответ

1

Обычно вы просто объединяете ветвь выпуска в ветку разработки.

В типичном рабочем процессе ветвь освобождения отделена от ветви разработки. Как вы описали, в ветку разработки добавляются новые коммиты разработки, и исправления добавляются в ветвь релиза. В какой-то момент у вас возникнет слияние ветвей разработки в ветви релиза, то есть ветка разработки получит новое объединение слиянием, а головка ветви разработки (мастер) продвинется, в то время как глава ветви выпуска остается нетронутой.

$ git checkout master 
$ git merge -m "Merge in hotfix for 'blah blah blah' back into develop" release 

Филиал развития теперь будет содержать как новое развитие совершает и исправления, в то время как выпуск филиал все еще содержит только исправления. Вы можете продолжить добавлять дополнительные исправления в ветку выпуска и объединить их в разработку (а также продолжить выполнение работ по разработке для ветви разработки).

gitflow картина имеет визуализацию этого:

Такой подход не позволит вам выбрать, какие исправления сольются обратно развиваться (если вы не сделаете что-то специально, чтобы исключить определенное совершает). Помните, что когда одна ветвь сливается в другую, первая ветвь эффективно получает все коммиты со второй ветви (из точки слияния второй ветви назад), что первая ветвь еще не имела, т. Е. Получает все фиксации, сделанные на после того, как он прервался с разработки, которое ранее не было объединено в разработку. Если вы сделали 2 исправления в выпуске, не объединили первое, но затем выберите, чтобы слияние разработки было в конце ветки релиза после второго исправления, у разработки будут оба исправления.

-

Единственные исправлениях изменения, которые вы не можете в отрасли развития являются изменения, как натыкаясь версия #. Вам нужно либо исправить это во время слияния (или после), либо убедиться, что вы изолируете эти изменения в отдельной фиксации в ветви релиза, чтобы вы могли «подделать» слияние, которое передается отдельно в ветку разработки, т. Е. Сделать ветвь развития думает, что уже имеет эту фиксацию без фактического включения «различий» в этой фиксации. Я грубо описал процесс здесь:

https://stackoverflow.com/a/19794987/11296

Например, если вы делаете устранении ошибки на ветке релиза, а затем обновить версию # в документации/код в отдельном совершение (последняя фиксации), а затем объединить что в ветку разработки вот так:

$ git checkout release 
$ <implement bugfix> 
$ git add ... 
$ git commit -m "bugfix for ..." 
$ <change the version #> 
$ git commit -m "bump version number to ..." 

$ # Ready to pull this bugfix into development 
$ git checkout master 
$ # Merge in the bugfix changes (i.e. all but the last commit) 
$ git merge -m "Merge in hotfix for 'blah blah blah' back into develop" release^ 
$ # "Fake" merge the version # change 
$ git merge --strategy=ours -m "Fake merge version # change" release 
+1

Благодарим вас за подробный ответ. Думаю, у меня есть более четкая картина о том, что делать. – navanitachora

0

делает перебазирование по существу делает кучу вишневой кирки подряда - это то, что сценарий перебазироваться называет под капотом.

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

R <- feat <- feat <- fix <- feat <- fix <- feat [master] 
\ 
    \ 
    <- fix <- fix <- fix [release] 

Если это так, то вы хотите перебазироваться MOST филиала выпуска на мастер (может быть «паника исправления ", которые вы сделали для решения производственной проблемы, но вы не хотите продолжать ее).

Ребаза - это путь для этого. Посмотрите на главу книги о гитаре, и продолжайте читать ее, пока не получите то, что она вам говорит. (http://git-scm.com/book/en/Git-Branching-Rebasing)

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

+0

Спасибо, мне нужно попробовать снова переустановить, возможно, на новый клон и посмотреть, смогу ли я заставить его работать. – navanitachora

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