Git

Настройка и конфигурация

Команда Название Описание
git config --global user.name "Имя" Имя пользователя Устанавливает имя автора для всех Git-репозиториев на глобальном уровне. Это имя отображается во всех ваших commit. Флаг --global применяет настройку ко всем репозиториям пользователя. Без --global настройка применяется только к текущему репозиторию. Пример: git config --global user.name "Vlad". Для временного переопределения в конкретном репозитории используйте команду без --global или переменную среды GIT_AUTHOR_NAME.
git config --global user.email "mail@example.com" Email пользователя Устанавливает email-адрес автора для всех commit на глобальном уровне. Email привязывается к каждому commit и используется для идентификации автора. Важно указывать корректный email, особенно при работе с GitHub/GitLab — он должен совпадать с верифицированным email для push. Для приватности на GitHub используйте no-reply email вида id+noreply@github.com. Проверить настройку: git config user.email.
git config --list Просмотр конфигурации Показывает все активные настройки Git, объединённые из файлов: ~/.gitconfig (глобальные), .git/config (репозиторий) и системные. Настройки отображаются в формате section.key = value. При конфликте приоритет имеет: локальная > глобальная > системная. Для просмотра конкретного значения: git config user.name. Для редактирования GUI: git config --edit.
git help Помощь Открывает встроенную справочную систему Git. Показывает подробную документацию по командам, включая опции, примеры и ссылки на дополнительную информацию. Для справки по конкретной команде: git help config или git config --help. Для поиска по справке: git help -g (список групп), git help -a (все команды). В Windows открывает HTML-страницу, в Linux — man-страницу.
git version Версия Git Показывает установленную версию Git в системе. Формат вывода: git version X.Y.Z. Полезно для диагностики совместимости — некоторые команды доступны только в новых версиях. Например, git switch и git restore появились в Git 2.23+. Для проверки доступности Git: git --version (аналог). На CI/CD серверах часто требуется определённая версия Git.
git bugreport Создание bug report Генерирует подробный диагностический отчёт для баг-репортов. Включает версию Git, информацию о системе, конфигурацию, пути и окружение. Вывод направляется в терминал или файл. Используйте перед отправкой бага: git bugreport | git compress. Альтернатива — git env для вывода только переменных окружения. Полезно при отладке проблем с Git на сложной конфигурации.

Создание и клонирование репозитория

Команда Название Описание
git init Создание репозитория Инициализирует новый Git-репозиторий в текущей директории, создавая скрытую папку .git/ с метаданными. После выполнения вы можете начать отслеживать файлы. Для инициализации в конкретной директории: git init /path/to/dir. Для инициализации с начальной веткой (Git 2.28+): git init -b main. Флаг --bare создаёт «голый» репозиторий без рабочей директории (для сервера). Флаг --separate-git-dir позволяет разместить .git в другом месте.
git clone https://github.com/user/project.git Клонирование репозитория Скачивает полную копию удалённого репозитория в локальную директорию, включая всю историю коммитов, все ветки и теги. По умолчанию создаёт локальную ветку main или master с отслеживанием удалённой ветки под именем origin. Для клонирования в конкретную директорию: git clone url new-dir/. Поддерживает протоколы: https://, ssh://, git@. Для аутентификации по SSH настройте ключи: ssh-keygen + добавьте ключ в GitHub/GitLab.
git clone --depth 1 repo-url Поверхностное клонирование Клонирует репозиторий с ограниченной историей коммитов (--depth 1 = только последний коммит). Значительно ускоряет клонирование больших репозиториев (например, ядра Linux). История git log будет содержать только 1 коммит. Для увеличения глубины после клонирования: git fetch --depth 10. С Git 2.24+ можно конвертировать shallow-клон в полный: git fetch --unshallow. Не поддерживает git branch и git tag без дополнительного git fetch.
git clone --branch dev repo-url Клонирование ветки Клонирует конкретную ветку вместо ветки по умолчанию. Полезно при работе с монорепозиториями или когда нужно сразу получить нужную ветку. Для клонирования конкретной ветки с отслеживанием: git clone --branch dev --single-branch url. Флаг --single-branch ограничивает загрузку только одной веткой (экономит место). Можно клонировать тег: git clone --branch v1.0 --depth 1 url для получения конкретной версии.

Индексирование и изменения файлов

Staging area (индекс) — промежуточное хранилище изменений перед созданием commit. Git отслеживает только файлы, добавленные в staging.

Команда Название Описание
Добавление файлов в staging
git add app.js Добавление файлов Добавляет указанный файл в staging area, подготавливая его для commit. После git add изменения файла будут включены в следующий commit. Можно добавлять несколько файлов: git add file1.js file2.css. Поддерживает glob-паттерны: git add *.md (все Markdown-файлы). Для добавления только новых (untracked) файлов используйте git add -N (по частям). Файлы, которых нет в репозитории, нужно добавлять явно — Git не отслеживает их автоматически.
git add . Добавить все изменения Добавляет все изменённые и новые файлы в текущей директории и поддиректориях рекурсивно. Точка . означает «текущая директория». Важно: git add . не добавляет файлы, которые ранее были игнорируемы через .gitignore. Также не добавляет полностью новые (untracked) файлы в поддиректориях, если они не были ранее отслеживаемы. Для добавления всех untracked файлов используйте git add -A или git add --all.
git add -A Добавить все изменения Добавляет все изменения: новые (untracked), изменённые (modified) и удалённые (deleted) файлы по отношению к указанной директории. В отличие от git add ., git add -A также фиксирует удаление файлов, которых раньше были в репозитории. Работает быстрее при больших проектах. Альтернатива: git add --all (полный аналог). Для добавления только изменённых файлов: git add -u (update).
git add -p Интерактивное добавление Позволяет выбрать конкретные ханки (hunks) изменений для добавления в staging. Открывает интерактивный режим с вопросами: y (добавить), n (пропустить), q (выйти), a (остальное), s (разбить на части), e (ручной ввод). Полезно при больших изменениях, когда нужно добавить только часть правок. Например, вы исправили баг и добавили новую функцию — можно добавить только ханки бага. Альтернатива: git add --patch (полный аналог).
Восстановление и удаление
git restore index.js Восстановление файлов Восстанавливает файл из последней версии в working directory (отменяет незафиксированные изменения). По умолчанию восстанавливает из HEAD (последнего commit). Для восстановления из staging: git restore --source=HEAD index.js. Для восстановления до конкретной версии: git restore --source=abc123 index.js. Для восстановления всех файлов: git restore .. Альтернатива: git checkout -- index.js (классический синтаксис).
git restore --staged app.js Убрать из staging Удаляет файл из staging area (индекса), но сохраняет изменения в working directory. Файл останется изменённым, но не будет готов к commit. Аналогично git reset HEAD app.js. Для удаления всех файлов из staging: git restore --staged .. С Git 3.0+ можно использовать --worktree для восстановления и рабочей директории одновременно.
git rm old.js Удаление файла Удаляет файл из Git-репозитория и файловой системы. Файл автоматически добавляется в staging для следующего commit. После git commit файл будет полностью удалён. Для удаления только из Git (оставив файл на диске): git rm --cached old.js. Для удаления директории: git rm -r dir/. Для удаления по паттерну: git rm *.log. Удаленный файл можно восстановить: git restore old.js (до commit) или git checkout HEAD~1 -- old.js (после commit).
git rm --cached .env Удаление из Git Удаляет файл только из Git-отслеживания, но оставляет его в рабочей директории. Полезно для файлов с конфиденциальными данными (.env, config.php), которые случайно попали в репозиторий. После удаления добавьте файл в .gitignore, чтобы он больше не попал в репозиторий. Пример: git rm --cached .env && echo ".env" >> .gitignore && git add .gitignore. Файл останется на диске, но перестанет отслеживаться.
git mv old.js new.js Переименование файла Перемещает или переименовывает файл с автоматическим добавлением в staging. Git отслеживает переименования через анализ содержимого (content-based detection). Альтернатива: mv old.js new.js && git add new.js && git rm old.js (ручной аналог). Для перемещения в другую директорию: git mv src/old.js dst/new.js. После commit переименование будет корректно отображаться в истории: git log --follow new.js (флаг --follow отслеживает переименования).
Статус
git status Статус репозитория Показывает текущее состояние репозитория: какие файлы изменены, какие в staging, какие untracked. Вывод разделён на секции: «Changes to be committed» (в staging) и «Changes not staged» (не в staging). Показывает текущую ветку и её статус относительно remote. Полезные флаги: -sb (краткий вывод с веткой), -uno (показывать только untracked файлы). Для автоматического запуска status при каждом действии: git config status.submoduleSummary true.
git status --short Краткий статус Выводит краткий формат статуса, удобный для парсинга скриптами. Каждая строка: XY filename, где X — статус индекса, Y — статус working directory. Коды: A (added), M (modified), D (deleted), ? (untracked), R (renamed), U (unmerged). Для цветовой индикации: --porcelain (стабильный формат для скриптов). Для вывода только untracked: git status --short --untracked-files=no.

Проверка состояния и различий

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

Команда Название Описание
git diff Разница изменений Показывает различия между working directory и staging area (или последним commit). Выводит построчные изменения: + — добавленные строки, - — удалённые. Полезно перед git add для проверки, что вы добавляете. Флаги: --stat (статистика изменений), --color-words (подсветка изменённых слов), -W (показывать только функции). Для сравнения конкретного файла: git diff app.js. Для игнорирования пробелов: git diff -w.
git diff --staged Разница staged файлов Показывает различия между staging area и последним commit (HEAD). Полезно перед commit для проверки, что именно будет зафиксировано. Альтернатива: git diff --cached (полный аналог). Для сравнения с конкретной версией: git diff --staged abc123. В сочетании с --name-only показывает только имена изменённых файлов: git diff --staged --name-only.
git show HEAD Просмотр объекта Git Показывает содержимое указанного объекта Git: commit, tag или файл. HEAD — последний commit в текущей ветке. Показывает метаданные commit (автор, дата, сообщение) и diff изменений. Для просмотра конкретного commit: git show abc123. Для файла: git show HEAD:app.js (вывод содержимого файла из commit). Для тега: git show v1.0. Для первых N строк diff: git show --stat HEAD.
git log История commit Показывает полную историю коммитов текущей ветки с метаданными (автор, дата, hash). По умолчанию выводит: hash, имя автора, дату и сообщение. Для навигации используйте vim-подобные команды: j (вниз), k (вверх), q (выход). Флаги: -p (показать diff), --stat (статистика файлов), --since="2 weeks ago" (за последние 2 недели), --author="Vlad" (конкретный автор), --grep="fix" (по сообщению).
git log --oneline Краткая история Компактный вывод: короткий hash (7 символов) и сообщение каждого commit в одну строку. Идеально для быстрого обзора истории. Комбинируйте с другими флагами: git log --oneline --graph --all (граф всех веток), git log --oneline -20 (последние 20 commit), git log --oneline --since="2024-01-01" (с определённой даты). Для вывода с номерами строк в diff: git log -p --oneline.
git log --graph Граф веток Визуализирует ветвление репозитория ASCII-графиками, показывая как ветки сливаются и расходятся. Комбинируйте с --oneline и --all для полного обзора: git log --oneline --graph --all --decorate. Флаг --decorate добавляет имена тегов и remote-веток. Для ограничения глубины: git log --oneline --graph --max-count=50. Полезно для понимания структуры проекта перед merge/rebase.
git blame app.js Автор строк Показывает построчно, кто и когда изменил каждую строку файла. Выводит: hash commit, автор, номер строки, содержимое. Полезно для поиска источника багов («кто это написал?»). Флаги: -L 10,20 (строки 10-20), -C (учесть перемещённые строки), -M (учесть скопированные строки), -w (игнорировать пробелы). Для просмотра в реальном времени: git blame -p app.js | less. Для конкретного commit: git blame abc123 -- app.js.

Commit

Commit (коммит) — снимок состояния репозитория в определённый момент времени. Каждый commit имеет уникальный hash, автора, дату и сообщение.

Команда Название Описание
git commit Создание commit Создаёт commit из staged изменений, открывая текстовый редактор (vim/nano) для сообщения. Сообщение commit должно описывать что изменено: feat: add login page, fix: resolve null pointer. После сохранения редактора commit создаётся автоматически. Для настройки редатора: git config core.editor "code --wait". Для отмены: Ctrl+C в vim (без сохранения). Commit создаётся локально — для публикации используйте git push.
git commit -m "Fix login bug" Commit с сообщением Создаёт commit с сообщением в одну строку, без открытия редактора. Полезно для автоматизации и быстрых коммитов. Сообщение заключают в кавычки: -m "сообщение". Для многострочного сообщения: git commit -m "Заголовок" -m "Подробное описание". Convention: используйте формат type: description (Conventional Commits): feat, fix, docs, style, refactor, test, chore.
git commit --amend Изменение commit Изменяет последний commit: заменяет его новым с отредактированным сообщением или staged изменениями. Полезно для исправления опечаток в сообщении или добавления забытых файлов. Если staging пуст — только редактируется сообщение. Если есть staged файлы — они добавляются к последнему commit. ВАЖНО: amends меняет hash commit — не используйте для уже опубликованных веток. Для изменения commit в середине истории: git rebase -i.
git commit --amend --no-edit Обновление commit Добавляет staged изменения к последнему commit, сохраняя оригинальное сообщение. Используется когда вы забыли добавить файлы: git add missed.js && git commit --amend --no-edit. Date и author commit сохраняются. Hash commit изменится. Альтернатива: git commit --amend -C HEAD (аналогичный синтаксис). Для добавления без amends: создайте новый commit.

Ветки (Branches)

Ветка (branch) — независимый путь разработки. По умолчанию все изменения идут в ветку main или master. Ветки позволяют параллельно работать над разными функциями без вмешательства в основной код.

Команда Название Описание
Список и создание веток
git branch Список веток Показывает все локальные ветки, текущая ветка отмечена звёздочкой *. Для включения информации о последнем commit: git branch -v. Для показа remote-веток: git branch -a (все), git branch -r (только remote). Для поиска веток с определённым именем: git branch -a | grep feature. Для показа веток, слитых с текущей: git branch --merged. Для показа неслитых: git branch --no-merged (опасно удалять).
git branch feature-auth Создание ветки Создаёт новую ветку с указанным именем, указывая на тот же commit, что и текущая ветка. Ветка создаётся мгновенно (лёгкая операция). Для создания из другой ветки: git branch feature-auth main. Для создания и немедленного переключения: git switch -c feature-auth или git checkout -b feature-auth. Имена веток: строчные буквы, дефисы, без пробелов. Допустимо: feature/user-login, fix/header-bug, hotfix/security.
git branch -d old-feature Удаление ветки Удаляет указанную локальную ветку, но только если она слита с текущей веткой (безопасное удаление). Если ветка не слита — Git запросит подтверждение. После удаления commit останутся доступны через git reflog. Для удаления всех слитых веток: git branch --merged | grep -v '\*' | xargs git branch -d. Remote-ветку удалим отдельно: git push origin --delete old-feature.
git branch -D Принудительное удаление Принудительно удаляет ветку независимо от её статуса слияния. Аналог git branch --delete --force. Используйте с осторожностью — неслитые commit могут стать труднодоступными. Обычно применяется для удаленных веток: git branch -D origin/old-feature. Перед удалением убедитесь: git branch --no-merged покажет какие ветки не слиты. Для безопасности сначала сделайте git log old-feature для проверки.
Переключение веток
git switch Переключение ветки Современная замена git checkout для переключения веток (Git 2.23+). Переключает working directory на указанную ветку, обновляя файлы. Для перехода: git switch main. Если ветка не существует и нужно создать: git switch -c new-branch. Для возврата к последней ветке: git switch -. В отличие от checkout, switch не используется для checkout файлов/commitов — для этого есть git restore.
git switch -c feature-api Создание + переход Создаёт новую ветку от текущей HEAD и мгновенно переключается на неё. Флаг -c означает «create». Аналог: git checkout -b feature-api (классический). Можно создать от другой ветки: git switch -c feature-api main (от main, а не от текущей). После создания автоматически устанавливается tracking с origin (если существует). Полезно в workflow: git switch -c feature/$(echo $ISSUE | tr '[:lower:]' '[:upper:]').
git checkout Checkout объекта Универсальная команда для checkout объектов. Исторически используется для веток, но также работает с commit/tag/файлами. Для веток: git checkout main. Для создания: git checkout -b feature-api. Для файлов: git checkout -- app.js (восстановить файл). Для commit: git checkout abc123 (detached HEAD). В Git 2.23+ рекомендуется разделять: git switch для веток, git restore для файлов.
git checkout Checkout commit Переключает репозиторий в «detached HEAD» режим — вы можете просматривать код на конкретном commit без создания ветки. Working directory обновляется к состоянию этого commit. Полезно для просмотра старых версий: git checkout abc123, git checkout v1.0. Для создания ветки из этого состояния: git checkout -b view-branch. Для возврата: git checkout main. В detached режиме нельзя делать commit без создания ветки.

Merge / Rebase / Cherry-pick

Эти команды объединяют изменения из разных веток. Merge создаёт commit слияния, rebase перемещает commit на другую ветку, cherry-pick копирует отдельные commit.

Команда Название Описание
git merge develop Слияние веток Объединяет указанную ветку в текущую, создавая merge-commit (или fast-forward без нового commit). При fast-forward (ветка не расходилась) новый commit не создаётся. При конфликте слияния: Git оставит маркеры <<<<< / ======= / >>>>> в файлах — разрешите вручную, затем git add + git commit. Для создания merge без fast-forward: git merge --no-ff develop (сохраняет историю ветки). Для слияния с конкретным сообщением: git merge develop -m "Merge feature-auth".
git merge --abort Отмена merge Отменяет текущий merge и возвращает репозиторий в исходное состояние. Работает только во время конфликта слияния. После разрешения конфликта --abort уже не сработает. Для отмены после git commit используйте git reset --hard HEAD~1. Альтернатива: git merge --abort эквивалентен git reset --merge. Перед merge всегда делайте git status для проверки чистоты working directory.
git rebase Rebase ветки Переносит все commit текущей ветки на начало другой ветки, создавая линейную историю. В отличие от merge, не создаёт merge-commit — commit переписываются. Полезно для поддержания чистой истории. Для rebase на main: git rebase main. Перед rebase убедитесь, что ветка не опубликована — rebase меняет hash commit. Для работы с опубликованными ветками используйте git merge. Для предотвращения случайного rebase: git config --global rebase.verifyRemoteRefs false.
git rebase -i Interactive rebase Открывает интерактивный редактор для редактирования commit history. Позволяет: pick (оставить), reword (изменить сообщение), edit (остановиться для изменений), squash (объединить с предыдущим), fixup (объединить, сохранив сообщение предыдущего), drop (удалить), exec (выполнить команду). Для последних N commit: git rebase -i HEAD~5. Для rebase на конкретный commit: git rebase -i abc123. Порядок в редакторе = порядок выполнения (сверху — самый старый).
git rebase --continue Продолжение rebase Продолжает rebase после разрешения конфликтов. После решения конфликтов в файлах: git add (проверьте через git diff), затем git rebase --continue. Для пропуска commit: git rebase --skip. Для отмены: git rebase --abort. При интерактивном rebase конфликты могут возникать для каждого commit — повторяйте процесс. Для автоматического разрешения конфликтов: git config rerere.enabled true (rerere — reuse recorded resolution).
git rebase --abort Отмена rebase Полностью отменяет текущий rebase и возвращает к исходному состоянию. Работает в любой момент rebase-процесса. После abort репозиторий полностью возвращается к состоянию до git rebase. Все разрешения конфликтов теряются. Для сохранения точки rebase: git reflog покажет новый HEAD. Перед abort убедитесь, что не потеряете важные данные.
git cherry-pick Копирование commit Применяет изменения из указанного commit в текущую ветку, создавая новый commit с теми же изменениями. Полезно для переноса фиксов между ветками: git cherry-pick abc123. Для нескольких commit: git cherry-pick abc123 def456 (последовательно). Для диапазона: git cherry-pick abc123..def456. Для последнего commit: git cherry-pick HEAD~1. При конфликте: разрешите и git cherry-pick --continue. Для отмены: git cherry-pick --abort. Для применения без commit (только изменения): git cherry-pick -n abc123 (no-commit).
git cherry-pick --abort Отмена cherry-pick Отменяет текущий cherry-pick при возникновении конфликта. Возвращает репозиторий к состоянию до cherry-pick. Работает только во время конфликта. После abort все staged изменения от cherry-pick теряются. Для отмены уже применённого cherry-pick: git revert HEAD (создаёт отменяющий commit).

Работа с удалёнными репозиториями

Remote-репозитории — удалённые хранилища кода (GitHub, GitLab, Bitbucket). По умолчанию основной remote называется origin. Работа с remote позволяет синхронизировать локальные и удалённые репозитории.

Команда Название Описание
git remote -v Список remote Показывает все настроенные remote-репозитории с URL. Флаг -v (verbose) показывает имя remote и полный URL. Обычно есть origin (основной) и возможно upstream (для форков). Для конкретного remote: git remote -v | grep origin. Для проверки доступности: git ls-remote origin. Для отображения только имён: git remote. Для отображения только URL: git remote get-url origin.
git remote add origin repo-url Добавление remote Добавляет удалённый репозиторий с указанным именем и URL. Имя origin — стандартное по умолчанию. Для добавления нескольких remote (например, для fork workflow): git remote add upstream https://github.com/original/repo.git. Для проверки дубликатов: git remote. Для изменения URL: git remote set-url origin new-url. Для тестирования подключения: git ls-remote origin (должен вернуть список веток).
git fetch Получение изменений Загружает изменения из remote в локальный репозиторий БЕЗ объединения (merge). После fetch вы можете просмотреть изменения перед merge. Загружает remote-ветки как origin/branch-name. Для загрузки конкретного remote: git fetch origin. Для конкретной ветки: git fetch origin main. Для всех remote: git fetch --all. Для отслеживания новых веток: git fetch --prune (удаляет удалённые remote-ветки из локального кеша). Для мониторинга: git fetch --progress (показывает прогресс).
git pull Получение + merge Выполняет git fetch + git merge в одной команде. Загружает изменения и автоматически объединяет с текущей веткой. Аналог: git fetch && git merge origin/main. Для конкретного remote/ветки: git pull origin develop. При конфликте: разрешите и git commit. Для автоматического stash перед pull: git pull --autostash. Для отмены неудачного pull: git reset --hard ORIG_HEAD. Используйте с осторожностью в командной работе — может создать неожиданные merge-commit.
git pull --rebase Pull через rebase Загружает изменения и перемещает локальные commit поверх удалённых (вместо merge-commit). Создаёт более чистую линейную историю. Альтернатива git pull с merge. Для автоматического использования: git config pull.rebase true. При конфликте: разрешите и git rebase --continue. Полезно в feature-branch workflow — каждый commit остаётся отдельным. Для отмены: git rebase --abort. Не используйте на общих ветках без координации команды.
git push Отправка изменений Отправляет локальные commit в remote-репозиторий. Отправляет только ветки с tracking-настройкой. Для конкретной ветки: git push origin main. Для создания новой remote-ветки: git push origin feature-api. Для удаления remote-ветки: git push origin --delete old-feature. Для отправки всех веток: git push --all. Для тегов: git push --tags. При конфликте (remote имеет новые commit): сначала git pull. Для отправки с проверкой: git push --dry-run (без реального push).
git push -u origin main Pull с upstream Отправляет ветку в remote и устанавливает tracking (upstream) для будущей синхронизации. После этого git pull и git push без аргументов будут работать с origin/main. Флаг -u = --set-upstream. Для проверки tracking: git branch -vv. Для изменения upstream: git branch --set-upstream-to origin/main. Для удаления: git branch --unset-upstream. Это стандартный workflow для первой push новой ветки.
git push --force-with-lease Безопасный force push Принудительно отправляет ветку, но проверяет что remote не изменился с последнего fetch (безопаснее --force). Используется после rebase/pick, когда история переписана. Для активации по умолчанию: git config push.forceWithLease true. В отличие от --force, не перезапишет изменения, сделанные другими разработчиками. Для GitHub/GitLab: убедитесь что разрешён force-push. Для полной безопасности: git push --force-with-lease --force-with-lease=origin/main (проверяет конкретный remote-tracking).
git remote remove origin Удаление remote Удаляет удалённый репозиторий из конфигурации. Remote можно добавить обратно: git remote add origin url. Для удаления без подтверждения: git remote remove origin. Альтернатива: git remote rm origin (короткий аналог). Для удаления всех remote: git remote | xargs git remote remove. После удаления потеряется возможность push/pull до добавления нового remote. Для просмотра результата: git remote (должен быть пуст).

Stash

Stash — временное сохранение незафиксированных изменений для переключения на другую задачу. Изменения хранятся как отдельные commit в специальном стеке.

Команда Название Описание
git stash Сохранение изменений Временно сохраняет все изменённые и staged файлы, очищая working directory. Стек stash ограничен (обычно до 50 entries). Для сохранения только staged (не unstaged): git stash -S или git stash --staged. Для сохранения untracked файлов: git stash -u или git stash --include-untracked. Для сохранения ignored файлов: git stash -all или git stash --all. Stash можно восстановить на любой ветке — он не привязан к конкретной ветке.
git stash push -m "WIP auth" Stash с сообщением Сохраняет изменения с именованным сообщением для идентификации. Полезно при множестве stash. Формат: git stash push -m "описание" [path]. Для stash конкретных файлов: git stash push -m "auth" app.js config.js. Для создания в конкретной ветке: git stash push -m "WIP" --include-untracked. Для просмотра содержимого stash: git stash show stash@{n}. Для создания patch-stash (только часть изменений): git stash push -p.
git stash list Список stash Показывает все stash entries с индексами (stash@{0}, stash@{1} и т.д.) и сообщениями. newest stash всегда stash@{0}. Для фильтрации: git stash list --author="Vlad". Для показа конкретного: git stash show stash@{2}. Для удаления пустых stash: git stash prune. Для подсчёта: git stash list | wc -l. Stash сохраняется в .git/refs/stash.
git stash pop Восстановление stash Применяет последний stash (stash@{0}) и удаляет его из стека. Working directory будет содержать сохранённые изменения. Если есть конфликт: разрешите и git add + git commit. Для применения конкретного stash: git stash apply stash@{2}. Для применения без удаления: git stash apply stash@{0}. Для pop с конкретной ветки: сначала переключитесь, затем git stash pop. При ошибке: git stash drop для удаления неудачного stash.
git stash apply Применение stash Применяет stash к текущей ветке БЕЗ удаления из стека. Аналогично pop, но stash остаётся доступным для повторного применения. Для конкретного stash: git stash apply stash@{2}. Для применения в другой директории: git stash apply stash@{0} -- /path/to/dir. Для просмотра без применения: git stash show stash@{0}. Для применения с конфликтом: разрешите как обычный merge. Для создания ветки из stash: git stash branch feature-name stash@{0}.
git stash drop Удаление stash Удаляет указанный stash entry из стека. По умолчанию удаляет последний: git stash drop (аналог git stash drop stash@{0}). Для конкретного: git stash drop stash@{3}. Для удаления всех кроме последнего: git stash drop stash@{1}. После drop stash необратимо удалён — но можно восстановить через git reflog. Для удаления всех stash: git stash clear. Для удаления пустых: git stash prune.
git stash clear Очистка stash Удаляет ВСЕ stash entries из стека. Необратимая операция — все сохранённые изменения будут потеряны. Перед очисткой: git stash list для просмотра. Для безопасной очистки: сначала примените нужные stash, затем git stash clear. Для очистки конкретного диапазона: используйте git stash drop по одному. После clear git stash list вернёт пустой результат.

Tags

Теги (tags) — именованные ссылки на конкретные commit, обычно для версий релизов (v1.0.0, v2.1.3). Два типа: lightweight (просто ссылка) и annotated (с метаинформацией).

Команда Название Описание
git tag Список тегов Показывает все теги репозитория в алфавитном порядке. Для сортировки по версии: git tag -v (нужен git-vtag). Для поиска тегов с паттерном: git tag -l "v2.*" или git tag --list "v2.*". Для показа с commit информацией: git tag -n (сообщение), git tag -n10 (10 символов). Для показа последнего тега: git describe --tags. Для сортировки по дате: git tag --sort=-creatordate (новые первые).
git tag v1.0.0 Создание tag Создаёт lightweight tag — простую ссылку на commit без дополнительной метаинформации. Для конкретного commit: git tag v1.0.0 abc123. Lightweight теги меньше по размеру, но не содержат автора, даты или сообщения. Для создания с подписью (GPG): git tag -s v1.0.0 -m "Release v1.0.0". Для создания на конкретной ветке: переключитесь на нужный commit, затем создайте тег. Lightweight теги нельзя обновить — для изменения создайте новый с тем же именем (перепишет).
git tag -a v1.0 -m "Release" Annotated tag Создаёт annotated tag с полной метаинформацией: автор, дата, сообщение, возможность GPG-подписи. Содержит объект tag в Git-хранилище (в отличие от lightweight). Для создания с конкретным автором: git tag -a v1.0 -m "Release" --author="Vlad ". Для GPG-подписи: git tag -s v1.0.0 -m "Release". Для проверки подписи: git tag -v v1.0.0. Annotated теги рекомендуются для релизов.
git push origin --tags Pull тегов Отправляет все локальные теги в remote-репозиторий. Теги не отправляются автоматически при push — их нужно отправлять отдельно. Для отправки конкретного тега: git push origin v1.0.0. Для отправки всех новых тегов: git push origin --tags. Для удаления remote-тега: git push origin --delete v1.0.0. Для обновления тега: сначала git tag -f v1.0.0, затем git push origin --tags --force. Для просмотра что будет отправлено: git push --dry-run origin --tags.
git tag -d v1.0.0 Удаление tag Удаляет указанный локальный тег. Для удаления: git tag -d v1.0.0 или git tag --delete v1.0.0. Для удаления всех тегов: git tag | xargs git tag -d. После удаления локального тега, удалите и remote: git push origin --delete v1.0.0. Для удаления тега на remote напрямую: git push origin --delete v1.0.0. Удаление тега не удаляет commit — они останутся в репозитории. Для удаления тега и его объектов: git gc --prune=now (осторожно).

Reset / Undo

Reset и Undo — команды для отмены изменений на разных уровнях: HEAD (указатель ветки), staging area (индекс) и working directory. Важно: git reset --hard необратим — изменения безвозвратно теряются.

Команда Название Описание
git reset Reset HEAD Перемещает HEAD и обновляет staging area, но сохраняет working directory. По умолчанию работает в режиме --mixed. Для конкретного commit: git reset abc123. Для отмены последнего commit с сохранением staged: git reset HEAD~1. Для возврата к конкретной ветке: git reset main. После reset неопубликованные commit можно восстановить через git reflog. Для просмотра что будет сброшено: git reset --dry-run (не поддерживается напрямую — используйте git diff HEAD).
git reset --soft Soft reset Перемещает HEAD, но сохраняет staged изменения в staging area и working directory. Полезно для объединения нескольких commit в один: git reset --soft HEAD~3 (объединяет 3 commit). Commit остаётся в staging — следующий commit включит все изменения. Для исправления последнего commit: git reset --soft HEAD~1 + git commit. Working directory не меняется. Hash commit изменится. Используйте git log для проверки результата.
git reset --mixed Mixed reset Перемещает HEAD и обновляет staging area, но сохраняет изменения в working directory (не staged). Это режим по умолчанию для git reset без флага. Изменения остаются в файлах, но нужно заново добавить через git add. Для конкретного commit: git reset --mixed abc123. Для текущей ветки: git reset --mixed HEAD~1. Изменения можно заново stage и commit. Для проверки: git status покажет изменённые файлы.
git reset --hard Hard reset Полностью перемещает HEAD, очищает staging area и обновляет working directory к указанному commit. ВСЕ изменения (staged и unstaged) безвозвратно удаляются. Используйте с крайней осторожностью! Для отмены последнего commit: git reset --hard HEAD~1. Для возврата к конкретной версии: git reset --hard abc123. Для очистки untracked файлов: git clean -fd (отдельная команда). Для безопасности: сначала git status и git diff. Для восстановления после ошибочного reset: git reflog + git reset --hard ORIG_HEAD.
git revert Revert commit Создаёт НОВЫЙ commit, который отменяет изменения указанного commit. В отличие от reset, безопасен для опубликованных веток — не переписывает историю. Для одного commit: git revert abc123. Для диапазона: git revert abc123..def456. Для последнего: git revert HEAD. Для отмены без открытия редактора: git revert --no-edit HEAD. Для отмены нескольких: git revert abc123 def456 ghi789. При конфликте: разрешите и git revert --continue. Для отмены: git revert --abort.
git clean -fd Удаление untracked Удаляет untracked (неотслеживаемые) файлы и директории из working directory. Флаг -f (force) обязателен для реального удаления, -d — включает директории. Для просмотра что будет удалено без удаления: git clean -fd --dry-run. Для удаления только файлов: git clean -f. Для удаления только директорий: git clean -fd. Для удаления ignored файлов: git clean -fdx. Для интерактивного удаления: git clean -i (режим interactive). Для удаления только файлов с расширением: используйте find + git clean. Перед clean всегда делайте --dry-run!

Работа с историей

Команды для анализа и навигации по истории репозитория. Полезны для аудита, поиска причин изменений и понимания эволюции кодовой базы.

Команда Название Описание
git reflog История HEAD Показывает ВСЕ изменения HEAD (и других refs) включая reset, merge, checkout, rebase. В отличие от git log, reflog показывает даже «утраченные» commit. Полезен для восстановления после git reset --hard. Формат: hash@{n: timestamp}. Для поиска потерянного commit: git reflog | grep "message". Для восстановления: git reset --hard abc123 (из reflog). Для конкретного ref: git reflog show origin/main. Для очистки: git reflog expire --expire=now --all. Commit остаются доступны до gc (обычно 30 дней).
git shortlog Краткая статистика Группирует commit по авторам, показывая количество commit каждого. Полезно для оценки вклада участников. Для всего репозитория: git shortlog. Для конкретной ветки: git shortlog main. Для конкретного файла: git shortlog -- app.js. Флаги: -s (только счёт), -n (по количеству), -e (показать email), -a (все ветки), -p (разбивка по подсистемам). Для включения всех коммитов (не только HEAD): git shortlog --all. Для экспорта: git shortlog -s -n --all > CONTRIBUTORS.md.
git describe Описание commit Находит ближайший тег к указанному commit и описывает его в формате tag-N-ghash (N commit после тега, ghash — hash). Полезно для определения версии кода. Для текущего HEAD: git describe. Для конкретного commit: git describe abc123. Для только последнего тега: git describe --tags --abbrev=0. Для тегов с префиксом: git describe --tags --match "v*". Для CI/CD: git describe --always --abbrev=0 (всегда возвращает результат). Для номера версии: git describe --tags | sed 's/^v//' .
git bisect Поиск bug commit Использует бинарный поиск для нахождения commit, который внёс баг. Работает в 3 шага: 1) git bisect start bad good, 2) git bisect run test-command или git bisect good/bad вручную. Для автоматического поиска: git bisect start HEAD~10 v1.0 (bad=HEAD~10, good=v1.0), затем git bisect run npm test. Для ручного: git bisect good (бага нет) / git bisect bad (бага есть). Git сам выберет следующий commit для проверки. Для выхода: git bisect reset. Для визуализации: git bisect visualize.
git range-diff Сравнение rebase Сравнивает два диапазона commit (обычно до и после rebase), показывая как изменились patch-и. Полезно для проверки корректности rebase. Для сравнения: git range-diff origin/main..HEAD main..HEAD. Для сравнения с конкретными диапазонами: git range-diff abc123..def456 ghi789..jkl012. Флаги: --color (подсветка), --indent-heuristic (отступы). Для ревью перед push после rebase: git range-diff HEAD~5 HEAD origin/HEAD~5 origin/HEAD. Показывает: какие commit изменены, какие добавлены, какие удалены. Незаменим для безопасного rebase опубликованных веток.

Worktree и Submodules

Worktree позволяет иметь несколько рабочих директорий для одного репозитория с разными ветками. Submodule позволяет встроить один Git-репозиторий в другой.

Команда Название Описание
git worktree add Дополнительная рабочая копия Создаёт дополнительную рабочую копию репозитория в указанной директории с указанной веткой. Полезно для параллельной работы над несколькими задачами без commit/stash. Для создания: git worktree add ../feature-api feature-api. Для создания из существующей ветки: git worktree add ../hotfix hotfix. Для создания новой ветки: git worktree add -b new-feature ../new-feature. Worktree разделяет объект репозитория, но имеет отдельный staging и working directory. Для проверки: git worktree list. Для удаления: git worktree remove ../feature-api. Для автоматического удаления при удалении ветки: git config worktree.autoprune on.
git worktree list Список worktree Показывает все worktree репозитория с путями и статусом. Формат: path branch HEAD [detached]. Для подробного вывода: git worktree list --porcelain (для скриптов). Для показа только активных: git worktree list | grep -v detached. Для показа с информацией о ветке: git worktree list -v. Для удаления «мёртвых» worktree: git worktree prune. Для проверки что worktree не используется: git worktree list --ahead-behind (показывает разницу с upstream).
git submodule add repo-url libs/core Добавление submodule Добавляет внешний Git-репозиторий как подмодуль в указанную директорию. Создаёт запись в .gitmodules и клонирует репозиторий. Для добавления: git submodule add https://github.com/user/lib.git libs/core. Для именованного submodule: git submodule add -b main repo-url libs/core --name my-lib. После добавления: git add .gitmodules libs/core && git commit -m "Add submodule". Для обновления URL submodule: git submodule set-url libs/core new-url. Для изменения ветки: git submodule update --remote -- libs/core.
git submodule update --init --recursive Инициализация submodule Клонирует инициализирует все подмодули репозитория. --init — инициализирует submodule из .gitmodules. --recursive — рекурсивно обрабатывает вложенные submodules. Для полного клонирования с submodules: git clone --recurse-submodules url. Для обновления до конкретных коммитов: git submodule update. Для обновления до последних удалённых версий: git submodule update --remote. Для инициализации конкретного submodule: git submodule init libs/core && git submodule update libs/core. Для синхронизации URL: git submodule sync --recursive.

Архивация и перенос

Команды для создания переносимых архивов репозитория, которые можно distribute без Git-метаданных или с полной историей.

Команда Название Описание
git archive Создание архива Создаёт архив (zip/tar) содержимого репозитория БЕЗ Git-метаданных. Для конкретного commit/тега: git archive -o release.zip v1.0.0. Для tar с gzip: git archive --format=tar.gz -o release.tar.gz HEAD. Для конкретной директории: git archive -o src.tar HEAD -- src/. Для добавления prefix в архив: git archive --prefix="my-project/" -o release.zip HEAD. Для вывода в stdout: git archive HEAD | gzip > release.tar.gz. Для просмотра содержимое без распаковки: git archive HEAD --list. Полезно для CI/CD деплоя и создания релизов.
git bundle create Bundle репозитория Экспортирует полную Git-историю в один файл, который можно перенести на другую машину и клонировать. Для создания: git bundle create repo.bundle main. Для bundle с условием: git bundle create repo.bundle v1.0.0..HEAD (только новые commit). Для проверки: git bundle verify repo.bundle. Для списка веток: git bundle list-heads repo.bundle. Для клонирования: git clone repo.bundle. Bundle содержит полную историю — размер близок к .git директории. Полезно для переноса репозитория через USB или при отсутствии сетевого доступа.

Диагностика и обслуживание

Команды для проверки целостности, оптимизации и мониторинга состояния Git-репозитория. Полезны при проблемах с производительностью или повреждении данных.

Команда Название Описание
git fsck Проверка репозитория Проверяет целостность Git-объектов и находит повреждённые/сироты. Для полной проверки: git fsck --full. Для показа только ошибок: git fsck --strict. Для показа dangling объектов: git fsck --dangling. Для проверки конкретного объекта: git fsck --unreachable. Для проверки с выводом информации о каждом объекте: git fsck --verbose. Типичные результаты: dangling commit (потерянные commit), dangling blob (потерянные файлы). Для восстановления dangling: git fsck --dangling | grep commit | awk '{print $3}'. Перед git gc всегда запускайте git fsck.
git gc Garbage collection Оптимизирует репозиторий, удаляя неиспользуемые объекты и сжимая данные. Автоматически запускается при push/commit, но можно запустить вручную: git gc. Для принудительной сборки: git gc --prune=now (удаляет всё старше 2 недель). Для удаления конкретных объектов: git gc --prune=abc123. Для оптимизации без удаления: git gc --aggressive (медленнее, но лучше сжатие). Для проверки перед gc: git fsck. Для автоматической настройки: git config gc.auto 256 (автоматически при >256 объектов). Для мониторинга результата: git count-objects -v.
git maintenance run Обслуживание Git Запускает комплексное обслуживание репозитория (Git 2.34+). Включает: gc, repack, index optimization, commit-graph. Для ручного запуска: git maintenance run. Для фоновой работы: git maintenance start (запускает как фоновый процесс). Для остановки: git maintenance stop. Для настройки интервала: git maintenance set --interval daily. Для однократного запуска с aggressive-оптимизацией: git maintenance run --aggressive. Для просмотра статуса: git maintenance status. Работает только с обычными (не bare) репозиториями.
git count-objects -v Статистика объектов Показывает детальную статистику объектов Git. Вывод: count: N (количество объектов), size: N (размер в КБ), in-pack: N (в pack-файлах), packs: N (количество pack), prunable: N (можно удалить), size: N (размер prunable), empty: N (пустые pack). Для краткого формата: git count-objects (только count + size). Для мониторинга роста репозитория: запускайте регулярно. Если prunable большой — запустите git gc --prune=now. Если count > 10000 — репозиторий нуждается в оптимизации.

Современные команды Git

Новые команды Git (2.23+), которые разделяют функциональность старых команд для лучшей ясности и безопасности.

Команда Название Описание
git switch Переключение веток Современная альтернатива checkout для переключения веток (Git 2.23+). Разделяет функциональность checkout: только ветки, не файлы/commit. Для переключения: git switch main. Для создания и переключения: git switch -c feature-api. Для возврата к предыдущей: git switch -. Для detached HEAD: git switch --detach abc123. В отличие от checkout, switch не может случайно восстановить файл — это предотвращает случайные потери. Для настройки по умолчанию: git config checkout.defaultRemote main.
git restore Восстановление файлов Современная команда undo для работы с файлами (Git 2.23+). Разделяет функциональность checkout: только восстановление файлов. Для восстановления файла: git restore app.js (из HEAD). Для восстановления из staging: git restore --source=HEAD app.js. Для восстановления всех файлов: git restore .. Для удаления из staging: git restore --staged app.js. Для восстановления до конкретной версии: git restore --source=abc123 app.js. Для восстановления только working directory (не staging): git restore --worktree app.js. Комбинируйте с switch для полного контроля.
git sparse-checkout Частичный checkout Позволяет клонировать только часть файлов monorepo (экономит место и время). Для инициализации: git sparse-checkout init --cone. Для добавления директорий: git sparse-checkout add libs/core docs. Для списка: git sparse-checkout list. Для удаления: git sparse-checkout remove libs/core. Для отключения: git sparse-checkout disable. Для клонирования с sparse: git clone --filter=blob:none --sparse url && git sparse-checkout init --cone. Для обновления: git sparse-checkout set libs/core src. Работает с Git 2.28+ и server support filter protocol.
git worktree Несколько рабочих директорий Параллельная работа с ветками в отдельных директориях. Для создания: git worktree add ../feature-api feature-api. Для создания новой ветки: git worktree add -b new-feature ../new-feature. Для списка: git worktree list. Для удаления: git worktree remove ../feature-api. Для удаления с принудительным: git worktree remove -f ../feature-api. Для автоматического удаления при удалении ветки: git config worktree.autoprune on. Для очистки мёртвых: git worktree prune. Worktree разделяет объект репозитория, но имеет отдельный staging и working directory. Полезно для hotfix-ов во время разработки.
git maintenance Автоматическое обслуживание Оптимизация репозитория (Git 2.34+). Для запуска: git maintenance run. Для фоновой работы: git maintenance start (запускает как daemon). Для остановки: git maintenance stop. Для статуса: git maintenance status. Для настройки интервала: git maintenance set --interval daily. Для aggressive-режима: git maintenance run --aggressive. Включает: gc, repack, index optimization, commit-graph. Работает только с обычными репозиториями. Для Windows: используйте git maintenance start с планировщиком задач.
git backfill Partial clone objects Загружает недостающие объекты partial clone (Git 2.38+). Для partial clone репозиториев (с --filter): git backfill. Для загрузки конкретных объектов: git backfill pack . Для загрузки всех: git backfill --all. Для проверки статуса: git backfill status. Partial clone загружает объекты по требованию — сначала скачивается только структура. Backfill догружает все объекты для полной локальной работы. Для создания partial clone: git clone --filter=blob:none url. Backfill полезен для очень больших репозиториев (ядро Linux, Chromium).