2016-05-09 5 views
2

Представьте себе такой сценарий:Как отменить быстрый вперед слияния в Git без сброса

master:   M 
release-candidate: \  A--B'--C' 
feature-A:   \-A-///
feature-B:   \-B--/ /
feature-C:    \--C---/ 

релиз-кандидат был создан с помощью следующих команд:

git co master 
git co -b release-candidate 
git merge feature-A (FAST FORWARD) 
git merge feature-B (REGULAR MERGE) 
git merge feature-C (REGULAR MERGE) 

Скажем, во время нашего перед выпуском тестирования мы обнаруживаем проблему с функцией A. Как мы отменим изменения, вносимые ускоренным слиянием этой ветки функций в ветвь релиз-кандидат?

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

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

ответ

3

Как вы не хотите переписывать опубликованную историю, git revert - ваш друг.

В этом случае:

git revert M..A -n 
git commit -m "revert feature-A" 

если вы хотите Revert в одной фиксации, или

git revert M..A 

, если вы хотите иметь один Revert совершить за оригинал совершить в обратном порядке.

+0

Это работает надежно даже при совершении конфликтов A и B/C? – Mifeet

+0

Да, должно. Если есть конфликты, возврат прекратится, попросите разрешить конфликты, а затем вы можете выполнить git revert -continue'. Если это не работает с опцией '-n', используйте второй вариант, и после того, как все будет возвращено, используйте' git rebase -i', чтобы раздавить коммиты, если захотите. – Vampire

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