Как обычно используют git? Пара базовых команд, чтобы «всех синхронизировать». Разочарование от git часто возникает у тех, кто никогда не выходит за пределы этого поверхностного понимания. Однако освоение git наверняка окупится. Сколько времени вы тратите на использование git? Я бы предположил, что на вашем поясе немало инструментов, которые вы используете вдвое реже и потратили вдвое больше времени на изучение.



Если хотите больше узнать о 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)


  1. catsmile
    25.04.2019 22:10
    +2

    Угу. В 2019 году писать описание коммита в виме, обязательно обрезая строки по 72 символа. Потому что электронная почта. Почтовые серверы и клиенты наверное взорвутся, если увидят строку в 73 символа.


    1. myxo
      26.04.2019 10:09
      +3

      я в 2019 году пишу описание коммитов в виме. Что в этом плохого? 0_о
      И делать описание коммита кратким — довольно хороший тон. История так просматривается быстрее.


      1. catsmile
        26.04.2019 11:36
        +1

        Я не про вим, я про 72 разбиение по 32 символа вручную.


  1. questor
    25.04.2019 22:29

    Обычно вы для перевода выбираете более качественные статьи, но в этот раз поставил минус. Статья первым абзацем обещала многое, а вышло пшиком: и по качеству материала, да даже и просто по объёму.


    1. gudvinr
      25.04.2019 22:48

      Сначала подумал точно так же, но потом сходил почитать про git add -i.
      Почему-то не приходило в голову, что такую мелочь уже интегрировали в Git, и раньше не пользовался по незнанию, но определённо полезная вещь, которая сэкономила бы немало времени и лаконичности коммитам, если бы прошлый я озаботился чтением мануала.


      1. mayorovp
        26.04.2019 11:45

        … а тем временем под Windows существует такая штука как Git Extensions, позволяющая выделить мышкой пару строк файла и нажать S (от Stage). Или U (от Unstage).


        1. fshp
          26.04.2019 13:42
          +1

          Под linux куча приложений для работы с индексом. Я пользуюсь gitg.


      1. TheKnight
        26.04.2019 12:24

        В некоторых IDE уже есть поддержка этого.
        Осталось понять в каких. Видел в IDEA-based.


  1. apapacy
    25.04.2019 22:32
    +1

    Каждый коммит должен содержать только одно изменение — избегайте небольших несвязанных изменений в одном коммите (в этом отношении я мог бы почаще прислушиваться к собственным советам).

    Как-то следовал я этому правилу пока не потеря работу целого дня после сбоя кобмпьютера. И тогда я подумал что лучше коммитов будет больше. По бренчам — да — один бренч одна фича.


    1. gudvinr
      25.04.2019 22:55
      +1

      Не буду додумывать за автора, но зачастую это имеет место быть для staging/stable веток и в принципе это довольно хороший тон — не засорять основные ветки мусорными коммитами. Но почему-то мало кто из "гуру статей по гиту" оговаривает, что всем пофигу, что творится с историей коммитов в ветках с фичами и воспринимать это как общее руководство не стоит. Ничто не мешает потом влить одним коммитом в мастер.


      Возможно, из-за того что эти материалы расчитаны на новичков, которые в пет-проектах используют одну (или две) ветки, и версионируют всё подряд, при этом перенося такой опыт на профессиональные проекты в будущем.


      1. ctacka
        26.04.2019 00:16

        Влить одним коммитом в мастер значит оставить ветку висеть несмердженной. Хотя, конечно, почти всем пофигу.


    1. mayorovp
      26.04.2019 11:41
      +2

      Существует такая штука как интерактивный rebase. Позволяет сделать коммитов по-больше, а потом взять и сгруппировать их как нужно.


  1. Tomasina
    25.04.2019 22:33

    Что такое «отформатировано в 72 столбца»?


    1. juray
      25.04.2019 23:39
      +1

      Значит, каждая строка должна быть длиной 72 знака.

      Это со времен текстовых видеорежимов и «алфавитно-цифровых печатающих устройств», знакоместа в которых образовывали прямоугольную матрицу и адресовались строкой и столбцом (колонкой). Сейчас так адресуют пиксели.

      До появления SuperVGA таких столбцов на экране IBM-совместимых компьютеров было 80 или 40.


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

    Это, разумеется, претензия в сторону автора, а не переводчика.


    1. 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 (русский перевод на Хабре)


      1. juray
        26.04.2019 15:40

        именно про RFC. Точнее про «используем в гите нарезку по 72, потому что такое число есть в rfc на электронную почту». Нет там такого числа. В RFC то есть.