Как вы вернете ошибку 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