Как отменить ошибочный коммит git merge? - PullRequest
16 голосов
/ 03 ноября 2010

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

Вот простой тестовый пример, который я сделал на тестовом репо. Этот репо имеет три ветви. idx - это ветвь темы, которая была случайно объединена, а master - это основная ветка. dev - просто проверка того, как работает revert -m, поэтому вы можете его игнорировать.

alt text

Что я хочу сделать, это отменить ошибочное слияние. Итак, от мастера я пытаюсь запустить git revert -m 1 <sha1sum of faulty merge>, но затем git отвечает:

# On branch master                               
nothing to commit (working directory clean)

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

Если вы хотите поиграть с моим тестовым репо, вы можете скачать его с здесь

Это ошибка или я что-то упустил?

Ответы [ 2 ]

7 голосов
/ 03 ноября 2010

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

Я думаю, что здесь есть несколько вариантов, но самый простой - сделать ребаз.Используя ваш репозиторий, я использовал следующие команды:

git rebase -i ead3646

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

* f0ab6d5 more normal work on dev
* ebb5103 idx commit
* ead3646 master change
* 582c38c dev commits
* f4b8bc6 initial commit

Для того, чтобы вернуть вас двоих (и других) в синхронизацию, потребуется некоторое ветвление, продвижение, отправка по электронной почте ипокупка обеда.

6 голосов
/ 05 ноября 2010

В документации git говорится об отмене слияний: git / Documentation / howto / revert-a-faulty-merge.txt хотя в основном речь идет об отмене слияний, которые привели к плохим изменениям, а не об отмене слиянийэто было сделано неправильно.

По сути, отмена слияния отменяет изменения данных, но не изменения истории (графика).Поэтому ожидается, что возврат вашего ошибочного слияния ничего не даст.

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

git checkout -b temp/merge-fixup ead364653b601f48159bca5cb59d6a204a426168
git merge 2fce9bfe8f721c45ea1ed5f93176322cac60a1d9
git checkout master
git merge temp/merge-fixup
git branch -d temp/merge-fixup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...