- Оригинальный адрес:How (and why!) to keep your Git commit history clean
- Оригинальный автор:Kushal Pandya
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:DM.Zhong
- Корректор:Leo Lyu,YiLin Wang
Как (и зачем) поддерживать порядок в Git-коммитах
Коммиты Git могут легко засориться, вот как их содержать в чистоте!
Коммиты — одна из ключевых частей репозитория Git, не только это,Отправить информациюТакже журнал жизни склада. Проект или репозиторий со временем развивается (добавляются новые функции, исправляются ошибки и рефакторинг архитектуры), а коммиты становятся местом, где люди могут увидеть, что изменилось или как изменился репозиторий. Поэтому важно отражать внутренние изменения короткими и точными сообщениями фиксации.
Почему содержательная история коммитов важна?
Git-коммиты — это ваши отпечатки пальцев на коде, который вы пишете. Независимо от того, какой код вы зафиксируете сегодня, вы увидите изменения через год; вы будете очень благодарны за написанные вами осмысленные, чистые коммиты, а также это облегчит работу ваших коллег. Когда коммиты разделены в соответствии с контекстом, быстрее найти, в каком коммите появилась ошибка, а откат коммита, вызвавшего ошибку, может быть очень простым для исправления ошибки.
При разработке больших проектов мы часто имеем дело с большим количеством изменений компонентов, включая обновления, добавления и удаления. Обеспечить хорошее сопровождение коммитов в этом сценарии сложно, особенно когда цикл разработки составляет дни, недели или даже месяцы. Поэтому, чтобы упростить работу по ведению записей коммитов, в этой статье будут использоваться распространенные сценарии, с которыми многие разработчики могут часто сталкиваться при работе с репозиториями Git.
- Сценарий 1: мне нужно пересмотреть последний коммит
- Сценарий 2: мне нужно один раз изменить определенную фиксацию
- Сценарий 3: мне нужно добавить, удалить или объединить коммиты
- Сценарий 4: Мой журнал коммитов бесполезен, и мне нужно начать все сначала!
Но прежде чем углубиться, давайте кратко рассмотрим типичный рабочий процесс разработки в нашем гипотетическом приложении Ruby.
Уведомление:В этой статье предполагается, что вы уже знакомы с основами Git, знаете, как работают ветки, как добавлять незафиксированные изменения из ветки в промежуточную область и как фиксировать изменения. Если вы не знакомы с этими процессами,наша документацияявляется хорошей отправной точкой.
когда-нибудь в жизни
Прямо сейчас мы работаем над небольшим проектом Ruby on Rails, где нам нужно добавить представление навигации на домашнюю страницу, что требует обновления и добавления большого количества файлов. Вот разбивка каждого шага всего процесса:
- Вы начинаете разработку функции, обновляете файл, назовем это
application_controller.rb
- Эта функция также требует, чтобы вы обновили представление:
index.html.haml
- Вы добавляете раздел, используемый индексными страницами:
_navigation.html.haml
- Чтобы отразить добавленную вами часть, таблицу стилей также необходимо обновить:
styles.css.scss
- После замены этих модулей функция завершена, пришло время обновить тестовые файлы, файлы для обновления следующие:
application_controller_spec.rb
navigation_spec.rb
- Тесты также были обновлены, и все тест-кейсы прошли как положено, теперь пришло время зафиксировать изменения!
Поскольку все эти файлы относятся к разным архитектурным доменам, мы фиксируем изменения в этих файлах изолированно друг от друга, чтобы гарантировать, что каждая фиксация представляет определенный контекст и фиксируется в определенном порядке. Я обычно предпочитаю порядок коммитов бэкэнд->фронтенд: изменения, ориентированные на бэкенд, фиксируются первыми, изменения файлов среднего уровня фиксируются вторыми, а изменения, ориентированные на внешний интерфейс, фиксируются последними.
-
application_controller.rb
&application_controller_spec.rb
;Добавить маршрут навигации. -
_navigation.html.haml
&navigation_spec.rb
;Просмотр навигации по страницам. -
index.html.haml
;визуализировать раздел навигации. -
styles.css.scss
;Добавьте стиль к навигации.
После фиксации изменений мы создаем мерж-реквест для ветки. Как только запрос на слияние создан, он помещается в репозиторий.master
Код обычно проверяется вашими коллегами перед ветвлением. Теперь давайте рассмотрим различные ситуации, которые могут возникнуть в процессе проверки кода.
Сценарий 1: мне нужно пересмотреть последний коммит
Представьте, что рецензент кода просматриваетstyles.css.scss
предложил модификацию. В этом случае модификация очень проста, потому что модификация таблицы стилей находится в вашей ветке.последний разОтправить. Вот как мы должны поступить в этой ситуации:
- вы прямо в своей ветке
styles.css.scss
Внесите необходимые изменения. - После того, как вы внесли изменения, добавьте их в тестовую область для подготовки; выполните команду
git add styles.css.scss
. - После того, как модификации были добавлены в промежуточную область, нам нужно добавить эти модификации.Добавить кдо нашего последнего коммита; запустите команду:
git commit --amend
.-
декомпозиция команды: Здесь мы используем
git commit
ЗаказИсправлятьПоследняя фиксация, объединить любые изменения в промежуточной стадии с последней фиксацией.
-
декомпозиция команды: Здесь мы используем
- Это откроет ваш последний коммит в текстовом редакторе, определенном Git, с информацией о коммите.Добавьте стиль к навигации.
- Поскольку мы обновили только декларацию CSS, нам не нужно изменять сообщение коммита. Вы можете просто сохранить и выйти из текстового редактора, открытого для вас Git, и ваши изменения будут отражены в коммите.
Поскольку вы изменили существующую фиксацию, вам нужно использоватьgit push --force-with-lease <remote_name> <branch_name>
команда для изменения этихПринудительный толчокв ваш удаленный репозиторий. Эта команда перезапишет удаленный репозиторий изменениями, внесенными в наш локальный репозиторий.为导航添加样式
этот коммит.
Когда вы принудительно отправляете ветку, нужно помнить, что когда ваша ветка является совместной веткой с несколькими людьми, ваша принудительная отправка может создать проблемы для обычной отправки других людей, потому что есть некоторые принудительные отправки в удаленной ветке нового совершает. Поэтому следует использовать эту функцию с умом. ты сможешьздесьУзнайте больше о параметрах принудительной отправки Git.
Сценарий 2: мне нужно один раз изменить определенную фиксацию
В предыдущем сценарии, поскольку нам нужно изменить только самую последнюю фиксацию, это очень просто сделать, но представьте, если рецензент кода предложил модификацию_navigation.html.haml
части файла. В этом сценарии это вторая фиксация, поэтому изменения не так просты, как в первом сценарии. Давайте посмотрим, как справиться с этой ситуацией:
Каждый раз, когда изменение фиксируется в ветке, уникальная хэш-строка SHA1 отмечает фиксацию изменения. Думайте об этом как об уникальном идентификаторе, который отличает каждую фиксацию. можно сделать, запустивgit log
Команда для просмотра всех коммитов в ветке и их соответствующих хэшей SHA1. После запуска команды вы можете увидеть вывод, подобный следующему, с самой последней фиксацией вверху.
commit aa0a35a867ed2094da60042062e8f3d6000e3952 (HEAD -> add-page-navigation)
Author: Kushal Pandya <kushal@gitlab.com>
Date: Wed May 2 15:24:02 2018 +0530
为导航添加样式
commit c22a3fa0c5cdc175f2b8232b9704079d27c619d0
Author: Kushal Pandya <kushal@gitlab.com>
Date: Wed May 2 08:42:52 2018 +0000
渲染导航部分
commit 4155df1cdc7be01c98b0773497ff65c22ba1549f
Author: Kushal Pandya <kushal@gitlab.com>
Date: Wed May 2 08:42:51 2018 +0000
页面导航视图
commit 8d74af102941aa0b51e1a35b8ad731284e4b5a20
Author: Kushal Pandya <kushal@gitlab.com>
Date: Wed May 2 08:12:20 2018 +0000
添加导航路由
Теперь твоя очередьgit rebase
Команда выполнена. всякий раз, когда мы хотим использоватьgit rebase
команда для изменения определенного коммита изменений, нам сначала нужно перебазировать HEAD нашей ветки на коммит изменения, который мы хотим изменитьДо. В этом случае нам нужно изменить页面导航视图
представлены изменения.
Теперь обратите внимание на хэш коммита изменения перед тем, который мы хотим изменить; скопируйте этот хэш и выполните следующие действия:
- выполнив команду
git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20
перебазировать ветку на предыдущую фиксацию изменения той, которую мы хотим изменить-
декомпозиция команды: Теперь мы используем Git
rebase
командаинтерактивный режим, зафиксировав хэш SHA1, мы можем перебазировать ветку.
-
декомпозиция команды: Теперь мы используем Git
- Эта команда запустит интерактивный режим команды Git rebase и откроет текстовый редактор, показывающий коммиты, которые вы перебазировали.послеВсе внесенные изменения. Это выглядит так:
pick 4155df1cdc7 页面导航视图
pick c22a3fa0c5c 渲染导航部分
pick aa0a35a867e 为导航添加样式
# Rebase 8d74af10294..aa0a35a867e onto 8d74af10294 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Обратите внимание, что перед каждой фиксацией изменения стоит словоpick
, а в содержимом под ним есть все ключевые слова, которые мы можем использовать. потому что мы хотимредактироватьфиксация изменения, поэтому мы скомандуемpick 4155df1cdc7 页面导航视图
превратиться вedit 4155df1cdc7 页面导航视图
. Сохраните изменения и выйдите из редактора.
Теперь ваша ветка была перебазирована, чтобы включить_navigation.html.haml
изменения перед фиксацией. Откройте файл и заполните запросы на изменение в каждом отзыве об обзоре. Когда вы закончите модификацию, используйте командуgit add _navigation.html.haml
Постановка их.
Поскольку мы подготовили эти изменения, пришло время переместить ветку HEAD обратно в нашу исходную фиксацию изменений (тот, который также содержит все наши новые изменения), запуститеgit rebase --continue
, который откроет ваш редактор по умолчанию в терминале и покажет вам сообщение об изменениях, которые мы сделали во время перебазирования;页面导航视图
. Вы можете изменить эту фиксацию, если хотите, но пока мы сохраняем ее, поэтому сохраните изменения и выйдите из редактора. В этот момент Git повторно отобразит все изменения, зафиксированные после изменения, которое вы только что изменили, и ветку.HEAD
Мы вернулись к началу всех наших первоначальных коммитов изменений, и он содержит все новые изменения, которые вы внесли в один из этих коммитов изменений.
Поскольку мы снова изменили фиксацию в удаленном репозитории, нам нужно использоватьgit push --force-with-lease <remote_name> <branch_name>
команда, чтобы заставить ветку зафиксироваться.
Сценарий 3: мне нужно добавить, удалить или объединить коммиты
Обычный сценарий — это когда мы только что изменили некоторые предыдущие коммиты и повторно зафиксировали некоторые новые изменения. Теперь давайте максимально удалим эти коммиты и объединим их с исходными коммитами.
Все, что вам нужно сделать, это запустить интерактивное перемещение, как вы делали это в других сценариях.
pick 4155df1cdc7 页面导航视图
pick c22a3fa0c5c 渲染导航部分
pick aa0a35a867e 为导航添加样式
pick 62e858a322 Fix a typo
pick 5c25eb48c8 Ops another fix
pick 7f0718efe9 Fix 2
pick f0ffc19ef7 Argh Another fix!
Теперь предположим, что вы хотите объединить все эти коммиты вc22a3fa0c5c 渲染导航部分
. Вам просто нужно сделать:
- Переместите коммиты изменений, которые вы хотите объединить, так, чтобы они были ниже окончательного коммита объединенных изменений.
- Фиксируйте каждое изменение схемы с помощью
pick
изменить наsquash
илиfixup
.
Уведомление: squash
Схема сохраняет измененную информацию в описании. иfixup
Нет, он просто сохранит исходную информацию о коммите.
Вы закончите эксперимент с этим результатом:
pick 4155df1cdc7 页面导航视图
pick c22a3fa0c5c 渲染导航部分
fixup 62e858a322 Fix a typo
fixup 5c25eb48c8 Ops another fix
fixup 7f0718efe9 Fix 2
fixup f0ffc19ef7 Argh Another fix!
pick aa0a35a867e 为导航添加样式
Сохраните изменения и выйдите из редактора, и все готово! Это история фиксации после завершения:
pick 4155df1cdc7 页面导航视图
pick 96373c0bcf 渲染导航部分
pick aa0a35a867e 为导航添加样式
Как и раньше, все, что вам нужно сделать сейчас, это запуститьgit push --force-with-lease <remote_name> <branch_name>
команда, а затем все изменения вводятся принудительно.
Если вы хотите полностью удалить фиксацию изменения, вместоsquash
илиfixup
, вам просто нужно ввестиdrop
Или просто удалите эту строку.
избегать конфликтов
Чтобы избежать конфликтов, убедитесь, что коммиты, которые вы перемещаете вверх по временной шкале, не касаются тех же файлов, которые затрагиваются последующими коммитами.
pick 4155df1cdc7 页面导航视图
pick c22a3fa0c5c 渲染导航部分
fixup 62e858a322 Fix a typo # this changes styles.css
fixup 5c25eb48c8 Ops another fix # this changes image/logo.svg
fixup 7f0718efe9 Fix 2 # this changes styles.css
fixup f0ffc19ef7 Argh Another fix! # this changes styles.css
pick aa0a35a867e 为导航添加样式 # this changes index.html (no conflict)
Дополнительный совет: быстроfixup
Если вы точно знаете, какую фиксацию изменения вы хотите отредактировать, не тратьте свой мозг на размышления о таких названиях, как «Исправить 1», «Исправить 2», …, «Исправить 42» при фиксации ваших изменений.
Шаг 1: Знакомство--fixup
После того, как вы проиндексировали эти изменения, зафиксируйте изменения с помощью:
git commit --fixup c22a3fa0c5c
(Обратите внимание, что это хеш-значение принадлежитc22a3fa0c5c 渲染导航部分
это изменение было зафиксировано)
Это создает сообщение фиксации, подобное этому:fixup! 渲染导航部分
.
Шаг 2: И этот маленький приятель--autosquash
Просто используя интерактивную операцию перебазирования. ты можешь сделатьgit
автоматически поставить всеfixup
поставить его в правильное положение.
git rebase -i 4155df1cdc7 --autosquash
История коммитов будет выглядеть так:
pick 4155df1cdc7 页面导航视图
pick c22a3fa0c5c 渲染导航部分
fixup 62e858a322 Fix a typo
fixup 5c25eb48c8 Ops another fix
fixup 7f0718efe9 Fix 2
fixup f0ffc19ef7 Argh Another fix!
pick aa0a35a867e 为导航添加样式
Все готово, вам просто нужно просмотреть и продолжить.
Если вы чувствуете себя предприимчивым, вы можете сделать неинтерактивную перебазировкуgit rebase --autosquash
, но только если вам нравится жить этой рискованной жизнью, потому что у вас нет возможности проверить эти слияния до их применения.
Сценарий 4: Мой журнал коммитов бесполезен, и мне нужно начать все сначала!
Если вы работаете над крупной функцией, обычно есть много исправлений и изменений, которые возвращаются в результате частых проверок кода. Вместо того, чтобы постоянно редизайнить ветку, мы можем оставить очистку коммитов до конца разработки.
Здесь очень удобно создавать файлы патчей. Фактически, до того, как разработчики смогли использовать сервисы на основе Git, такие как GitLab, файлы исправлений были основным способом обмена и слияния кода по электронной почте в крупных проектах с открытым исходным кодом. Предположим, у вас есть ветка с очень большим количеством коммитов (например,add-page-navigation
), что не очень понятно насчет истории изменений репозитория. Вот как создать файл патча для всех изменений, которые вы сделали в этой ветке:
- Первый шаг в создании файла исправления — убедиться, что в вашей ветке есть файлы из
master
Все изменения в ветке и нет конфликтов с этими изменениями. - ты сможешь
add-page-navigation
Запускать при извлечении в веткеgit rebase master
илиgit merge master
, чтобы преобразовать все изmaster
Внесенные изменения переносятся в вашу ветку. - Теперь создайте файл патча; запустите
git diff master add-page-navigation > ~/add_page_navigation.patch
.-
декомпозиция команды: Здесь мы используем Gitdiffособенность, запрос
master
филиал иadd-page-navigation
diff между ветвями, топеренаправитьвывод (через>
символ) в файл в домашнем каталоге нашего пользователя (в*nix
Операционная система обычно~/
) по имениadd_page_navigation.patch
.
-
декомпозиция команды: Здесь мы используем Gitdiffособенность, запрос
- Вы можете указать путь, по которому вы хотите сохранить этот файл, имя файла и расширение на все, что хотите.
- После выполнения команды и отсутствия ошибок создается файл исправления.
- Проверьте это сейчас
master
ветка; бегgit checkout master
. - Удалить ветку из локального репо
add-page-navigation
;бегатьgit branch -D add-page-navigation
. Помните, что мы изменили эту ветку в созданном нами патч-файле. - Теперь создайте новую ветку с тем же именем (
master
проверил); запуститьgit checkout -b add-page-navigation
. - Теперь это новая ветка без каких-либо ваших изменений.
- Наконец, примените изменения из файла исправления;
git apply ~/add_page_navigation.patch
. - Здесь все изменения будут применены к ветке, и они будут отображаться как незафиксированные, как если бы все сделанные вами изменения были сделаны, но на самом деле в ветке ничего не было зафиксировано.
- Теперь вы можете продолжить и зафиксировать отдельные файлы или файлы, сгруппированные по области воздействия в нужном порядке, с четкими и простыми сообщениями о фиксации.
Как и в предыдущем сценарии, мы модифицировали всю ветку, теперь пришло время принудительно нажать!
в заключении
Хотя мы рассмотрели большинство распространенных и основных ситуаций, которые возникают в вашем повседневном рабочем процессе с Git, переписывание истории коммитов Git — это огромная тема, и если вы уже знакомы с приведенным выше советом, вы можетеОфициальная документация Git. Удачи!
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.