Intereting Posts
Как получить мой проект из Git и в TFS? Как создать карту Foundation с структурой Back End Folder? Как вытащить из частного репо в трубопровод битбакет? как удалить записи фиксации в github? Невозможно совместить ключ ssh для git. Вместо этого используется локальный отпечаток пальца? git diff показывает ^ M с цветом ui true Экспортировать неразрешенный список в RTC в виде текстового документа Получить имена всех измененных файлов в журнале одного файла `git add *` предлагает фатальную ошибку Как запустить работу jenkins maven с несколькими ветвями при построении зависимости SNAPSHOT? При установке пакетов python из github с помощью сценария установки, как работает удаление / удаление / обновление? верните все нажатые коммиты в несколько файлов Как проверить пустые вишневые кирки в сценарии bash? Не разрешено выполнять какой-либо анализ SonarQube при построении запроса на получение от репозитория forket на Travis CI Недостатки мелкого клонирования на Travis и других сервисах CI?

Альтернативы миграции перечисляются из одной ветки в другую в GIT

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

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

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

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

Заранее спасибо, nav

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

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

$ 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 (ie 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 

Выполнение rebase по существу делает кучу вишневых кусков подряд – это то, что скрипт rebase вызывает под капотом.

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

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

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

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

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