2011-01-19 2 views
10

Я не настолько опытен с Git, и теперь у меня есть большая проблема, падающая на мои колени.Undoing git merge

Вот как моя текущая ветвь выглядит следующим образом:

feature  /---F1-----F2----\ 
      /    \ 
master -----M0-----M1-----M2-----M3-----M4 
      \      /
bugfix  \--B1-----B2-----------/ 

Ситуация:

Кто-то сделал очень плохую вещь и подтолкнул очень плохой слияние (M3). Я заметил только плохое слияние, когда наши модели (а не исходный код) не загрузились после того, как я объединил B1 и B2 в M4. К счастью, я еще не нажал M4.

Проблема:

Как установить все правильно еще раз? Я хочу M0, M1, M2, F1, F2, B1 и B2. Но я не хочу M3 и M4 (поскольку M4 явно сломан). Если я есть отказаться от изменений, затем F1 и F2 может быть принесена в жертву :)

Я смотрел на git revert, но я не уверен, что я полностью понимаю, как это работает. Итак ... Я действительно надеюсь на помощь в решении этого.

Заранее спасибо.

ответ

6

Так, чтобы уточнить, что вы хотите, так, правильно?

feature  /---F1-----F2 
      /    
master -----M0-----M1-----M2 
      \    
bugfix  \--B1-----B2 

Убедитесь, что HEAD s feature и bugfix еще на F2 и B2 соответственно.

Edit: если feature и bugfix нет ветвей, сделать их филиалы (копить свою работу, если это неподтвержденное):

git checkout F2 
git branch feature 
git checkout B2 
git branch bugfix 

Редактировать конец

Затем сбросьте мастер к M2 :

git checkout master 
git reset M2 --hard 

(сброс заставит вас потерять ваши местные изменения, пристрелите их, если вы этого не хотите.)

и M4 не уничтожаются сразу же, но в конечном итоге. Они не должны отображаться в git log или gitk.

Тогда пришло время слить feature и сделать M3', что верно.

+0

Да, вроде, «функция», «мастер» и «багфикс» на самом деле не ветви, я подозреваю, что это смущает. То есть, 3 ppl совершают собственные изменения основной ветви. Один парень сделал плохое слияние и толкнул. Я вытащил плохое слияние. Теперь я хочу, чтобы исключить плохое слияние, сохраняя при этом все индивидуальные изменения ... – aberrant80

+0

Итак, 'feature' и' bugfix' не являются ветвями? Конечно, автор 'feature' имеет филиал в своем собственном репо. Что вам нужно сделать, так это сбросить мастер на M2 и попросить автора 'feature' сделать то же самое (но убедитесь, что он не потерял функцию ветки) и повторить слияние, правильно на этот раз. Посмотрите мое обновление, если вы хотите сделать это сами. – Gauthier

+0

У вас действительно есть репо без ветви 'master'? – Gauthier

1

Если вы не нажимали (публиковать) слияние, все же используйте git reset. Например. на главной ветке, если ваше рабочее дерево чистое, сделайте git reset - hard.

Подробнее: Undo a Git merge that hasn't been pushed yet

Если ты опубликовать ваши изменения вы можете рассмотреть вопрос о внесении Revert совершить вместо этого. Больше информации здесь: http://progit.org/2010/03/02/undoing-merges.html