
Если хотите больше узнать о git, предлагаю начать с главы 10 книги Pro Git (это бесплатно!), затем главы 2, 3 и 7. Остальное необязательно. В этой статье мы обсудим, как применить описанные в книге инструменты для дисциплинированной и продуктивной работы в git.
Основы: хорошие описания коммита

Возможно, вы слышали это раньше, но потерпи?те. Как правило, не нужно использовать
git commit -m "ваше сообщение здесь"
. Начните с настройки git для использования любимого редактора: git config --global core.editor vim
, затем просто запустите git commit
. Откроется редактор, и вы сможете написать в нём своё описание коммита. Первую строку следует ограничить длиной 50 символов и завершить предложением: после применения этот коммит... «исправит рендеринг текста на языках CJK», «добавит поддержку протокола v3», «отрефакторит обработку CRTC» и т. д. Затем добавьте одну пустую строку и переходите к расширенному описанию коммита, которое должно быть жёстко отформатировано в 72 столбца и включать такие детали, как обоснование коммита, компромиссы, ограничения подхода и т. д.Мы используем 72 символа, потому что это стандартная ширина сообщения электронной почты, а электронная почта — важный инструмент для git. Ограничение в 50 символов используется, потому что первая строка становится темой вашей электронной почты, и в начало можно добавить много текста вроде
“[PATCH linux-usb v2 0/13]”
. Вы можете найти такие ограничения форматирования раздражающими и обременительными, но учтите, что другие читают логи не в том же контексте, что и вы. Я часто читаю логи коммитов на вертикальном мониторе, и он не втиснет в одну строку столько текста, сколько ваш дисплей 4K 16:9.Каждый коммит должен быть автономным изменением
Каждый коммит должен содержать только одно изменение — избегайте небольших несвязанных изменений в одном коммите (в этом отношении я мог бы почаще прислушиваться к собственным советам). Кроме того, избегайте разбиения одного изменения на несколько коммитов, если только идея не разбивается на отдельные шаги, каждый из которых представляет собой полноценное изменение. Если в вашем рабочем дереве несколько изменений и вам нужно зафиксировать только некоторые из них, попробуйте
git add -i
или git add -p
. Кроме того, каждый коммит должен компилироваться, успешно проходить все тесты и избегать известных багов, которые будут исправлены в будущих коммитах.Теперь можно взять любой коммит и ожидать, что код будет работать правильно. Это пригодится и позже, например, в процессе выборочного включения коммитов в ветку релиза. Такой подход также повышает полезность git-bisect1, потому что если вы ожидаете, что код скомпилируется и успешно пройдёт тесты для каждого коммита, то вы можете передать
git-bisect
скрипт, который программно проверяет дерево на наличие ошибки и избежит ложных срабатываний. Эти автономные коммиты с хорошими описаниями упростят подготовку описаний релиза с помощью git-shortlog, как это делает Линус с релизами Linux.Трудно сделать всё правильно с первого раза
Мы подходим к одной из самых важных особенностей git, которая отличает его от своих предшественников: редактирование истории. Все системы управления версиями поставляются с какой-то «машиной времени», но раньше они были в основном доступны только для чтения. Однако машина времени git отличается: вы можете изменить прошлое. На самом деле вас даже поощряют делать это! Но предупреждаю: изменяйте только то прошлое, которое ещё не вошло в стабильную публичную ветку.
Суть в следующем. Писать коммиты без ошибок, автономные коммиты с хорошим описанием — трудно с первой попытки. Редактировать историю, наоборот, легко, и это часть эффективного рабочего процесса git. Ознакомьтесь с git-rebase и свободно его используйте. Можете использовать rebase для изменения порядка, объединения, удаления, редактирования и разделения коммитов. Например, я обычно вношу некоторые изменения в файл, отправляю fixup-коммит (
git commit -m fixup
), а затем использую git rebase -i
, чтобы влить его в более ранний коммит.Различные советы
- Читайте маны! Выберите случайную страницу git man и прочитайте её сейчас. Кроме того, если вы не читали страницу git man верхнего уровня (просто
man git
), сделайте это.
- В нижней части каждого мана для команды git высокого уровня обычно находится список команд git низкого уровня, на которые опирается команда высокого уровня. Если хотите узнать больше о том, как работает команда git высокого уровня, попробуйте прочитать эти справочные страницы.
- Узнайте, как выбирать нужные коммиты с помощью rev selection.
- Ветки полезны, но вы должны научиться работать без них, а также иметь хороший набор инструментов на поясе. Используйте команды вроде
git pull --rebase
,git send-email -1 HEAD~2
иgit push origin HEAD~2:master
.
1. В двух словах, git bisect — это инструмент, который выполняет двоичный поиск между двумя коммитами в вашей истории, просматривая коммиты между ними по одному, чтобы вы могли проверить наличие ошибки. Таким образом можно вычислить коммит, который вызвал проблему. ^
Комментарии (17)
questor
25.04.2019 22:29Обычно вы для перевода выбираете более качественные статьи, но в этот раз поставил минус. Статья первым абзацем обещала многое, а вышло пшиком: и по качеству материала, да даже и просто по объёму.
gudvinr
25.04.2019 22:48Сначала подумал точно так же, но потом сходил почитать про
git add -i
.
Почему-то не приходило в голову, что такую мелочь уже интегрировали в Git, и раньше не пользовался по незнанию, но определённо полезная вещь, которая сэкономила бы немало времени и лаконичности коммитам, если бы прошлый я озаботился чтением мануала.TheKnight
26.04.2019 12:24В некоторых IDE уже есть поддержка этого.
Осталось понять в каких. Видел в IDEA-based.
apapacy
25.04.2019 22:32+1Каждый коммит должен содержать только одно изменение — избегайте небольших несвязанных изменений в одном коммите (в этом отношении я мог бы почаще прислушиваться к собственным советам).
Как-то следовал я этому правилу пока не потеря работу целого дня после сбоя кобмпьютера. И тогда я подумал что лучше коммитов будет больше. По бренчам — да — один бренч одна фича.gudvinr
25.04.2019 22:55+1Не буду додумывать за автора, но зачастую это имеет место быть для staging/stable веток и в принципе это довольно хороший тон — не засорять основные ветки мусорными коммитами. Но почему-то мало кто из "гуру статей по гиту" оговаривает, что всем пофигу, что творится с историей коммитов в ветках с фичами и воспринимать это как общее руководство не стоит. Ничто не мешает потом влить одним коммитом в мастер.
Возможно, из-за того что эти материалы расчитаны на новичков, которые в пет-проектах используют одну (или две) ветки, и версионируют всё подряд, при этом перенося такой опыт на профессиональные проекты в будущем.
ctacka
26.04.2019 00:16Влить одним коммитом в мастер значит оставить ветку висеть несмердженной. Хотя, конечно, почти всем пофигу.
mayorovp
26.04.2019 11:41+2Существует такая штука как интерактивный rebase. Позволяет сделать коммитов по-больше, а потом взять и сгруппировать их как нужно.
Tomasina
25.04.2019 22:33Что такое «отформатировано в 72 столбца»?
juray
25.04.2019 23:39+1Значит, каждая строка должна быть длиной 72 знака.
Это со времен текстовых видеорежимов и «алфавитно-цифровых печатающих устройств», знакоместа в которых образовывали прямоугольную матрицу и адресовались строкой и столбцом (колонкой). Сейчас так адресуют пиксели.
До появления SuperVGA таких столбцов на экране IBM-совместимых компьютеров было 80 или 40.
juray
25.04.2019 23:46Мы используем 72 символа, потому что это стандартная ширина сообщения электронной почты
При этом в RFC по ссылке про длину строки сказано: «should be no more than 78 characters, excluding the CRLF», а «72» не встречается нигде. (И да, «should be» здесь значит рекомендуется", а жесткое ограничение прописано так: «MUST be no more than 998 characters»).
Это, разумеется, претензия в сторону автора, а не переводчика.ashumkin
26.04.2019 15:31а «72» не встречается нигде
это Вы, конечно, погорячились (или речь только про RFC?)
см. официальную книгу по Git 5.2 Contributing to a Project: Here is a template originally written by Tim Pope (в русской версии этой ссылки нет)
Let’s start with a few of the reasons why wrapping your commit messages to 72 columns is a good thing.
Также How to Write a Git Commit Message#Wrap the body at 72 characters (русский перевод на Хабре)juray
26.04.2019 15:40именно про RFC. Точнее про «используем в гите нарезку по 72, потому что такое число есть в rfc на электронную почту». Нет там такого числа. В RFC то есть.
catsmile
Угу. В 2019 году писать описание коммита в виме, обязательно обрезая строки по 72 символа. Потому что электронная почта. Почтовые серверы и клиенты наверное взорвутся, если увидят строку в 73 символа.
myxo
я в 2019 году пишу описание коммитов в виме. Что в этом плохого? 0_о
И делать описание коммита кратким — довольно хороший тон. История так просматривается быстрее.
catsmile
Я не про вим, я про 72 разбиение по 32 символа вручную.