В предыдущих ответах рассказывалось о том, git rebase -iкак редактировать коммит, который вы хотите разделить, и коммитить его по частям.
Это хорошо работает при разделении файлов на разные коммиты, но если вы хотите разбить изменения на отдельные файлы, вам нужно знать больше.
Получив коммит, который вы хотите разделить, используя rebase -iи пометив его edit, у вас есть два варианта.
После использования git reset HEAD~, пройдитесь по патчам индивидуально, используя, git add -pчтобы выбрать те, которые вы хотите в каждом коммите.
Отредактируйте рабочую копию, чтобы удалить изменения, которые вы не хотите; совершить это временное состояние; и затем вытяните полный коммит для следующего раунда.
Вариант 2 полезен, если вы разделяете большой коммит, так как он позволяет вам проверить, что промежуточные версии создаются и работают правильно как часть слияния. Это происходит следующим образом.
После использования rebase -iи editфиксации, используйте
git reset --soft HEAD~
отменить фиксацию, но оставить зафиксированные файлы в индексе. Вы также можете сделать смешанный сброс, пропустив --soft, в зависимости от того, насколько близок к конечному результату ваш первоначальный коммит. Разница лишь в том, начинаете ли вы со всех этапов изменений или со всеми без изменений.
Теперь зайдите и отредактируйте код. Вы можете удалить изменения, удалить добавленные файлы и сделать все, что хотите, чтобы создать первый коммит из серии, которую вы ищете. Вы также можете собрать его, запустить и подтвердить, что у вас есть согласованный набор источников.
Как только вы будете довольны, подготовьте / разархивируйте файлы по мере необходимости (я хотел бы использовать git guiдля этого) и зафиксируйте изменения через пользовательский интерфейс или командную строку
git commit
Это первый сделанный коммит. Теперь вы хотите восстановить свою рабочую копию в состояние, которое она имела после разделения коммита, чтобы вы могли принять больше изменений для вашего следующего коммита. Чтобы найти sha1 коммита, который вы редактируете, используйте git status. В первых нескольких строках состояния вы увидите команду rebase, которая выполняется в данный момент, в которой вы можете найти sha1 вашего исходного коммита:
$ git status
interactive rebase in progress; onto be83b41
Last commands done (3 commands done):
pick 4847406 US135756: add debugging to the file download code
e 65dfb6a US135756: write data and download from remote
(see more in file .git/rebase-merge/done)
...
В этом случае редактируемый мной коммит имеет sha1 65dfb6a. Зная это, я могу проверить содержимое этого коммита в моем рабочем каталоге, используя форму, git checkoutкоторая принимает как коммит, так и местоположение файла. Здесь я использую .в качестве местоположения файла замену всей рабочей копии:
git checkout 65dfb6a .
Не пропустите точку на конце!
После этого будут проверены и отредактированы файлы, какими они были после коммита, который вы редактируете, но относительно предыдущего коммита, который вы сделали, поэтому любые изменения, которые вы уже зафиксировали, не будут частью коммита.
Вы можете либо пойти дальше и зафиксировать его как есть, чтобы завершить разделение, либо вернуться снова, удалив некоторые части коммита перед выполнением другого временного коммита.
Если вы хотите повторно использовать исходное сообщение о коммите для одного или нескольких коммитов, вы можете использовать его прямо из рабочих файлов rebase:
git commit --file .git/rebase-merge/message
Наконец, как только вы совершите все изменения,
git rebase --continue
продолжит и завершит операцию перебазирования.