Разработчик коммитил небольшие изменения в двух файлах. Но во время этой фиксации у него возник конфликт слияния, который удалил много материала (возможно, у него не было последней актуальной версии). Затем это было выложено в общее репо, и некоторые другие разработчики сделали другие коммиты.
Теперь мы заметили, что слияние удалило важные файлы, и мы хотим вернуть его обратно.
Как это сделать, не потеряв изменения из следующих коммитов?
Я пытался git revert commitsha
, но это не вернуло изменения. Нужно ли мне вернуть обратно mergesha
? Как я могу это определить?
Обычно:
git revert --mainline 1 dd8cbe3e4
Где:
dd8cbe3e4
- это плохое слияние, которое вы хотите отменить, и --mainline
говорит вам, какой из нескольких предыдущих коммитов будет восстановлен (помните, что коммит слияния имеет несколько родительских коммитов, и вы можете оставить только один из них). 1
, но я предполагаю, что 1,2,3...
соответствует списку сопоставлений с коммитами непосредственно перед dd8cbe3e4
, отсортированным по хронологический порядок по возрастанию (сначала самый старый - обычно это то, к чему вы хотите вернуться). Источник:
http://thezencoder.com/2013/09/05/how-to-correctly-revert-a-bad-merge -в-мерзавец /
Другой (более безопасный) подход заключается в создании различий между последним товаром и текущей версией файла, а затем восстановлении потерянных частей путем копирования и вставки.
Это всегда работает, не требует каких-либо нечетных опций командной строки и не вмешивается в вещи, которые вы должны оставить в покое: -)
Eclipse, например, имеет хорошие инструменты для выбора вишни каждое индивидуальное отличие и скопируйте его в любую версию. Просто используйте меню «Сравнить», чтобы открыть обе версии рядом.
Короче говоря, вы можете сделать git reset --soft <commit>
, где commit может быть HEAD^
(предыдущий), HEAD~2
(current-2), SHA и т. Д.
С --soft все изменения будут готовы к фиксации, так что вы можете изменить фиксацию С --hard изменения будут потеряны.
После того, как вы изменили коммит, вы должны принудительно отправить изменения в общий репозиторий с помощью git push --force
.
Обратите внимание, что вам нужно будет сообщить другим разработчикам, что им следует переназначить свои репо на общее репо. (используйте git pull --rebase
). Они могут получить конфликты слияния, хотя ... Пожалуйста, имейте это в виду.