Памятка: Краткий обзор понятий GIT

Примечание: Данная памятка содержит только справочную информацию по основным понятиям git и не предназначена для первоначального ознакомления с git. Для изучения git используйте книгу Pro Git и официальные туториалы.

Репозитарий — директория в которой происходит фиксация изменений в Git. Может быть локальным или удалённым (публичным репозитарием). Удалённый обычно располагается на удаленном сервере, доступ к которому осуществляется по средствам защищенного протокола ssh или https.

Клонирование, clone — процесс получения кода на локальную машину из удаленного репозитария, при этом в конфиге получившегося локального репозитария будет содержаться ссылка на удалённый репозитарий, эта информация используется для синхронизации изменений между ними (команды fetch, push, pull). Git является распределенной системой контроля версий, поэтому эта команда создаст на локальном компьютере полную копию удаленного репозитария, содержащую в себе всю историю изменений всех файлов во всех ветвях (branch) с возможностью переключения между ними. По умолчанию в папке находится код из ветки master самой последней версии (самого последнего комита). И только маленькая скрытая папочка .git выдаёт, что это не просто папка с исходным кодом, а репозитарий.

Комит, commit — фиксированное состояние файлов, к которому всегда можно будет откатиться. Каждому комиту можно (и нужно) давать свой комментарий. Каждому комиту автоматически присваивается уникальный хэш вида dca78e83c644cc3bfbcfa22ba66731161927d9fe, но можно обращаться к нему и по укороченному хэшу dca78e8. Также комитом называют процесс создания фиксированного состояния (команда git commit). По русски «закомитить».

Индексация изменений (add) — процесс подготовки к созданию комита. Чтобы создать новый комит недостаточно просто изменить файлы, их еще надо проиндексировать при помощи команды add. Создание каждого комита должно быть предварено одной или несколькими индексациями файлов. Команда git add . индексирует все файлы в рабочей директории.

HEAD — текущий комит, который в данный момент загружен в рабочей папке репозитария.

Чекаут (checkout) — процесс перехода от одного комита к другому (выгрузка в рабочую папку).

Ветка (branch) — что-то вроде копии кода на флешке. Отдельная ветка комитов, которая создается с целью что-то добавить или исправить в коде, и чтобы при этом не мешать другим разработчикам. Все ветки имеют имена. По умолчанию все комиты добавляются в ветку master. Ветки могут быть локальными или удаленными (в публичном репозитарии).

Слияние (merge) — процесс слияния (соединения) двух веток в одну. Обычно приводит к появлению конфликтов — ситуаций, когда один и тот же файл отличается в разных ветках. В этом случае команда git merge завершится с ошибкой, а все конфликтующие файлы в рабочей директории будут заменены на файлы вида:

main()
{
<<<<<<< HEAD
        printf("hello world");
=======
        printf("hello from master branch");
>>>>>>> master
}

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

Допустим, первый разработчик называет комиты цифрами, а второй буквами.

    /-a-b-c
   /
0-1-2-3-4-5-6

После разрешения конфликта и слияния структура репозитория примет вид:

    /-a-b-c-\
   /         \
0-1-2-3-4-5-6-7

Перебазирование, rebase — процесс слияния двух веток с переносом начала ветки в новое место. Также приводит к появлению конфликтов — ситуаций, когда один и тот же файл отличается в разных ветках. В редких случаях перебазирование может завершаться без конфликта, если во второй ветке файлы не изменялись, а только добавлялись (fast forward).

Тот кто делает перебазирование должен вручную разрешить конфликт, исправив конфликтующие файлы, после чего выполнить git rebase --continue.

После разрешения конфликта и перебазирования структура репозитория примет вид:

              /-a-b-c
             /
0-1-2-3-4-5-6

Получение изменений, fetch — обновление локальной версии из удалённого репозитария без перезаписи существующего кода в локальном репозитарии. После выполнения этой команды все новые комиты из удалённого репозитария будут скопированы в отдельную ветку с названием «origin/master». Для слияния изменений следует выполнить git merge origin/master.

Получение изменений, pull — эквивалентна комбинации git fetch & git merge origin/master.

Отправка изменений, push — обновление удалённой версии из локального репозитария git push shared master.

Тикеты и пулл реквесты

Следующие понятия не относятся напрямую к Git, но реализованы в сервисах гитлаба, для удобства и являются частью подхода Feature branch workflow.

Issue, тикет, публикация, запрос, проблема — указание на отсутствующий функционал либо на наличие ошибки. Может быть закрыто при помощи pull request.

Реквест, просьба, request, pull request — указание на то, что проблема описанная в issue решена в какой-то ветке. Если проводить аналогию, то это когда второй программист добавил кнопку и приносит на флешке исправленный код на проверку первому программисту. При помощи реквеста, тот кто решил проблему просит остальных разработчиков или кого-то конкретно, проверить его решение и высказать своё мнение. Те кого просят (reviewers) должны либо одобрить изменение (approve), либо высказать свои пожелания в комментариях на странице реквеста. Когда реквест одобрен всеми он (автоматически) закрывает собой соответствующий issue.

Смотри далее:

Дополнительные материалы: