Git: настройка, репозитории и коммиты

Первая часть гида: конфигурация, создание и клонирование репозиториев, индекс, коммиты и история

Модель Git в трёх зонах

Рабочая папка  ──git add──▶  Индекс (staging)  ──git commit──▶  Репозиторий (история)
      ◀────────────git restore / checkout────────────────────────────┘

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

Настройка: git config

КомандаВариантЧто делает
git config --global user.namegit config --global user.name "Иван Петров"Имя автора в коммитах.
git config --global user.emailgit config --global user.email "ivan@example.com"Email автора.
git config --global init.defaultBranchgit config --global init.defaultBranch mainИмя ветки по умолчанию при git init.
git config --global core.editorgit config --global core.editor "nano"Редактор для сообщений коммитов.
git config --global pull.rebasegit config --global pull.rebase truegit pull будет делать rebase вместо merge.
git config --global core.autocrlfgit config --global core.autocrlf inputПереводы строк: input на Linux и macOS, true на Windows.
git config --listgit config --list --show-originВсе настройки и файлы, где они заданы.
git config --localgit config --local user.email "work@company.com"Настройка только для текущего репозитория.
git config --getgit config --get user.emailЗначение одной настройки.
git config --unsetgit config --unset core.editorУдалить настройку.
git config aliasgit config --global alias.st statusСоздать короткое имя команды.

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

КомандаВариантЧто делает
git initgit initСоздать репозиторий в текущей папке.
git init -bgit init -b main my-projectСоздать папку и репозиторий с веткой main.
git clonegit clone git@github.com:user/repo.gitСкопировать репозиторий с историей.
git clone имяgit clone https://github.com/user/repo.git mydirКлонировать в папку с другим именем.
git clone --depthgit clone --depth 1 https://github.com/user/repo.gitПоверхностный клон: только последний коммит (быстро, но история неполная).
git clone --branchgit clone -b release/2.0 --single-branch URLКлонировать одну ветку.
git clone --recurse-submodulesgit clone --recurse-submodules URLСразу подтянуть подмодули.
git clone --filtergit clone --filter=blob:none URLЧастичный клон: файлы подгружаются по требованию (для больших репозиториев).

Статус и индекс

КомандаВариантЧто делает
git statusgit statusЧто изменено, что в индексе, что не отслеживается.
git status -sgit status -sКороткий формат: M — изменён, A — добавлен, ?? — не отслеживается.
git addgit add src/app.pyДобавить файл в индекс.
git add .git add .Добавить всё в текущей папке и ниже (проверяйте статус, чтобы не попал мусор).
git add -Agit add -AДобавить все изменения во всём репозитории, включая удаления.
git add -pgit add -pДобавлять по кускам (hunks): y — взять, n — пропустить, s — разбить.
git add -ugit add -uТолько уже отслеживаемые файлы (новые не трогает).
git restore --stagedgit restore --staged app.pyУбрать файл из индекса, оставив изменения в рабочей папке.
git rm --cachedgit rm --cached secrets.envПерестать отслеживать файл, но оставить его на диске (например, после добавления в .gitignore).
git mvgit mv old.py new.pyПереименовать с сохранением истории.
git rmgit rm old.pyУдалить файл из репозитория и с диска.

Коммиты

КомандаВариантЧто делает
git commit -mgit commit -m "fix: таймаут подключения к БД"Коммит с однострочным сообщением.
git commitgit commitОткроет редактор для сообщения (многострочное).
git commit -amgit commit -am "docs: обновить README"Добавить уже отслеживаемые изменения и закоммитить (новые файлы не добавляются).
git commit --amendgit commit --amend -m "новое сообщение"Переписать последний коммит (только локальный!).
git commit --amend --no-editgit add forgotten.txt && git commit --amend --no-editДобавить забытый файл в последний коммит без смены сообщения.
git commit --allow-emptygit commit --allow-empty -m "trigger CI"Пустой коммит, например чтобы перезапустить сборку.
git commit -vgit commit -vПоказать диф прямо в редакторе сообщения.
git commit --fixupgit commit --fixup=abc1234Коммит-исправление для последующего автосквоша при rebase -i.
git commit -Sgit commit -S -m "signed"Подписать коммит GPG-ключом.

Просмотр истории и различий

КомандаВариантЧто делает
git loggit logИстория коммитов.
git log --onelinegit log --oneline -n 15Коротко: хэш и заголовок, 15 последних.
git log --graphgit log --oneline --graph --decorate --allГраф всех веток.
git log -pgit log -p -2Показать диф для каждого коммита.
git log --statgit log --stat -3Какие файлы и сколько строк изменились.
git log --authorgit log --author="Иван" --since="2 weeks ago"Коммиты автора за период.
git log --since / --untilgit log --since="2026-01-01" --until="2026-02-01"Интервал дат.
git log -- путьgit log --oneline -- src/api/История конкретного файла или папки.
git log --grepgit log --grep="fix" -i --onelineПоиск по тексту сообщения (-i без учёта регистра).
git log -Sgit log -S "timeout" --onelineКоммиты, где количество вхождений строки изменилось.
git log --formatgit log --format="%h %an %ad %s" --date=shortСвой формат вывода: %h хэш, %an автор, %ad дата, %s тема.
git showgit show abc1234Коммит и его диф.
git show --statgit show --stat HEADПоследний коммит: только файлы.
git diffgit diffИзменения в рабочей папке, которые не в индексе.
git diff --stagedgit diff --stagedЧто попадёт в следующий коммит.
git diff HEAD~1git diff HEAD~1 HEAD -- app.pyСравнить с предыдущим коммитом по конкретному файлу.
git diff --name-onlygit diff --name-only main...featureТолько имена файлов, которые различаются между ветками.
git blamegit blame -L 40,60 app.pyКто и когда написал каждую строку в диапазоне.
git shortloggit shortlog -snЧисло коммитов по авторам.
git describegit describe --tagsБлижайший тег и число коммитов после него.

Удобные варианты статуса и диффа

# Что будет в коммите и насколько он велик
git diff --staged --stat

# Просмотр изменений по словам, а не по строкам
git diff --word-diff

# Игнорировать пробелы и переводы строк в диффе
git diff -w

# Диф с учётом перемещённых блоков
git diff --color-moved=default
git commit --amend и любые переписывания истории опасны, если коммит уже отправлен в общий репозиторий. Другие разработчики получат расхождение истории. Переписывайте только локальные коммиты.
Перед коммитом всегда смотрите git status и git diff --staged. Так вы поймаете случайно добавленные пароли, временные файлы и отладочный код, пока их ещё легко убрать.