От создания до командной работы: разбираем два сценария, именование веток, Pull Request, Merge и полный цикл разработки с анимациями в терминале.
Есть два принципиально разных сценария создания ветки. Второй — это обычная практика разработки, с ней вы столкнётесь в 99% случаев. Первый используется редко, но знать о нём полезно.
Такая ветка не содержит ни одного файла и ни одного коммита из main. Она начинается с чистого листа — как будто вы только что создали новый репозиторий, но внутри уже существующего.
gh-pages со статическим сайтом.Это именно тот вариант, который используется практически всегда. Новая ветка начинается с того же коммита, на котором находится main, и дальше живёт своей жизнью.
$ git push -u origin feature/login
Enumerating objects: 5, done.
remote: Create a pull request for 'feature/login' on GitHub by visiting:
remote: https://github.com/you/repo/pull/new/feature/loginПосле этого можно создавать Pull Request (или Merge Request в GitLab).
Вы могли заметить, что в примерах ветка называется feature/login. Это не правило Git — это соглашение, которое используют почти все команды. Git разрешает практически любые имена: dev, my_branch, ivan, test123 — всё будет работать.
Название состоит из двух частей, разделённых символом /:
feature/
Новая функциональность
bugfix/
Исправление ошибки
hotfix/
Срочная правка в продакшене
refactor/
Изменение кода без новой функциональности
docs/
Изменения документации
test/
Добавление тестов
chore/
Технические задачи (Docker, CI/CD, зависимости)
Для Git feature/login и feature-login почти одинаковы. Но человеку гораздо удобнее видеть структуру. Сравните:
Сразу видно, какая ветка для чего. GitHub и GitLab тоже группируют такие ветки визуально, поэтому их проще искать.
feature/login — добавляем авторизациюfeature/google-auth — вход через Googlefeature/user-profile — профиль пользователяbugfix/login-error — исправляем ошибку входаhotfix/payment-crash — срочная правка оплатыrefactor/auth-service — рефакторинг сервиса авторизацииОчень часто ветки называют по номеру задачи из Jira:
feature/PROJ-125-login
bugfix/PROJ-241-auth-errorСразу понятно, к какой задаче относится код.
Если вы работаете один, достаточно простой схемы:
feature/login
feature/docker
feature/parser
bugfix/auth
bugfix/nginx
refactor/api
docs/readmegit switch -c feature/login и git switch -c banana. Обе создадут ветку. Разница только в том, что feature/login сразу говорит разработчикам: «в этой ветке разрабатывается авторизация», а banana не несёт никакой полезной информации.
Когда вы создаёте новую ветку командой git switch -c feature/login, Git не копирует файлы. Он просто создаёт новый указатель на существующий коммит.
Практически всегда используйте второй вариант:
$ git switch -c имя_ветки
# или старый синтаксис
$ git checkout -b имя_ветки
Именно так работают команды в большинстве проектов: клонируют репозиторий, создают ветку от main (или develop), делают изменения, затем отправляют ветку в удалённый репозиторий и создают Pull Request. Первый вариант (--orphan) нужен только для специальных случаев, когда новая ветка должна иметь полностью независимую историю.
Это один из самых важных моментов в Git. Многие путают Git и GitHub/GitLab.
$ git clone repo.git
Cloning into 'repo'...
remote: Enumerating objects: 3, done.
$ git switch -c dev
Switched to a new branch 'dev'
Добавляем новый файл file2.txt со словом "Мир" и меняем file1.txt — добавляем второе слово:
$ git add .
$ git commit -m "Добавил второй файл"
[dev b2f3a1c] Добавил второй файл
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 file2.txt
$ git push origin dev
Enumerating objects: 4, done.
To github.com:you/repo.git
* [new branch] dev -> dev
Теперь на GitHub появились две ветки. Но main вообще не изменился. Это очень важно понимать.
Pull Request означает буквально: "Прошу забрать мои изменения."
Вы говорите владельцу проекта:
На GitHub вы нажимаете кнопку "Create Pull Request". Что увидит другой разработчик?
Ревьюер может написать комментарий: "Здесь ошибка", "Добавь ещё один тест" или "Всё отлично".
Если всё хорошо, нажимается кнопка "Merge Pull Request". И только теперь происходит merge — объединение двух веток.
Обычно после merge рабочую ветку удаляют:
Представьте, что в компании работают 20 разработчиков. Если каждый будет писать сразу в main, получится хаос:
file1.txtfile1.txtfile1.txtВсе одновременно. Никто ничего не проверяет. В итоге главный проект может перестать работать.
Поэтому используют такую схему:
Многие новички думают, что Pull Request и Merge — это одно и то же. На самом деле это разные этапы.
Именно здесь начинается реальная командная работа, и это тот момент, который вызывает больше всего путаницы у новичков. Разберём весь цикл.
После merge в main теперь:
Другой разработчик берёт уже новый main. Он создаёт свою ветку feature/admin, добавляет file3.txt со словом "Админка" и делает коммит. После его merge в main появляется новый коммит.
На его компьютере до сих пор старый main. Он вообще ничего не знает про новый коммит на сервере.
main не обновляется автоматически. Нужно сделать это вручную.Важно понимать: git fetch ничего не меняет в ваших файлах. Он только говорит Git: "На сервере появился новый коммит".
А что с веткой dev? Она осталась старой — каждая ветка это снимок истории на момент её создания.
Теперь нужно обновить dev. Переходим в неё и объединяем изменения из main:
$ git switch dev
Switched to branch 'dev'
$ git merge main
Updating a1b2c3d → e4f5g6h
Fast-forward
file3.txt | 1 +
1 file changed, 1 insertion(+)
Теперь разработчик делает изменения — например, создаёт file4.txt или меняет file3.txt:
$ git add .
$ git commit -m "Добавил настройки админки"
$ git push origin dev
Открываем новый Pull Request → после merge в main появляется ещё один коммит.
Представим: в main файл file3.txt содержит слово "Админка". Вы обновили ветку dev из main. Потом решили изменить "Админка" на "Панель администратора".
Но в это время другой разработчик уже изменил тот же файл в main: "Админка" → "Административная панель".
Когда вы выполняете git merge main, Git видит: один и тот же участок файла изменили два человека. Сам решить он уже не может. Появляется merge conflict.
Git попросит вручную выбрать, какой текст оставить, либо объединить оба изменения.
На практике цикл выглядит так:
git merge main или git rebase main)git pulldev. После слияния Pull Request рабочую ветку обычно удаляют, обновляют локальный main (git pull) и создают новую ветку от актуального main для следующей задачи, например feature/user-profile или bugfix/login-error. Так история остаётся чище, а вероятность конфликтов уменьшается.
# Утро: синхронизируемся с сервером
$ git switch main
$ git pull
# Создаём новую ветку под задачу
$ git switch -c feature/название-задачи
# Работаем, коммитим, пушим
$ git add .
$ git commit -m "Описание изменений"
$ git push -u origin feature/название-задачи
# Создаём Pull Request на GitHub
# Ждём ревью → merge
# После merge: возвращаемся в начало цикла
$ git switch main
$ git pull
Шпаргалка самых важных команд. Сохраните себе — пригодится.
git init
Создать новый репозиторий в текущей папке
git clone <url>
Скачать репозиторий с сервера к себе
git config --global user.name "Имя"
Задать имя автора для всех коммитов
git config --global user.email "mail"
Задать email автора для всех коммитов
git status
Показать изменённые файлы и текущую ветку
git log
Показать историю коммитов
git log --oneline
Компактный вид истории (один коммит — одна строка)
git diff
Показать, что изменилось в файлах
git add <файл>
Подготовить файл к коммиту (добавить в индекс)
git add .
Подготовить все изменённые файлы сразу
git commit -m "сообщение"
Сохранить подготовленные изменения с описанием
git commit --amend
Исправить последний коммит (изменить сообщение или файлы)
git branch
Показать список локальных веток
git branch <имя>
Создать новую ветку (без переключения)
git switch <имя>
Переключиться на другую ветку
git switch -c <имя>
Создать новую ветку и сразу переключиться на неё
git branch -d <имя>
Удалить локальную ветку
git merge <ветка>
Влить изменения из указанной ветки в текущую
git rebase <ветка>
Перенести коммиты текущей ветки на верх другой
git fetch
Скачать изменения с сервера, не трогая файлы
git pull
Скачать и сразу применить изменения с сервера (fetch + merge)
git push
Отправить свои коммиты на удалённый сервер
git push -u origin <ветка>
Отправить ветку и связать её с удалённой
git push origin --delete <ветка>
Удалить ветку на удалённом сервере
git stash
Временно спрятать незакоммиченные изменения
git stash pop
Вернуть спрятанные изменения
git reset --soft HEAD~1
Отменить последний коммит, сохранив изменения
git checkout -- <файл>
Отменить изменения в файле (вернуть к последнему коммиту)
git status,
git add .,
git commit,
git push,
git pull,
git switch -c
Освойте их — и вы уже сможете работать в большинстве проектов.