Одна из приятных особенностей Git - его гибкость, позволяющая выполнять практически любую задачу в дереве исходного кода, которая вам может понадобиться. В данном случае я имею в виду очистку истории дерева исходных текстов путем сжатия коммитов.
Когда вы выдавливаете коммиты, вы объединяете 2 или более коммитов в один коммит. Это может быть сделано по многим причинам, одна из которых заключается в том, что историю исходного кода необходимо очистить, прежде чем поделиться с вашей командой или отправить запрос на перенос в проект с открытым исходным кодом. Например, предположим, что ваша недавняя история коммитов выглядит примерно так:
$ git log --oneline
b7c864c Seriously, #421 is fixed now
7729f48 Fixed typo
cc4f2b5 Didn't work, trying something else
b1339db Fixed issue #421
c9f9e96 Updated docs for feature ABC
4eeb10f Added feature ABC
...
Как видно из журналов, для устранения проблемы № 421 потребовалось несколько попыток. Хотя решение было найдено, это замечательно, но это не совсем то, чем вы хотели бы поделиться с остальной частью вашей команды. Все, что их действительно волнует, - это окончательное решение проблемы № 421, но не обязательно то, как вы туда попали. В таких случаях вы можете захотеть сквошить коммиты вместе, чтобы создать одну красивую чистую фиксацию для этой проблемы.
Чтобы раздавить коммиты, вам нужно использовать команду rebase
следующим образом:
$ git rebase -i HEAD~4
Это говорит Git повторно применить последние 4 коммита поверх другой
базовой подсказки. -i
является сокращением от --interactive
,
который вызывает ваш текстовый редактор по умолчанию, чтобы вы могли
редактировать команды перед изменением компоновки. В нашем примере выше
мы увидим текстовый редактор с последними 4 коммитами в обратном
порядке, как показано ниже:
pick b1339db Fixed issue #421
pick cc4f2b5 Didn't work, trying something else
pick 7729f48 Fixed typo
pick b7c864c Seriously, #421 is fixed now
Любая фиксация с ключевым словом «picK» останется в дереве исходных текстов. Однако, если вы замените «pick» на «squash», то этот коммит будет объединен с предыдущим. Продолжая наш пример, мы хотели бы объединить коммиты следующим образом:
pick b1339db Fixed issue #421
squash cc4f2b5 Didn't work, trying something else
squash 7729f48 Fixed typo
squash b7c864c Seriously, #421 is fixed now
Сохранение ваших изменений в этом файле приведет к единому коммиту, который представляет собой комбинацию изменений всех четырех, причем сообщение о фиксации также является комбинацией всех 4. Чтобы указать новое сообщение фиксации, вы должны использовать «reword» вместо «pick» при первой фиксации.
Или, если вы хотите сохранить только «выбранное» сообщение фиксации, вы можете использовать «fixup» вместо «squash» для остальных, что будет делать то же самое, что и squash, но отбросить сообщение фиксации.
Вот все команды, которые можно использовать при перемещении:
pick
(илиp
): использовать фиксациюreword
(илиr
): используйте фиксацию, но отредактируйте сообщение фиксацииedit
(илиe
): используйте фиксацию, но остановитесь для внесения поправокsquash
(илиs
): использовать фиксацию, но объединить с предыдущей фиксациейfixup
(илиf
): похоже на "squash", но отбросить сообщение журнала этой фиксацииexec
(илиx
): запустить команду (оставшуюся часть строки) с помощью оболочкиdrop
(илиd
): удалить фиксацию
И еще несколько важных замечаний от Git относительно интерактивного режима при коммитах с ребазингом:
- Строки можно переупорядочить - они выполняются сверху вниз.
- Если вы удалите там строку, этот коммит будет потерян .
- Однако, если вы удалите все, перебазирование будет прервано.
- Обратите внимание, что пустые коммиты закомментированы
Исправление ваших коммитов таким образом - хорошая практика перед тем, как поделиться с членами вашей команды или перед отправкой изменений в удаленный репозиторий. Гораздо проще прочитать дерево исходных текстов и понять, какие ошибки были исправлены, если, например, одна фиксация исправляет одну ошибку. Однако, если какие-либо из этих коммитов уже были отправлены в удаленный репозиторий, не рекомендуется раздавливать коммиты, так как вы будете переписывать историю.
Для получения дополнительной информации я настоятельно рекомендую
прочитать документацию Git для команды rebase
здесь .