#git #github #git-merge #git-commit
#git #github #git-слияние #git-commit
Вопрос:
Я пытался решить проблему с кодированием с помощью Method A
. Я записал лучший рабочий пример Method A
(который я назову "Commit 5"
). Я не был полностью удовлетворен Method A
. Затем я продолжил разработку программы, используя Method B
. Теперь это в "Commit 8"
. (Все в главной ветке)
Теперь я решил придерживаться Method A
, но с тех пор изменилось много других частей кода Commit 5
. Я хочу свернуть весь код, связанный с Method B
back to Method A
, но оставить все остальное без изменений. Эти различия охватывают несколько файлов.
Как бы мне лучше всего добиться этого в git? Есть ли какой-нибудь "manual partial revert-merge"
рабочий процесс для этого?
Комментарии:
1. Каждый из ваших коммитов должен быть отдельными атомарными единицами работы, чтобы их возврат был простым. Похоже, у вас несколько рабочих элементов, запутанных в одном коммите.
2. Или он просто не знал о
git revert
до сих пор. 🙂3. Shoulds не решит эту проблему. Git также не вернется. Единственный способ, который я могу придумать, чтобы решить эту проблему, — это загрузить файлы в новое рабочее дерево и вручную vimdiff нужные части в HEAD.
Ответ №1:
Хорошо, вот как я это сделал:
Я получил список файлов, которые отличались между HEAD и commit 5 следующим образом:
git diff HEAD..e4647 --name-status > /tmp/filelist
Затем я отредактировал это в vim, чтобы удалить любые файлы, которые я не хотел возвращать, и преобразовал его в разделенный список файлов под названием ‘filestodiff’. Затем я создал и применил исправление, используя этот список.
git diff HEAD..e4647 -- `cat /tmp/filestodiff` > /tmp/patch
git apply /tmp/patch
Там был двоичный файл (который нельзя исправить), поэтому я вручную проверил его:
git checkout e4647 the_binary_file
Это достаточно близко. Я попытался отредактировать файл исправления, чтобы удалить некоторые отдельные изменения строк, которые я не хотел, но это просто повредило исправление, поэтому я сделал эти несколько изменений строк вручную.
Наконец, я убедился, что все новые файлы были добавлены в git, он все еще собран, затем:
git commit -am 'hurray! its not borked anymore!'
Ответ №2:
Предполагая, что все изменения в Method B
внесены Commit 8
, вы можете просто вернуться Commit 8
.
Проверьте:
https://help.github.com/desktop/guides/contributing/reverting-a-commit/
https://github.com/blog/2019-how-to-undo-almost-anything-with-git
Ответ №3:
Запустите git rebase -i Commit5
, затем вы можете выбирать коммиты для использования и редактировать коммиты по своему усмотрению.