Как вернуть несколько коммитов как часть одной фиксации

Это не серьезная проблема, просто я хочу знать, возможно ли это.

Скажем, у нас есть две коммиты, abcd123 и wxyz789, которые происходят в несмежных, отдельных местах, еще в истории репо. Теперь позвольте сказать, что мы хотим их вернуть. Выполнение

git revert abcd123 wxyz789

приведет к двум отдельным коммитам, один из которых вернет abcd123, а другой вернется wxyz789.

Это все хорошо и хорошо, но что, если ошибки, которые мы хотим исправить в двух коммитах, логически связаны, и для целей самодокументации мы хотели бы сделать одно единственное сообщение, содержащее один сингл "Я сломал что-то так теперь я возвращаю файлы x, y и z" комментарий? Есть ли команда git, которая делает это?

(Я, конечно, знаю, что можно создать фиксацию, где я просто вручную исправляю все изменения, а затем нажимаю. Это болезненно по всем причинам.)

Ответ 1

Вы можете сделать:

git revert abcd123
git revert --no-commit wxyz789
git commit --amend

... и затем напишите соответствующее сообщение фиксации, описывающее комбинированный эффект возврата обеих коммитов.

Ответ 2

В случае сложных обратных преобразований, которые изменяют друг друга, revert --no-commit может быть проблематичным.

Мое простое решение состояло в том, чтобы сделать реальный возврат и сквош:

git revert <all commits>
git rebase -i

И затем пометьте все реверты как squash, кроме первого, чтобы создать единую фиксацию.

Ответ 3

git revert -n <commits>
git commit

Первая команда будет делать все обратные, не создавая коммитов и не ставя окончательный результат (опция -n). После этого команда commit создает одиночную фиксацию.