Шпаргалка

Команды Git: шпаргалка с примерами на каждый день

Обновлено: · Skillaria.Top

Основные команды 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 pullgit fetch + слияние upstream-ветки в текущую
git pull --rebasegit 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 или rebasegit 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 или терминале редактора кода.