Команды Git: шпаргалка с примерами на каждый день
Основные команды Git — это git init и git clone для создания репозитория, git status, git add и git commit для сохранения изменений, git branch, git switch и git merge для работы с ветками, git push, git fetch и git pull для синхронизации с сервером, а также git restore, git reset и git revert для отмены изменений.
Ниже — рабочая шпаргалка по Git: команды сгруппированы по задачам, к каждой дан пример и короткое пояснение. Её удобно держать открытой рядом с терминалом: почти всё, что разработчик делает с Git за день, укладывается в 20–30 команд из этих таблиц.
Чтобы команды читались осмысленно, держите в голове три области: рабочая директория (файлы на диске), индекс или staging area (то, что войдёт в следующий коммит) и репозиторий (история коммитов в папке .git). Большинство команд Git переносят изменения между этими тремя зонами или между локальным и удалённым репозиторием.
Настройка Git
Эти команды выполняются один раз после установки. Флаг --global пишет настройки в ~/.gitconfig и действует для всех репозиториев пользователя; без него — только для текущего репозитория.
| Команда | Что делает |
|---|---|
git config --global user.name "Иван Петров" | Имя автора коммитов |
git config --global user.email "ivan@example.com" | Почта автора коммитов |
git config --global init.defaultBranch main | Имя ветки по умолчанию для новых репозиториев |
git config --global core.editor "code --wait" | Редактор для сообщений коммитов (здесь VS Code) |
git config --global pull.rebase false | Поведение git pull по умолчанию — слияние |
git config --global core.autocrlf input | Перевод CRLF в LF при коммите (macOS/Linux; на Windows обычно true) |
git config --list --show-origin | Показать все настройки и файл, откуда каждая взята |
git config --global alias.st status | Псевдоним: git st вместо git status |
git --version | Версия установленного Git |
git help commit | Полная справка по команде (или git commit -h — краткая) |
Создание и клонирование репозитория
| Команда | Что делает |
|---|---|
git init | Создаёт пустой репозиторий (папку .git) в текущем каталоге |
git init my-project | Создаёт каталог my-project и репозиторий в нём |
git clone https://github.com/user/repo.git | Копирует удалённый репозиторий со всей историей |
git clone git@github.com:user/repo.git app | Клонирует по SSH в папку app |
git clone --depth 1 URL | Поверхностный клон: только последний коммит, быстро и мало места |
git clone -b develop URL | Клонирует и сразу переключается на ветку develop |
Базовый цикл: status, add, commit
Это ядро ежедневной работы: посмотреть, что изменилось, выбрать нужное в индекс и зафиксировать коммитом.
| Команда | Что делает |
|---|---|
git status | Состояние: изменённые, проиндексированные и неотслеживаемые файлы |
git status -s | Краткий формат: M — изменён, A — добавлен, ?? — не отслеживается |
git add file.txt | Добавить файл в индекс |
git add . | Добавить все изменения в текущем каталоге и ниже, включая удаления |
git add -A | Добавить все изменения во всём репозитории |
git add -p | Интерактивно выбрать отдельные фрагменты (hunks) изменений |
git commit -m "Добавить форму входа" | Создать коммит из индекса с сообщением |
git commit -am "Исправить опечатку" | Проиндексировать все отслеживаемые изменённые файлы и закоммитить; новые файлы не попадут |
git commit --amend | Переписать последний коммит: добавить забытое из индекса или поправить сообщение |
git commit --amend --no-edit | Дополнить последний коммит, не меняя сообщение |
git rm file.txt | Удалить файл с диска и из индекса |
git rm --cached secret.env | Перестать отслеживать файл, оставив его на диске |
git mv old.js new.js | Переименовать или переместить файл |
Типичный сценарий выглядит так:
git status
git add src/login.js src/login.css
git diff --staged # проверить, что именно уйдёт в коммит
git commit -m "Добавить форму входа"
Не используйте --amend для коммитов, которые уже отправлены в общую ветку: он создаёт новый коммит с другим хешем, и коллегам придётся разбираться с расхождением истории.
Просмотр истории и изменений
| Команда | Что делает |
|---|---|
git log | История коммитов текущей ветки |
git log --oneline | Каждый коммит в одну строку: короткий хеш и заголовок |
git log --oneline --graph --all | Граф всех веток в терминале |
git log -p file.txt | История файла с диффами каждого коммита |
git log --author="Иван" --since="2 weeks ago" | Фильтр по автору и дате |
git log -S "getUser" | Коммиты, где добавлялась или удалялась строка getUser |
git log main..feature | Коммиты, которые есть в feature, но нет в main |
git diff | Изменения в рабочей директории, ещё не добавленные в индекс |
git diff --staged | Изменения в индексе относительно последнего коммита (синоним --cached) |
git diff main feature | Разница между вершинами двух веток |
git diff HEAD~3 -- src/ | Изменения в папке src за последние три коммита |
git show a1b2c3d | Метаданные и дифф конкретного коммита |
git show HEAD:README.md | Содержимое файла в последнем коммите |
git blame app.js | Кто и в каком коммите последним менял каждую строку |
git shortlog -sn | Число коммитов по авторам |
Ссылки на коммиты пригодятся везде: HEAD — текущий коммит, HEAD~1 — его родитель, HEAD~3 — три шага назад по первому родителю, HEAD^2 — второй родитель merge-коммита.
Ветки: создание, переключение, удаление
С версии 2.23 в Git есть git switch для веток и git restore для файлов — они разделили перегруженную git checkout. Старые формы продолжают работать.
| Команда | Что делает |
|---|---|
git branch | Список локальных веток, текущая отмечена * |
git branch -a | Локальные и удалённые (remote-tracking) ветки |
git branch -vv | Ветки с последним коммитом и отставанием/опережением от upstream |
git branch feature/login | Создать ветку, не переключаясь |
git switch feature/login | Переключиться на ветку |
git switch -c feature/login | Создать ветку и переключиться (аналог git checkout -b) |
git switch - | Вернуться на предыдущую ветку |
git branch -m new-name | Переименовать текущую ветку |
git branch -d feature/login | Удалить ветку, если она уже слита |
git branch -D feature/login | Удалить ветку принудительно, даже неслитую |
git branch --merged | Ветки, уже влитые в текущую — кандидаты на удаление |
Слияние и перебазирование
| Команда | Что делает |
|---|---|
git merge feature | Влить feature в текущую ветку (fast-forward, если возможно) |
git merge --no-ff feature | Всегда создавать merge-коммит |
git merge --squash feature | Собрать все изменения ветки в индекс одним набором, затем git commit |
git merge --abort | Отменить слияние с конфликтами и вернуться к исходному состоянию |
git rebase main | Перенести коммиты текущей ветки поверх main |
git rebase -i HEAD~4 | Интерактивно: объединить (squash), переименовать, переставить, удалить последние 4 коммита |
git rebase --continue | Продолжить после разрешения конфликта |
git rebase --abort | Отменить rebase полностью |
git cherry-pick a1b2c3d | Применить один коммит к текущей ветке как новый |
Разрешение конфликта при слиянии почти всегда выглядит одинаково:
git merge feature
# CONFLICT (content): Merge conflict in app.js
git status # файлы в разделе "both modified"
# правим app.js, убираем маркеры <<<<<<< ======= >>>>>>>
git add app.js
git commit # Git предложит готовое сообщение merge-коммита
Главное правило rebase: не перебазируйте коммиты, которые уже лежат в общей ветке и на которых другие строят свою работу.
Работа с удалёнными репозиториями
| Команда | Что делает |
|---|---|
git remote -v | Список remote и их адресов |
git remote add origin git@github.com:user/repo.git | Подключить удалённый репозиторий под именем origin |
git remote set-url origin NEW_URL | Сменить адрес remote (например, HTTPS на SSH) |
git remote remove upstream | Отключить remote |
git fetch | Скачать новые коммиты и ветки, не трогая ваши файлы |
git fetch --prune | То же, плюс удалить ссылки на ветки, удалённые на сервере |
git pull | git fetch + слияние upstream-ветки в текущую |
git pull --rebase | git fetch + rebase ваших коммитов поверх полученных |
git push | Отправить коммиты текущей ветки в её upstream |
git push -u origin feature/login | Первая отправка ветки с установкой upstream |
git push --force-with-lease | Перезаписать удалённую ветку, только если на ней нет чужих новых коммитов |
git push origin --delete feature/login | Удалить ветку на сервере |
git push --tags | Отправить все локальные теги |
Вместо git push --force привыкайте к --force-with-lease: если коллега успел запушить в ту же ветку, команда откажется перезаписывать его работу.
Отмена изменений
Самая нервная часть Git. Ключевой вопрос перед выбором команды: изменения ещё только в файлах, уже в индексе, в локальном коммите или в опубликованном коммите.
| Ситуация | Команда |
|---|---|
| Отменить правки в файле (вернуть как в последнем коммите) | git restore app.js |
| Убрать файл из индекса, сохранив правки | git restore --staged app.js |
| Вернуть файл из конкретного коммита | git restore --source=a1b2c3d app.js |
| Отменить последний коммит, оставив изменения в индексе | git reset --soft HEAD~1 |
| Отменить последний коммит, оставив изменения в файлах | git reset HEAD~1 (режим --mixed по умолчанию) |
| Удалить последний коммит и все его изменения | git reset --hard HEAD~1 |
| Отменить опубликованный коммит новым «обратным» коммитом | git revert a1b2c3d |
| Отменить merge-коммит | git revert -m 1 <merge-hash> |
| Посмотреть, какие неотслеживаемые файлы будут удалены | git clean -n |
| Удалить неотслеживаемые файлы и папки | git clean -fd |
| Найти «потерянный» коммит после reset или rebase | git reflog, затем git reset --hard HEAD@{2} |
git reset --hard и git clean -f безвозвратно удаляют незакоммиченные изменения: reflog хранит только коммиты, а не правки в рабочей директории. Перед ними сделайте git stash или хотя бы git status.
Stash: отложить незаконченную работу
| Команда | Что делает |
|---|---|
git stash | Спрятать изменения отслеживаемых файлов и очистить рабочую директорию |
git stash push -u -m "wip: форма" | Спрятать вместе с неотслеживаемыми файлами, с подписью |
git stash list | Список отложенных наборов: stash@{0}, stash@{1}… |
git stash show -p stash@{0} | Посмотреть дифф отложенного набора |
git stash pop | Вернуть последний набор и удалить его из списка |
git stash apply stash@{1} | Вернуть набор, оставив его в списке |
git stash drop stash@{1} | Удалить один набор |
git stash branch fix-form | Создать ветку от коммита, где был сделан stash, и применить его |
Теги и релизы
| Команда | Что делает |
|---|---|
git tag | Список тегов |
git tag -a v1.2.0 -m "Релиз 1.2.0" | Аннотированный тег с автором, датой и сообщением |
git tag v1.2.0 a1b2c3d | Лёгкий тег на конкретный коммит |
git push origin v1.2.0 | Отправить один тег |
git tag -d v1.2.0 | Удалить тег локально |
git push origin --delete v1.2.0 | Удалить тег на сервере |
git describe --tags | Ближайший тег и число коммитов после него, например v1.2.0-3-ga1b2c3d |
Продвинутые команды Git
| Команда | Что делает |
|---|---|
git bisect start, git bisect bad, git bisect good v1.1.0 | Двоичный поиск коммита, который внёс ошибку; в конце git bisect reset |
git worktree add ../hotfix main | Вторая рабочая папка с другой веткой из того же репозитория |
git submodule update --init --recursive | Скачать подмодули после клонирования |
git grep "TODO" | Быстрый поиск по отслеживаемым файлам |
git format-patch -1 HEAD / git apply fix.patch | Сохранить коммит в патч и применить патч к рабочей директории |
git gc | Упаковать объекты и почистить репозиторий (обычно Git делает это сам) |
Частые ошибки и как их исправить
Закоммитили в main вместо новой ветки
Если коммит ещё не отправлен, создайте ветку на текущем коммите и откатите main:
git branch feature/login # ветка указывает на ваш коммит
git reset --hard HEAD~1 # main возвращается на шаг назад
git switch feature/login
Забыли добавить файл в последний коммит
git add forgotten.js
git commit --amend --no-edit
Push отклонён: rejected, non-fast-forward
На сервере есть коммиты, которых нет у вас. Сначала заберите их, потом отправляйте:
git pull --rebase
git push
Случайно закоммитили файл с паролями
Уберите его из отслеживания и добавьте в .gitignore: git rm --cached .env, затем коммит. Если коммит уже опубликован, секрет считайте скомпрометированным и перевыпустите его — из истории он никуда не делся.
Итог
Для повседневной работы хватает короткого набора: status, add, commit, switch, merge, pull, push и log --oneline. Команды отмены — restore, reset, revert — выбирайте по тому, опубликован ли коммит, а reflog помните как страховку на крайний случай. Все команды Git из этой шпаргалки разобраны на практике в курсе по Git, где каждую вы пробуете в собственном репозитории.
Частые вопросы
Сколько команд Git нужно знать начинающему?
Для старта достаточно 10–12: init, clone, status, add, commit, log, diff, branch, switch, merge, pull и push. Остальные осваиваются по мере появления задач.
Чем git switch отличается от git checkout?
git switch умеет только переключать и создавать ветки, а git checkout ещё и восстанавливает файлы. Разделение на switch и restore сделано, чтобы случайно не затереть правки, перепутав ветку с файлом.
Как посмотреть справку по любой команде Git?
Выполните git help имя-команды для полного руководства или git имя-команды -h для краткого списка флагов. Та же документация доступна на git-scm.com.
Можно ли сократить длинные команды Git?
Да, через псевдонимы: git config --global alias.lg "log --oneline --graph --all" позволит набирать git lg.
Работают ли эти команды в Windows?
Да, команды одинаковы на всех системах. В Windows их удобно выполнять в Git Bash, PowerShell или терминале редактора кода.
Эта тема подробно разобрана с практикой в курсе «Git с нуля до уверенного разработчика».
- Первый репозиторий: init, add, commit и магия индекса
- Читаем историю: log, diff, show и навигация по прошлому
- Ветки: параллельная реальность вашего кода
- Отменяем ошибки: restore, reset, revert — правильно и опасно
- GitHub и удалённые репозитории: ваш код в облаке
- Продвинутые инструменты: rebase, stash, cherry-pick и теги