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

Команда разработчиков обычно разделяет работу по ветвям для отдельного разработчика или конкретной функции. Когда пришло время интегрировать эти изменения в основную ветку проекта, команды могут стать довольно скрупулезными с историей фиксации своего проекта, стремясь к тому, чтобы обновления были краткими и удобочитаемыми.

В этом ключе я обнаружил, что команды обычно сжимают или сжимают эти длинные цепочки сообщений коммитов в один или несколько коммитов перед слиянием с основной веткой. Это полезно и на личном уровне. Если вы похожи на меня, вы ошибаетесь и часто совершаете коммиты. Побочным эффектом этого является обилие лишних сообщений о фиксации, которые не делают ничего, кроме путаницы в журнале git. Сжатие этих коммитов может сделать журнал более читаемым и понятным как для нас, так и для других.

Чтобы отобразить это, предположим, что у нас есть следующие 10 коммитов в ветке под названием «домашняя страница».

* 44d2565 (HEAD -> home_page, master) Create nav border
* 1bd999c Styling user data WIP. Add margin
* a135e04 Implement search input for user display
* 76e5811 Add padding to nav list items
* 97178bd User data display WIP
* c289adc Create div for user data
* 14a64ff Add background color to nav and body
* 83c9bbb Add list items to nav
* 60042c8 Add nav to application
* c0fa78d Initial commit

Вы увидите, что у нас есть некоторые коммиты WIP (Work in Progress), а также дополнительные коммиты, относящиеся к части домашней страницы нашего проекта. Это коммиты, которые мы, вероятно, захотим сжать, чтобы сделать наш журнал git более лаконичным.

Чтобы интерактивно перебазировать коммиты, мы можем следовать приведенному ниже формату и вводить нашу команду через командную строку:

git rebase -i HEAD~<n>

or

git rebase -i <after-this-commit-sha1>

Флаг «-i» в приведенном выше примере указывает, что это будет интерактивная перебазировка с «‹n›», обозначающим количество коммитов, которые вы хотите перебазировать.

В случае нашего примера мы хотели бы перебазировать все коммиты, продолжающие первоначальную фиксацию. Итак, мы войдем:

git rebase -i HEAD~9

or

git rebase -i 60042c8

Эти команды вызовут приведенный ниже интерфейс с параметрами для выполнения следующих действий:

p, pick = использовать фиксацию
r, reword = использовать фиксацию, но редактировать сообщение фиксации
e, edit = использовать фиксацию, но прекратить вносить изменения
s, squash = использовать фиксацию, но объединить с предыдущей фиксацией
f, fixup = как «squash» , но отбросить сообщение журнала этой фиксации
x, exec = выполнить команду (остальная часть строки) с использованием оболочки
d, drop = удалить фиксацию

 0 pick 60042c8 Add nav to application
 1 pick 83c9bbb Add list items to nav
 2 pick 14a64ff Add background color to nav and body
 3 pick c289adc Create div for user data
 4 pick 97178bd User data display WIP
 5 pick 76e5811 Add padding to nav list items
 6 pick a135e04 Implement search input for user display
 7 pick 1bd999c Styling user data WIP. Add margin
 8 pick 44d2565 Create nav border
 9
10 # Rebase c0fa78d..44d2565 onto c0fa78d (9 command(s))
11 #
12 # Commands:
13 # p, pick = use commit
14 # r, reword = use commit, but edit the commit message
15 # e, edit = use commit, but stop for amending
16 # s, squash = use commit, but meld into previous commit
17 # f, fixup = like "squash", but discard this commit's log message
18 # x, exec = run command (the rest of the line) using shell
19 # d, drop = remove commit
20 #
21 # These lines can be re-ordered; they are executed from top to bottom.
22 #
23 # If you remove a line here THAT COMMIT WILL BE LOST.
24 #
25 # However, if you remove everything, the rebase will be aborted.
26 #
27 # Note that empty commits are commented out

Мы хотели бы объединить сообщения фиксации в одну фиксацию, которая указывает на то, что мы добавили домашнюю страницу в наш проект. Для этого примера я буду использовать squash вместо fixup. Это сохранит все наши второстепенные сообщения о фиксации в одной окончательной сжатой фиксации.

Вкратце: Что, если бы мы хотели удалить одну или несколько коммитов в приведенном выше примере? Вместо pick мы могли бы использовать ключевое слово drop, чтобы удалить эту фиксацию из нашего кода. В качестве альтернативы, мы могли бы просто удалить строку фиксации, чтобы выполнить то же самое, но я предпочитаю ясность drop.

После перезагрузки ветки наш обновленный журнал git выглядит следующим образом.

* ca22552 (HEAD -> home_page) Add home page to website
* c0fa78d Initial commit

Имейте в виду, что перебазирование рекомендуется не всегда. Есть компромиссы, связанные с решением сохранить или сжать сообщения фиксации. Процесс может быть подвержен ошибкам, и членам вашей команды может быть полезно, чтобы эти сообщения о фиксации были видны.

Может наступить время, когда это сообщение о фиксации может помочь вам в устранении проблемы. Кроме того, члены вашей команды могут страдать от отсутствия этого сообщения, пытаясь понять вашу работу и то, как она реализована. Это может быть особенно болезненно в больших проектах.

Что касается форматирования сообщений о фиксации, мне особенно понравилась статья Криса Бимса Как написать сообщение о фиксации Git.

Дополнительные мысли:

Небольшой совет по Vim для перенастройки многих коммитов:

  • «Ctrl + Shift + V » для перехода в режим визуального блока.
  • Выделите текст, который хотите изменить, и нажмите «C».
  • Введите свои изменения (в приведенном выше примере «сквош») и нажмите «Esc».