Вернуть изменения, сделанные слиянием

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

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

Я пытался git revert commitsha, но это не вернуло изменения. Нужно ли мне вернуть обратно mergesha? Как я могу это определить?

28
задан Sridhar Sarnobat 11 January 2019 в 17:22
поделиться

3 ответа

git revert --mainline

Обычно:

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 -в-мерзавец /

41
ответ дан 28 November 2019 в 03:03
поделиться

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

Это всегда работает, не требует каких-либо нечетных опций командной строки и не вмешивается в вещи, которые вы должны оставить в покое: -)

Eclipse, например, имеет хорошие инструменты для выбора вишни каждое индивидуальное отличие и скопируйте его в любую версию. Просто используйте меню «Сравнить», чтобы открыть обе версии рядом.

6
ответ дан 28 November 2019 в 03:03
поделиться

Короче говоря, вы можете сделать git reset --soft <commit>, где commit может быть HEAD^ (предыдущий), HEAD~2 (current-2), SHA и т. Д.

С --soft все изменения будут готовы к фиксации, так что вы можете изменить фиксацию С --hard изменения будут потеряны.

После того, как вы изменили коммит, вы должны принудительно отправить изменения в общий репозиторий с помощью git push --force.

Обратите внимание, что вам нужно будет сообщить другим разработчикам, что им следует переназначить свои репо на общее репо. (используйте git pull --rebase). Они могут получить конфликты слияния, хотя ... Пожалуйста, имейте это в виду.

1
ответ дан 28 November 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: