Как вы вернете ошибку git слияние

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

Вот простой тестовый пример, который я сделал на тестовом репо. У этого репо есть три ветки. 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)

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

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

Является ли это ошибкой git, или я что-то не хватает?

Ответы

Ответ 1

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

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

git rebase -i ead3646

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

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

Возвращение двух (и других) обратно в синхронизацию приведет к разветвлению, подталкиванию, отправке по электронной почте и обеду.

Ответ 2

Документация git говорит о возврате слияний: http://code.google.com/p/git-core/source/browse/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