1. Что такое ветви в Git
Ветки (branches) — это механизм, позволяющий создавать отдельные линии разработки, которые могут быть независимо изменены без влияния на другие ветки.
Ветка в Git — это набор коммитов, расположенных в хронологическом порядке. У каждой ветки есть своё название. Основная ветка чаще всего называется master; она появляется при инициализации репозитория и считается главной веткой проекта.
main, поскольку термин «master» ассоциируется с устаревшими историческими контекстами. На GitHub новые репозитории создаются с веткой main по умолчанию.
Виды веток
| Тип ветки | Назначение |
|---|---|
master / main |
Основная ветка. Используется для стабильных релизов. |
| Feature branches | Временные ветки для работы над конкретной функциональностью или задачей. После завершения объединяются обратно. |
| Bugfix branches | Ветки исправлений. Используются для изоляции и исправления ошибок без воздействия на основной код. |
| Release branches | Создаются для подготовки к выпуску новой версии продукта. |
Зачем использовать ветки
- Управление версиями: разработчики могут работать над разными функциями в отдельных ветках, не затрагивая основной код.
- Коллаборация: разные разработчики работают над разными ветками и интегрируют изменения без конфликтов.
- Изоляция изменений: ветки позволяют проверить изменения до интеграции в основную ветку.
2. Основные операции с ветками
Команда git branch нужна для работы с ветвлением в Git. С её помощью можно создавать новые ветки, просматривать, переименовывать и удалять существующие.
| Команда | Описание |
|---|---|
git branch |
Отображение списка веток в репозитории (синоним git branch --list). |
git branch <branch> |
Создание новой ветки. Не переключается на неё. |
git branch -d <branch> |
Безопасное удаление. Git откажет, если в ветке есть неслитые изменения. |
git branch -m <branch> |
Переименовать текущую ветку. |
git branch -a |
Вывод списка всех веток, включая удалённые. |
git checkout <branch> |
Переключиться на ветку. |
git checkout -b <branch> |
Создать новую ветку и сразу переключиться на неё. |
git branch -D feature принудительно удаляет ветку, даже если в ней есть неслитые коммиты. Все коммиты этой ветки будут потеряны безвозвратно (если нет их хэшей). Используйте git branch -d (строчная буква d) — Git не даст удалить ветку с неслитыми изменениями и защитит от случайной потери данных.
git switch -c <branch> — более интуитивная замена git checkout -b. Разделяет операции переключения веток и восстановления файлов. ⚠️ Проверить по документации — доступно начиная с Git 2.23.
# Старый способ (из лекции):
git checkout -b gitignore
# Современный способ (git 2.23+):
git switch -c gitignore
3. Переключение на удалённую ветку
При совместной работе команды нередко используют удалённые репозитории. Каждый удалённый репозиторий содержит собственный набор веток. Для переключения на удалённую ветку нужно сначала извлечь её содержимое.
Шаг 1 — извлечь все удалённые ветки
git fetch --all
Шаг 2 — переключиться (современный Git)
git checkout <remotebranch>
Старый способ — создать локальную ветку на основе удалённой
git checkout -b <remotebranch> origin/<remotebranch>
Переключиться и сбросить до последнего коммита удалённой ветки
git checkout -b <branchname>
git reset --hard origin/<branchname>
git reset --hard origin/<branch> безвозвратно удаляет все незакоммиченные изменения в рабочем каталоге. Если вы сделали изменения, которые не хотите терять, сначала спрячьте их через git stash или сохраните в отдельную ветку. Восстановить файлы после reset --hard без резервных копий невозможно.
4. Открепленные указатели HEAD (Detached HEAD)
Открепленный указатель HEAD — состояние в Git, когда HEAD (указатель на текущий коммит) указывает на определённый коммит, а не на конкретную ветку.
Когда возникает Detached HEAD
- При переключении на определённый коммит с помощью его хэша, а не имени ветки.
- При использовании команды
git checkout <хэш коммита>.
Особенности
- Отсутствие связи с веткой: HEAD не указывает на конкретную ветку — новые коммиты не будут автоматически добавляться ни в какую ветку.
- Временное состояние: используется для просмотра истории или выполнения экспериментальных изменений.
Если вы находитесь в состоянии Detached HEAD и создаёте новые коммиты, эти коммиты могут быть потеряны, если вы забудете сохранить их хэш или создать ветку. Git «не знает» куда отнести эти коммиты и может их удалить при следующей сборке мусора (garbage collection).
Безопасная альтернатива: если вы оказались в Detached HEAD и хотите сохранить изменения — немедленно создайте ветку:
# Создать ветку из текущего состояния Detached HEAD
git checkout -b my-save-branch
# или современный синтаксис:
git switch -c my-save-branch
5. Файл .gitignore
Файл .gitignore — текстовый файл, используемый в Git для указания файлов и каталогов, которые не должны отслеживаться системой контроля версий.
Зачем нужен .gitignore
- Исключает временные файлы, файлы конфигурации или бинарные файлы из репозитория.
- Предотвращает случайное добавление чувствительных данных (паролей, API-ключей) в репозиторий.
Установка
- Создайте новый текстовый файл в корневом каталоге репозитория.
- Назовите файл
.gitignore. - Скачать пример готового файла:
# Скачать пример .gitignore из репозитория курса
curl -O https://raw.githubusercontent.com/aliaskov/bashscripts/master/.gitignore
Пример: github.com/aliaskov/bashscripts/.gitignore
Синтаксис файла .gitignore
| Паттерн | Значение | Пример |
|---|---|---|
* |
Любое количество символов в имени файла | *.log — все .log файлы |
? |
Один символ в имени файла | file?.txt — file1.txt, file2.txt |
[] |
Символьный класс (диапазон символов) | file[0-9].txt |
! |
Исключает файл из игнорирования (отменить правило) | !important.log |
# |
Комментарий | # Временные файлы |
Глобальный .gitignore
Можно создать глобальный файл .gitignore для игнорирования файлов во всех репозиториях на вашей машине:
git config --global core.excludesfile ~/.gitignore_global
6. Git clone и Git fork
git clone
git clone — команда для создания локальной копии удалённого репозитория.
- Клонирование: копирует все файлы, историю коммитов и ветки на ваше устройство.
- Рабочая копия: вы получаете полную рабочую копию проекта — можно редактировать и коммитить.
- Автоматический remote: по умолчанию устанавливает удалённый репозиторий как
origin.
git clone git@github.com:user/repo.git
git clone https://github.com/user/repo.git
git fork
Fork — операция на платформе (GitHub, GitLab), которая создаёт независимую копию репозитория на платформе, связанную с исходным.
- Создание копии: fork позволяет создать копию проекта, независимую от оригинала.
- Изолированное пространство: можно вносить изменения, коммитить и пушить в свой fork независимо.
- Pull Request: fork позволяет предложить изменения в исходный репозиторий через pull request.
Пример: на платформе GitHub перейдите на страницу github.com/aliaskov/bashscripts и нажмите кнопку «Fork».
Отличие clone от fork
| Аспект | git clone | fork |
|---|---|---|
| Где происходит | Локально (ваш компьютер) | На платформе (GitHub/GitLab) |
| Связь с оригиналом | Через remote origin | Сохраняет upstream-ссылку |
| Права на push | Только если есть доступ | Полный доступ к своему fork |
| Предложение изменений | Напрямую (если есть права) | Через Pull Request |
7. Git stash — временное хранилище изменений
В процессе написания кода может возникнуть ситуация, когда нужно срочно переключиться на другую ветку, но текущие изменения ещё не готовы к коммиту — при этом терять их нельзя. В таком случае поможет команда git stash.
Git stash перемещает текущие изменения в локальную директорию-хранилище (стек), скрывая их отдельно с возможностью вернуть позже.
# Спрятать текущие изменения
git stash
# Вернуть спрятанные изменения (последние)
git stash pop
# Посмотреть список спрятанных изменений
git stash list
# Применить конкретный stash без удаления из стека
git stash apply stash@{0}
git stash drop stash@{0} — удалить конкретный stash; git stash clear — очистить весь стек. ⚠️ Проверить по документации.