Git: сжатие нескольких коммитов в одну фиксацию

Одна из приятных особенностей Git - его гибкость, позволяющая выполнять практически любую задачу в дереве исходного кода, которая вам может понадобиться. В данном случае я имею в виду очистку истории дерева исходных текстов путем сжатия коммитов. Когда вы выдавливаете коммиты, вы объединяете 2 или более коммитов в один коммит. Это может быть сделано по многим причинам, одна из которых заключается в том, что историю исходного кода необходимо очистить, прежде чем поделиться с вашей командой или отправить запрос на перенос в проект с открытым исходным кодом. Для

Одна из приятных особенностей 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 здесь .

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus