Git Handbook

Минималистичный справочник по Git с объяснением флагов, привычными рабочими сценариями и аккуратными кнопками копирования в каждом сниппете.

1) Старт и настройка

Базовые команды, чтобы создать репозиторий, клонировать проект и настроить автора коммитов.

Создать репозиторий или получить существующий

Инициализация и клонирование
git init
git clone <url>
git clone -b main <url>
-b Указывает ветку, которую нужно сразу checkout после clone.

Настроить имя и email

Настройка автора
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
git config --global init.defaultBranch main
git config --list
--global Сохраняет настройку глобально для всех репозиториев пользователя.
--list Показывает все доступные настройки Git.

2) Проверка состояния и изменений

Эти команды помогают понять, что изменилось локально и что уже попало в staging area.

Статус и diff
git status
git status -sb
git diff
git diff --staged
git diff HEAD
-s Короткий формат вывода статуса.
-b Показывает текущую ветку и связь с upstream.
--staged Показывает diff только для файлов, уже добавленных в staging.
Практика: перед коммитом удобно идти так: git statusgit diffgit add ...git diff --staged.

3) Добавление изменений и коммиты

Это основной ежедневный цикл: выбрать изменения, добавить их в staging и сделать commit.

Добавить изменения

git add
git add <file>
git add .
git add -A
git add -p
-A Добавляет все изменения: новые, изменённые и удалённые файлы.
-p Интерактивный режим: позволяет выбирать изменения по кускам.

Сделать commit

git commit
git commit
git commit -m "feat: add login form"
git commit -am "fix: update button state"
-m Позволяет указать сообщение коммита прямо в команде.
-a Автоматически добавляет в commit все уже отслеживаемые изменённые файлы.
Важно: git commit -am не добавляет новые untracked файлы. Для новых файлов всё равно нужен git add.

4) Ветки: switch и checkout

Сейчас чаще используют git switch, но git checkout -b всё ещё очень распространён в реальных проектах.

Современный стиль через switch

switch и branch
git branch
git branch -a
git switch main
git switch -c feature/login-form
git branch -d feature/login-form
git branch -D feature/login-form
git branch -m feature/auth-form
-a Показывает все ветки: локальные и удалённые.
-c Создаёт новую ветку и сразу переключает на неё.
-d Безопасно удаляет ветку, если она уже слита.
-D Принудительно удаляет ветку.
-m Переименовывает ветку.

Привычный стиль через checkout

git checkout
git checkout main
git checkout -b feature/login-form
git checkout <commit>
git checkout -- <file>
-b Создаёт новую ветку и сразу переключает на неё.
-- Отделяет имя файла от других аргументов команды.
Замечание: для переключения между ветками сейчас удобнее git switch, а для восстановления файлов — git restore. Но git checkout -b ... всё ещё стоит знать.

5) Remote и синхронизация

Набор команд, чтобы посмотреть remote, получить обновления и отправить свою ветку.

remote, fetch, pull, push
git remote -v
git remote add origin <url>
git fetch origin
git pull origin main
git pull --rebase origin main
git push origin feature/login-form
git push -u origin feature/login-form
git branch -vv
-v Показывает URL remote рядом с его именем.
--rebase Вместо merge переносит локальные коммиты поверх обновлённой ветки.
-u Настраивает upstream для текущей ветки.
-vv Расширенный вывод веток с информацией об upstream и последнем коммите.
Обычно: для feature-веток часто удобно git pull --rebase, чтобы история оставалась чище.

6) История и сравнение изменений

Здесь команды, которые помогают понять историю проекта и сравнить ветки, коммиты или отдельные файлы.

log, show, blame, diff
git log --oneline
git log --graph --oneline --decorate
git log --stat
git show HEAD~1
git blame src/app.ts
git diff main..feature/login-form
git diff origin/main...HEAD
--oneline Короткий лог: один commit на строку.
--graph Рисует ASCII-граф ветвления и merge.
--decorate Показывает имена веток и тегов рядом с commit.
--stat Показывает, какие файлы изменялись и насколько.

7) Откат, исправление и восстановление

Полезно понимать разницу между reset, restore, revert и amend — они решают разные задачи.

Убрать из staging или вернуть рабочий файл

reset и restore
git reset <file>
git reset
git restore <file>
git restore --staged <file>
git restore .
--staged Возвращает файл из staging area обратно в рабочее состояние.

Исправить последний commit

amend
git add .
git commit --amend
git commit --amend --no-edit
--amend Изменяет последний commit вместо создания нового.
--no-edit Оставляет прежнее сообщение коммита без открытия редактора.

Безопасно отменить уже сделанный commit

revert и hard reset
git revert HEAD
git revert <commit>
git reset --hard HEAD~1
git reflog
--hard Жёстко перемещает HEAD и стирает локальные изменения в working tree и index.
Правило: если commit уже запушен и его могли получить другие разработчики, чаще безопаснее использовать git revert.

8) Stash

Stash удобен, когда нужно временно убрать незавершённые изменения и быстро переключиться на другую задачу.

основные stash-команды
git stash
git stash push -m "wip: login form"
git stash -u
git stash list
git stash show -p
git stash apply stash@{0}
git stash pop
git stash drop stash@{0}
-m Добавляет понятное сообщение к stash.
-u Включает в stash ещё и untracked-файлы.
-p Показывает patch, то есть подробный diff stash.

9) Привычные рабочие флоу

Ниже не просто команды по отдельности, а типовые последовательности, которые реально встречаются в работе.

1Новая задача в отдельной ветке

Типичный старт работы над задачей от актуального main.

feature branch workflow
git switch main
git pull --rebase origin main
git checkout -b feature/login-form
git add .
git commit -m "feat: add login form"
git push -u origin feature/login-form
2Обновить feature-ветку перед PR

Когда main уже ушёл вперёд, а свою ветку нужно привести к актуальному состоянию.

rebase feature on top of main
git fetch origin
git switch feature/login-form
git rebase origin/main
git push --force-with-lease
--force-with-lease Безопаснее обычного force push: Git проверит, что удалённая ветка не изменилась неожиданно.
3Забыл файл в последнем commit

Сценарий, который очень часто встречается во время работы.

добавить забытый файл в последний commit
git add path/to/file
git commit --amend --no-edit
4Нужно быстро переключиться на срочный баг

Когда текущая задача не закончена, но нужно срочно уйти на hotfix.

временный stash и переключение
git stash push -u -m "wip: login form"
git switch main
git pull --rebase origin main
git checkout -b hotfix/login-crash
5Разрешить конфликт во время rebase

Обычная последовательность после ручного исправления конфликтующих файлов.

конфликт при rebase
git status
git add .
git rebase --continue
git rebase --abort
--continue Продолжает rebase после исправления конфликтов.
--abort Полностью отменяет rebase и возвращает состояние до его начала.