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».