2013-06-24 2 views
5

Речь идет о некоторых краях случай git-flow методологииГИТ-поток: Как предотвратить некоторые изменения, сделанные в ветке релиза от слияния обратно к развитию

У меня есть какое-то типичная история ГИТ-поток, как это:

 o---o---o---o [release-3.5.0] 
    /
----o---o---o---o---o [development] 

Гит-поток сказал нам, чтобы объединить релиз-3.5.0 филиал в развитие затем отпустить готов. Итак, в конце концов мы получим ВСЕ изменений, сделанных в филиале выпуска в ветку развития.

 o---o---o---o 
    /   \ 
----o---o---o---o---o [development] 

Теперь представьте, у нас есть обязательство «X» на ветви выпуска, что мы НЕ хотите в отрасли разработки, например, это своего рода хак/исправление или другое, уже зафиксировано в развитии в более разумный способ (т.е. совершить Y)

 o---X---o---o [release-3.5.0] 
    /
----o---o---o---Y---o [development] 

Итак, главный вопрос - как справиться с такими ситуациями? Как предотвратить эту фиксацию (или фиксацию) от возврата к разработке?

+0

Возможный дубликат [GIT - пропуск определенных фиксаций при сливающихся] (HTTP ://переполнение стека.com/questions/727994/git-skipping-specific-commits-when-merging) – Lu55

ответ

7

Хотя ответы рекомендовать rebase и/или слияния/возврата/сквош будет работать, я лично считаю, что лучшим ответом будет такой:

git checkout development 
git merge --no-commit release-3.5.0 
# make whatever changes you need to fixup the "hack" and/or clean up any conflicts 
git commit 
+0

'--no-commit' не генерирует 'информацию о слиянии'. Релиз релиза не будет отображаться в истории как объединенный, но он не будет рассматриваться как объединенный командой 'git branch --merged'. Таким образом, случайно можно объединить его по ошибке. – Olegas

+2

@Olegas В то время как ваш комментарий технически корректен, следуя приведенному выше полному рабочему процессу *, будет * создавать «информацию о слиянии» (предполагая, что вы имеете в виду некоторую комбинацию сообщения фиксации в формате слияния и/или родительских указателей, которые создают слияние в история DAG), но это окончательная «git commit», которая создает их. 'Git merge --no-commit' просто устанавливает вещи так, чтобы были созданы соответствующие метаданные. Если вы попробуете 'git branch -merged' перед окончательным' git commit', он будет правильно показать, что ветвь еще не была объединена, потому что слияние не было выполнено ... – twalberg

+1

да, вы правы. После коммита все в порядке, включая информацию о слиянии, я был неправ. – Olegas

1

У вас есть несколько вариантов:

1) использовать git rebase -i

В этом режиме вы можете перебазировать свой филиал релиз на вашей отрасли разработки и исключить Xth фиксации.

Предупреждение В этом случае вы испортите существующие клонированные репозитории.

2) использовать git cherry-pick

В этом режиме вы будете иметь возможность выбрать совершает один за другим.

3) использовать git rebase -i на отдельной ветке и объединить его впоследствии, как указано в этом ответе: Is it possible to exclude specific commits when doing a git merge?

+0

'rebase' не подходит, потому что предупреждение, которое вы отметили,' cherry-pick' является приемлемым, но слишком сложным делом ' многие совершают (но это может быть как-то автоматизировано). – Olegas

+1

cherry-pick фактически позволяет выбирать диапазон коммитов (http://stackoverflow.com/a/1994491/696792), но это также включает некоторые проблемы (указано в связанном ответе). – StKiller

+0

Обновлен ответ третьим способом. – StKiller

2

В таких случаях вы всегда хотите, чтобы полностью слить() ветви -как высвобождения. Поэтому убедитесь, что ничего не пропало.

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

Если исправление уже включено, слияние просто пропустит его или разрешит конфликт, выбрав версию devel.

Суть в том, что вы хотите, чтобы история отображалась как ваша вторая фигура, и состояние, поскольку это имеет смысл.