Как объединить части старого коммита с HEAD в git?

#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 , затем вы можете выбирать коммиты для использования и редактировать коммиты по своему усмотрению.