Git: настройка, репозитории и коммиты
Первая часть гида: конфигурация, создание и клонирование репозиториев, индекс, коммиты и история
Модель Git в трёх зонах
Рабочая папка ──git add──▶ Индекс (staging) ──git commit──▶ Репозиторий (история)
◀────────────git restore / checkout────────────────────────────┘
Изменения сначала попадают в рабочую папку, затем вы выбираете, что добавить в индекс, и только после этого фиксируете коммит. Большинство команд ниже работает именно с этими тремя зонами.
Настройка: git config
| Команда | Вариант | Что делает |
| git config --global user.name | git config --global user.name "Иван Петров" | Имя автора в коммитах. |
| git config --global user.email | git config --global user.email "ivan@example.com" | Email автора. |
| git config --global init.defaultBranch | git config --global init.defaultBranch main | Имя ветки по умолчанию при git init. |
| git config --global core.editor | git config --global core.editor "nano" | Редактор для сообщений коммитов. |
| git config --global pull.rebase | git config --global pull.rebase true | git pull будет делать rebase вместо merge. |
| git config --global core.autocrlf | git config --global core.autocrlf input | Переводы строк: input на Linux и macOS, true на Windows. |
| git config --list | git config --list --show-origin | Все настройки и файлы, где они заданы. |
| git config --local | git config --local user.email "work@company.com" | Настройка только для текущего репозитория. |
| git config --get | git config --get user.email | Значение одной настройки. |
| git config --unset | git config --unset core.editor | Удалить настройку. |
| git config alias | git config --global alias.st status | Создать короткое имя команды. |
Создание и клонирование
| Команда | Вариант | Что делает |
| git init | git init | Создать репозиторий в текущей папке. |
| git init -b | git init -b main my-project | Создать папку и репозиторий с веткой main. |
| git clone | git clone git@github.com:user/repo.git | Скопировать репозиторий с историей. |
| git clone имя | git clone https://github.com/user/repo.git mydir | Клонировать в папку с другим именем. |
| git clone --depth | git clone --depth 1 https://github.com/user/repo.git | Поверхностный клон: только последний коммит (быстро, но история неполная). |
| git clone --branch | git clone -b release/2.0 --single-branch URL | Клонировать одну ветку. |
| git clone --recurse-submodules | git clone --recurse-submodules URL | Сразу подтянуть подмодули. |
| git clone --filter | git clone --filter=blob:none URL | Частичный клон: файлы подгружаются по требованию (для больших репозиториев). |
Статус и индекс
| Команда | Вариант | Что делает |
| git status | git status | Что изменено, что в индексе, что не отслеживается. |
| git status -s | git status -s | Короткий формат: M — изменён, A — добавлен, ?? — не отслеживается. |
| git add | git add src/app.py | Добавить файл в индекс. |
| git add . | git add . | Добавить всё в текущей папке и ниже (проверяйте статус, чтобы не попал мусор). |
| git add -A | git add -A | Добавить все изменения во всём репозитории, включая удаления. |
| git add -p | git add -p | Добавлять по кускам (hunks): y — взять, n — пропустить, s — разбить. |
| git add -u | git add -u | Только уже отслеживаемые файлы (новые не трогает). |
| git restore --staged | git restore --staged app.py | Убрать файл из индекса, оставив изменения в рабочей папке. |
| git rm --cached | git rm --cached secrets.env | Перестать отслеживать файл, но оставить его на диске (например, после добавления в .gitignore). |
| git mv | git mv old.py new.py | Переименовать с сохранением истории. |
| git rm | git rm old.py | Удалить файл из репозитория и с диска. |
Коммиты
| Команда | Вариант | Что делает |
| git commit -m | git commit -m "fix: таймаут подключения к БД" | Коммит с однострочным сообщением. |
| git commit | git commit | Откроет редактор для сообщения (многострочное). |
| git commit -am | git commit -am "docs: обновить README" | Добавить уже отслеживаемые изменения и закоммитить (новые файлы не добавляются). |
| git commit --amend | git commit --amend -m "новое сообщение" | Переписать последний коммит (только локальный!). |
| git commit --amend --no-edit | git add forgotten.txt && git commit --amend --no-edit | Добавить забытый файл в последний коммит без смены сообщения. |
| git commit --allow-empty | git commit --allow-empty -m "trigger CI" | Пустой коммит, например чтобы перезапустить сборку. |
| git commit -v | git commit -v | Показать диф прямо в редакторе сообщения. |
| git commit --fixup | git commit --fixup=abc1234 | Коммит-исправление для последующего автосквоша при rebase -i. |
| git commit -S | git commit -S -m "signed" | Подписать коммит GPG-ключом. |
Просмотр истории и различий
| Команда | Вариант | Что делает |
| git log | git log | История коммитов. |
| git log --oneline | git log --oneline -n 15 | Коротко: хэш и заголовок, 15 последних. |
| git log --graph | git log --oneline --graph --decorate --all | Граф всех веток. |
| git log -p | git log -p -2 | Показать диф для каждого коммита. |
| git log --stat | git log --stat -3 | Какие файлы и сколько строк изменились. |
| git log --author | git log --author="Иван" --since="2 weeks ago" | Коммиты автора за период. |
| git log --since / --until | git log --since="2026-01-01" --until="2026-02-01" | Интервал дат. |
| git log -- путь | git log --oneline -- src/api/ | История конкретного файла или папки. |
| git log --grep | git log --grep="fix" -i --oneline | Поиск по тексту сообщения (-i без учёта регистра). |
| git log -S | git log -S "timeout" --oneline | Коммиты, где количество вхождений строки изменилось. |
| git log --format | git log --format="%h %an %ad %s" --date=short | Свой формат вывода: %h хэш, %an автор, %ad дата, %s тема. |
| git show | git show abc1234 | Коммит и его диф. |
| git show --stat | git show --stat HEAD | Последний коммит: только файлы. |
| git diff | git diff | Изменения в рабочей папке, которые не в индексе. |
| git diff --staged | git diff --staged | Что попадёт в следующий коммит. |
| git diff HEAD~1 | git diff HEAD~1 HEAD -- app.py | Сравнить с предыдущим коммитом по конкретному файлу. |
| git diff --name-only | git diff --name-only main...feature | Только имена файлов, которые различаются между ветками. |
| git blame | git blame -L 40,60 app.py | Кто и когда написал каждую строку в диапазоне. |
| git shortlog | git shortlog -sn | Число коммитов по авторам. |
| git describe | git 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. Так вы поймаете случайно добавленные пароли, временные файлы и отладочный код, пока их ещё легко убрать.