Изменение кода предыдущих коммитов с помощью git rebase -i

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

Я знаю, что каким-то образом я могу сделать это с помощью git rebase -i и выбирая edit для каждого коммита, который я хочу изменить, но таким образом я могу изменить только сообщение коммита, а не код

2 ответа

Решение

Гит rebase позволяет разделить коммиты:

В интерактивном режиме вы можете пометить коммиты с помощью действия "изменить". Однако это не обязательно означает, что git rebase ожидает, что результатом этого редактирования будет ровно один коммит. Действительно, вы можете отменить коммит или добавить другие коммиты. Это можно использовать для разделения коммита на две части:

  • Запустите интерактивную перебазировку с помощью git rebase -i ^, где находится коммит, который вы хотите разделить. Фактически, подойдет любой диапазон фиксации, если он содержит этот коммит.

  • Пометьте коммит, который вы хотите разделить, с помощью действия "изменить".

  • Когда дело доходит до редактирования этого коммита, выполните git reset HEAD^. В результате HEAD перематывается на единицу, и индекс следует за ним. Однако рабочее дерево остается прежним.

  • Теперь добавьте изменения в индекс, которые вы хотите иметь в первом коммите. Для этого вы можете использовать git add (возможно, интерактивно) или git gui (или оба).

  • Зафиксируйте текущий текущий индекс с любым соответствующим сообщением.

  • Повторите последние два шага, пока ваше рабочее дерево не станет чистым.

  • Продолжите перебазирование с помощью git rebase --continue.

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

Вот что я бы сделал:

git reset COMMIT_BEFORE_CHANGES --soft

и повторно все в соответствующих коммитах. --soft оставит ваше рабочее дерево и индекс в состоянии, в котором они находятся до сброса.

Само собой разумеется, что вы не должны делать что-то подобное после того, как кто-то от вас оторвался.

Другие вопросы по тегам