Webdevkin
Онлайн-курсы, статьи по веб-разработке и интернет-магазинам, уроки vue.js

Git для начинающих. Урок 4.
Коммиты и история коммитов
Работа с файлами

Урок, в котором мы узнаем, что такое коммит, из чего он состоит, а также сделаем первые коммиты, посмотрим историю и научимся работать с файлами в git

Видеоурок. Часть 1. Практика, основы работы с коммитами и историей коммитов

Видеоурок. Часть 2. Практика, дополнительные приемы и фишки

Видеоурок. Часть 3. Общие наблюдения и советы. Как делать "хорошие" коммиты

Конспект урока

Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.

Что такое коммит

По-научному это сохранение состояния, фиксация или слепок изменений.

Чуть менее научно, коммит - зафиксированный набор изменений, который показывает, какие файлы изменились и что именно в них изменилось. Рассмотрим на примере.

Как сделать коммит

Представим, что мы добавляем блок учеников на сайт. Добавляем новую разметку в index.html и новые стили в main.css. Чтобы сохранить изменения, нужно их закоммитить. Но предварительно сообщить git, какие именно файлы мы хотим положить в коммит. Команда git add добавляет (или подготавливает) файлы к коммиту. Можно добавить файлы по отдельности, вот так


    $ git add index.html
    $ git add css/main.css

А можно все сразу


    $ git add .

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


    $ git reset css/main.css

Создаем сам коммит


    $ git commit -m 'Added block students'

Флаг -m задает сообщение коммита (commit message). Оно нужно, чтобы описать изменения, которые делает этот коммит. Подписывайте коммиты так, чтобы было понятно, что в нем происходит.

Состояние файлов в git. Измененные и подготовленные файлы

Измененные файлы - это те файлы, которые мы успели изменить с момента последнего коммита

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

git add filename добавляет или подготавливает файл к коммиту.
git reset filename удаляет файл из подготовленных к коммиту.

Содержимое файлов при этом не меняется. Один файл может одновременно находиться и в измененных, и в подготовленных. Это происходит, если мы добавили файл, но не закоммитили и продолжили делать в нем измения.

Из чего состоит коммит

