Как я могу отменить слияние, которое не производит коммит слияния? - PullRequest
5 голосов
/ 03 ноября 2011

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

Когда я пытался выполнить поиск, самый простой способ отменить слияние кажется мне git revert hash_of_merge_commit.

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

Есть ли лучший способ сделать это?

Ответы [ 5 ]

15 голосов
/ 08 июня 2013

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

  1. git checkout -b my-undo-branch
  2. git reflog show master - найти последний коммит перед слиянием
  3. git reset --keep SHA - с использованием SHA из предыдущего шага

На этом этапе убедитесь, что эта ветвь находится в том состоянии, в котором вы хотите, чтобы master находился в ней. Теперь достаточно просто сделать разность между этими двумя ветвями и передать ее мастеру:

  1. git checkout master
  2. git diff master my-undo-branch --no-prefix > patchfile
  3. patch -p0 < patchfile

Затем, наконец, удалите patchfile, git add все изменения и git commit их.

0 голосов
/ 03 ноября 2011

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

Подробнее об этом здесь:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

0 голосов
/ 03 ноября 2011

Отмена слияний вообще может быть непростым делом.См. http://progit.org/2010/03/02/undoing-merges.html или этот другой вопрос SO для фона.

То, что вы можете искать:

git merge --no-ff

, который скажет Git, что этодолжен создать коммит слияния, даже если у него нет , как в этом случае.

0 голосов
/ 03 ноября 2011

Вы должны слить без быстрой пересылки, передав --no-ff команде слияния.

Таким образом, всегда создается новый коммит, и вы сможете отменить его.

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

0 голосов
/ 03 ноября 2011

Вы можете объединиться с --no-ff, чтобы предотвратить ускоренное слияние, то есть, как вы «получаете четыре новых коммита, добавленных к мастеру». Когда ветви на самом деле не расходятся, Git выполняет быстрое слияние и просто поднимает ссылки на ветки. Предотвращение ускоренного слияния поможет вам немного сохранить историю ветвей с помощью очевидных коммитов слияний, хотя вы не сможете сказать имя ветви, в которой были созданы коммиты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...