Git — один из тех инструментов, с которым можно обходиться примерно 15 командами годами — а потом однажды случайно сделать rebase main-ветки и внезапно пожалеть, что не выучил ещё пару. Эта шпаргалка — та самая «пара» без панических атак.
Вот что никто не говорит вам в начале: git — это по сути направленный ацикличный граф снимков. Каждый commit — это снимок, каждый branch — указатель, а HEAD — просто стикер с надписью «вы здесь». Как только это щёлкнет, всё остальное — rebase, cherry-pick, reset — перестаёт казаться чёрной магией и начинает ощущаться как перемещение стикеров.
Мы организовали шпаргалку по рабочим процессам, а не по алфавиту, потому что никто не думает «мне нужна команда на букву R». Вы думаете «мне нужно отменить последний commit» или «мне нужно забрать branch коллеги». Начните с раздела «Базовый рабочий процесс», если вы только разбираетесь. Потом разветвляйтесь (каламбур полностью намеренный) по мере привыкания. Разделы Stash и Reset будут спасать вас минимум раз в неделю.
Одно золотое правило: commit рано, commit часто. Маленькие commit легко ревьюить, легко откатывать и легко понимать через шесть месяцев, когда вы читаете git log и гадаете, о чём думал прошлый-вы.
Базовый рабочий процесс
git init
Создать новый репозиторий в текущей директорииgit clone <url>
Скачать репозиторий вместе со всей историейgit status
Показать изменённые, staged и untracked файлыgit add <file>
Добавить конкретный файл в staging для следующего commitgit add .
Добавить все изменения в текущей директории в staginggit commit -m "<msg>"
Зафиксировать staged-изменения с сообщениемgit push
Загрузить локальные commit на remotegit pull
Забрать и смержить remote-изменения в вашу ветку
Ветвление
git branch
Показать все локальные веткиgit branch -a
Показать локальные и remote веткиgit branch <name>
Создать новую ветку (оставаясь на текущей)git switch <name>
Переключиться на существующую веткуgit switch -c <name>
Создать новую ветку и переключиться на неёgit branch -d <name>
Удалить ветку (безопасно — блокирует, если не смержена)git branch -D <name>
Принудительно удалить ветку, даже если не смерженаgit branch -m <new>
Переименовать текущую ветку
Merge и Rebase
git merge <branch>
Смержить ветку в вашу текущую веткуgit merge --no-ff <branch>
Смержить с merge commit, даже если возможен fast-forwardgit rebase <branch>
Переиграть ваши commit поверх другой веткиgit rebase --abort
Отменить rebase в процессе и восстановить исходное состояниеgit rebase --continue
Продолжить rebase после разрешения конфликтовgit merge --abort
Отменить merge в процессеgit cherry-pick <hash>
Применить отдельный commit из другой ветки
Stash
git stash
Временно отложить все незафиксированные измененияgit stash -u
Stash включая untracked файлыgit stash pop
Восстановить последний stash и удалить егоgit stash apply
Восстановить последний stash, но сохранить его в спискеgit stash list
Показать все сохранённые наборы измененийgit stash drop
Удалить последний stashgit stash drop stash@{n}
Удалить конкретный stash по индексу
Log и Diff
git log
Показать историю commit для текущей веткиgit log --oneline
Компактная история: один commit — одна строкаgit log --graph --oneline
Показать историю веток в виде ASCII-графаgit diff
Показать unstaged-изменения относительно последнего commitgit diff --staged
Показать staged-изменения относительно последнего commitgit diff <branch1> <branch2>
Сравнить две веткиgit show <hash>
Показать изменения в конкретном commitgit log -p <file>
Показать полную историю изменений файла
Reset и Revert
git reset <file>
Убрать файл из staging, сохранив измененияgit reset HEAD~1
Отменить последний commit, сохранив изменения в staginggit reset --soft HEAD~1
Отменить последний commit, сохранив изменения в staging (явно)git reset --hard HEAD~1
Отменить последний commit и безвозвратно удалить все измененияgit revert <hash>
Создать новый commit, отменяющий предыдущийgit checkout -- <file>
Отбросить unstaged-изменения конкретного файлаgit restore <file>
Отбросить unstaged-изменения (современный синтаксис)git restore --staged <file>
Убрать файл из staging (современный синтаксис)
Remotes
git remote -v
Показать все remote с их URLgit remote add <name> <url>
Добавить новый remote-репозиторийgit fetch
Скачать remote-изменения без mergegit fetch --prune
Fetch и удалить устаревшие remote-tracking веткиgit pull --rebase
Подтянуть remote-изменения и сделать rebase вашей работы поверхgit push -u origin <branch>
Push ветки и настроить отслеживание remotegit push origin --delete <branch>
Удалить remote-ветку
Теги
git tag <name>
Создать лёгкий тег на текущем commitgit tag -a <name> -m "<msg>"
Создать аннотированный тег с сообщениемgit push --tags
Отправить все локальные теги на remotegit tag -d <name>
Удалить локальный тегgit push origin --delete <tag>
Удалить remote-тег
Используйте git switch и git restore вместо git checkout. Команда checkout делает слишком много вещей — switch работает с ветками, restore — с файлами. Более чёткое намерение, меньше ошибок.
Запускайте git pull --rebase вместо простого git pull, чтобы сохранить историю линейной. Ещё лучше — сделайте это по умолчанию: git config --global pull.rebase true.
Допустили опечатку в последнем commit-сообщении? git commit --amend -m "исправленное сообщение" перезапишет его. Только не амендите commit, которые вы уже запушили — это переписывает историю, от которой могут зависеть ваши коллеги.
Используйте git stash -u вместо просто git stash. Флаг -u включает untracked файлы, и это почти всегда то, что вам нужно. Без него новые файлы, которые вы ещё не добавили, останутся позади.
git reflog — ваша машина времени. Даже после неудачного reset --hard ваши commit не пропадают окончательно примерно 30 дней. Запустите git reflog, найдите нужный хэш и выполните git reset --hard <hash> для восстановления.
Перед большим merge или rebase создайте «страховочную ветку»: git branch backup-before-merge. Если всё пойдёт наперекосяк, вы всегда сможете вернуться к исходной точке. Дешёвая страховка.
Используйте git log --oneline --graph --all для визуализации всей топологии веток в терминале. Это самый быстрый способ понять, что происходит в репозитории с несколькими активными ветками.