Шпаргалка по Git
Конспект посвящён основам работы с распределённой системой контроля версиями (Git).
О Git
Git — система контроля версий, которая помогает отслеживать изменения в проекте. Он позволяет сохранять изменения локально и при необходимости возвращаться к предыдущим версиям проекта.
Все файлы, связанные с контролем версий (ну почти все), находятся в директории /.git
.
Состояния
Файлы в Git могут быть в четырёх состояниях: untracked (неотслеживаемый), tracked (отслеживаемый), staged (подготовленный) и modified (изменённый)
flowchart LR; A[untracked] --> |git add| B(staged); B --> |Some changes| C(modified); C --> |git add| B; B --> |git commit| D[tracked/committed]; D --> |Some changes| C;flowchart LR; A[untracked] --> |git add| B(staged); B --> |Some changes| C(modified); C --> |git add| B; B --> |git commit| D[tracked/committed]; D --> |Some changes| C;
В некоторых случаях файл может быть в статусах staged
и modified
одновременно (вернее было бы сказать, что разные версии этих файлов находятся в разных статусах).
Лог и хэш коммита
Хеш — основной идентификатор коммита. Он позволяет узнать его автора, дату и содержимое закоммиченных файлов. Все хеши, а также таблицу соответствий хеш → информация о коммите
Git хранит в папке .git
.
HEAD
Файл HEAD
— один из служебных файлов папки .git
. Он указывает на последний коммит или на ветку, которая, в свою очередь, указывает на последний коммит. Внутри HEAD
— ссылка на служебный файл: refs/heads/main
. Если заглянуть в этот файл, можно увидеть хеш последнего коммита.
Сообщения к коммитам
Сообщения должны быть:
- Относительно короткими
- Информативными
- На английском языке
- Начинаться с заглавной буквы
- В повелительном наклонении
- В одном стиле
.gitignore
Файл .gitignore
нужен, чтобы Git
не добавлял в репозиторий файлы, указанные в этом файле (файлы останутся “untracked”). В gitignore
можно указать названия файлов, которые не нужны в репозитории. Внутри поддерживаются регулярные выражения.
Небольшой шаблон .gitignore
для Python-проекта:
|
|
Работа с Git
Создание репозитория
git init
— Инициализация локального репозитория.
Настройки
|
|
Работа с коммитами и индексами
|
|
Просмотр изменений
|
|
Клонирование репозитория
git clone git@github.com:<USERNAME>/<REPONAME>.git
— клонирует удалённый репозиторий на локальный хост и связывает их, если этот удалённый репозиторий принадлежит пользователю хоста.
Работа с ветками
|
|
Работа с удалёнными репозиториями
|
|
Прочие команды
git version
— показывает версию Git;git config
— нужна для просмотра и изменений настроек Git;git status
— выводит в консоль статусы файлов в локальном репозитории;git status --ignored
— выводит в консоль статусы файлов, в том числе игнорируемых;git remote -v
— выводит информацию о том, связан ли локальный репозиторий с удалённым;git mergetool
— открывает vimdiff (по умолчанию) — инструмент для разрешения конфликтов.
Алгоритмы
Коммит-пуш
Типичный алгоритм коммита-пуша:
|
|
Привязка удалённого репозитория
Алгоритм создания и привязки удалённого репозитория:
- Создать удалённый репозиторий в GitHub
- Сгенерировать SSH-ключ (если ещё нет):
1
ssh-keygen -t ed25519 -C "электронная почта, к которой привязан аккаунт на GitHub"
- Копировать открытый ключ командой
cat ~/.ssh/id_ed25519.pub
- Добавить созданный ключ на GitHub
- Привязать удалённый репозиторий командой
git remote add origin <ссылка_на_удалённый_репозиторий>
и убедиться, что репозитории связаны:git remote -v
В выводе должно быть:1 2
origin git@github.com:%ИМЯ_АККАУНТА%/%ИМЯ-ПРОЕКТА%.git (fetch) origin git@github.com:%ИМЯ_АККАУНТА%/%ИМЯ-ПРОЕКТА%.git (push)
Форк репозитория
Форк — создание копии репозитория в GitHub. В процессе форка создаются копии всех файлов, веток и истории коммитов.
Чтобы сделать форк, нужно нажать на соответствующую кнопку в репозитории проекта:
Теперь репозиторий можно клонировать локально, вносить необходимые изменения и отправлять их.
Создание ветки и слияние с основной
Допустим, в работающий проект нужно добавить новые функции. Для этого лучшей практикой считается создание новой ветки, в которой будет проходить разработка и тестирование. Если изменения удачны, их заливают в релиз путём объединения веток.
Посмотрим на алгоритм подобных действий:
- Создать ветку и перейти в неё:
git checkout -b dev
; - Выполнить необходимые коммиты;
- Протестировать;
- Перейти в главную ветку и слить ветку с главной:
git checkout main && git merge dev
. При этом обе ветки теперь будут указывать на последний коммит веткиdev
; - Удалить второстепенную ветку (она должна быть неактивной):
git branch -d dev
.
Pull request
Pull request — запрос на изменения. Его используют, чтобы предложить свои улучшения по проекту. PR могут как принять, т.е. слить с веткой оригинального проекта, так и отклонить. Важно также понимать, что pull request — фича GitHub (и ему подобных), а не Git.
Чтобы создать PR, можно следовать алгоритму:
- Создать форк репозитория;
- Клонировать локально;
- Связать с оригинальным репозиторием, чтобы отслеживать изменения:
git remote add <имя_привязки> <ссылка_на_удалённый_репозиторий>
->git fetch <имя_привязки>
- Создать новую ветку:
git branch <branch_name>
; - Выполнить необходимые изменения;
- Протестировать;
- Запушить;
- Перейти в свой удалённый репозиторий -> Pull requests -> New pull request. Выбрать ветки: из какой и в какую пойдёт предложение изменений. -> Create pull request -> Заполнить поля -> повторно Create pull request.
Теперь на вкладке Files changed можно обсуждать изменения и делать ревью. Также можно в любой момент добавить дополнительные коммиты в ветку — они автоматически попадут в открытый pull request после пуша.
Если изменения подходят, владельцу оригинального репозитория достаточно нажать “Merge pull request”, чтобы объединить ветки.
Разрешение конфликта
- Открыть конфликтный файл в IDE или mergetool:
git mergetool <file_name>
и разрешить конфликт; - Сделать коммит — он завершит процесс слияния веток.
