Подтвердить что ты не робот

Как вы вернете ошибку 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, или я что-то не хватает?

4b9b3361

Ответ 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