Каждый коммит имеет

  • хэш (уникальный id), например, 239892a996...4784cf57f7
  • commit message (сообщение), например "Added block news"
  • список измененных файлов, например, index.html и css/main.css
  • изменения по каждому файлу, это то же самое, что показывает команда git diff из предыдущего урока
  • Как добавить файлы и сделать коммит одной командой

    
        $ git commit -a -m 'Commit message'
    

    git commit с флагом -a добавит все файлы и создаст коммит. Но осторожно, не увлекайтесь этим, потому что по ошибке легко включить в коммит лишние файлы.

    Отслеживаемые и неотслеживаемые файлы

    Отслеживаемые файлы - это те, в которых git отлавливает изменения и показывает их через git status и git diff. В нашем проекте файлы index.html и css/main.css - отслеживаемые.

    Неотслеживаемые файлы - это файлы, изменения в которых git не отлавливает. Новый файл в проекте по умолчанию попадает в неотслеживаемые. Добавить новый файл в рабочую область git можно командой git add filename

    История коммитов, git log

    Все коммиты можно посмотреть в истории коммитов. История хранит все данные обо всех коммитах проекта. Показывается история командой

    
        $ git log
    

    История включает в себя все сведения о коммитах: хэш, автор, дата и список изменений. Список изменений смотреть командой git show по хэшу коммита

    
        $ git show hash_commit
    

    Переименование последнего коммита, git commit --amend

    Если мы сделали коммит, но хотим поправить его commit message

    
        $ git commit --amend -m 'New commit message'
    

    Эта команда перезапишет сообщение последнего коммита. Это перезаписывание истории, операция опасная. Лучше делать ее только до того, как отправили коммит на сервер (push разберем через урок)

    Если коммит успели запушить, то переименовывать коммиты нужно осторожно, как именно - во второй части курса.

    Откат коммитов, git revert

    Если мы сделали неверный коммит и хотим откатить изменения, сделанные в нем, то поможет команда git revert

    
        $ git revert hash_commit
    

    При этом откроется дефолтный текстовый редактор, который предолжит ввести commit message. Если мы хотим оставить commit message по умолчанию, то можно обойтись без открытия редактора с помощью флажка --no-edit

    
        $ git revert --no-edit hash_commit
    

    Работа с файлами

    При работе с файлами нужно учесть, что новые файлы git отправляет в неотслеживаемые. Поэтому при добавлении нового файла стоит сначала его закоммитить, а потом вносить изменения, чтобы они были доступны через git diff

    При обычном переименовании файла в файловом менеджере или командой mv git сначала показывает 2 файла: старый удаленный и новый неотслеживаемый. Чтобы git понял, что этот файл именно переименованный, нужно сначала добавить эти файлы в подготовленные к коммиту

    
        $ git add .
    

    Тогда при команде git status файл будет отображаться именно как переименованный

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

    
        $ git mv about.html company.html
    

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

    
        $ git rm about.html
    

    Командная строка vs IDE

    Работа в PhpStorm продемонстрирована в первых двух частях видео.

    Как и в прошлом уроке мы видим, что некоторые вещи удобнее делать в IDE. Например, процесс добавления файлов (git add) в PhpStorm при создании коммита почти не привлекает внимания. Но важно понимать, что такое git add и зачем он нужен. И что любая IDE под капотом все равно выполняет базовые команды git. Просто для нас предоставляется удобная обертка, чтобы мы больше сосредоточились на самом проекте, а не на git.

    Наблюдения и советы при работе с коммитами

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

    • коммит - это законченный функционал
    • всегда проверяйте перед коммитом, что в него попадет. git diff - наш лучший друг
    • выделяйте мелкие баги и правки в отдельные коммиты
    • маленький коммит в одну строку - это нормально
    • видите много изменений - подумайте, можно ли разбить их на отдельные коммиты
    • мыслите задачей, а не файлами. Выделяйте полезное действие коммита
    • commit message говорит, ЧТО делает коммит, а не КАК делает
    • коммит-рефакторинг - это нормально. Не стоит мешать его с другими задачами
    • git плохо работает с бинарниками (картинками, pdf, видеофайлами) - видит факт изменения, но не сами изменения
    • подписывайте коммит так, чтобы можно было проследить историю развития проекта

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

    Используйте удобные инструменты в IDE, но не забывайте командную строку. В ней вы лучше будете понимать, как устроен git, как он работает

    Хорошие и плохие коммиты

    С точки зрения git коммиты не бывают плохими и хорошими. Но есть удачные и неудачные подписи к коммитам с точки зрения наших коллег. Несколько примеров

    Изменен файл index.html
    Добавлен блок новостей
    В первом коммите непонятно, что он делает, во втором - ясно описана задача

    Изменены стили баннера
    Растянули баннер на всю ширину окна
    Первый коммит говорит только об изменениях стилей баннера, второй - точно, что именно изменено. Больше информации

    Добавлен файл VipClient
    Работа с vip-клиентами вынесена в отдельный класс
    По первому коммиту можно предположить, что в VipClient мы скорее всего работаем с ВИПами. Во втором коммите это точно понятно, плюс дополнительная информация, что это отдельный класс.

    Поправлены стили в main.css
    Рефакторинг стилей в main.css
    Первый коммит говорит о правке стилей, но непоянтно, что именно поправлено. Бага? Новые значения? Изменен цвет текста по рекомендации дизайнера? Второй коммит ясно указывает, что это рефакторинг

    Маленький фикс
    Исправлена опечатка в заголовке title страницы "О компании"
    Коммит "маленький фикс" даже приблизительно не говорит, в чем он заключается. Второй коммит дает полное представление

    Немного о философии коммитов

    Концепция коммитов заставляет если не менять подход к разработке, то по-другому к ней относиться. С git нам приходится не просто писать код, а планировать его написание. Планировать задачи, над которыми мы работаем. Декомпозировать задачи, то есть разбивать их на небольшие части.

    Мы больше думаем о том, что мы работаем не одни, а в команде. История коммитов общая для всего проекта. Чем лучше мы научимся формировать и подписывать коммиты, тем легче будет ориентироваться в истории нам самим и нашим коллегам.

    В любом проекте важны не только код и его структура, но и история коммитов и хорошие commit message.

    git good commit message

    На этом все. В следующем уроке мы будем больше работать с историей коммитов и посмотрим различные варианты использования команды git log

    Спасибо за внимание и до встречи!

    Понравилось? Поделись с другими :-)