Git - система контроля версий: она запоминает каждое сохранённое состояние проекта, позволяет вернуться к любому из них и вести несколько линий разработки параллельно. Каждый день нужен десяток команд, остальные открывают раз в месяц и забывают. Здесь собраны основные команды Git с примерами: от первой настройки до веток, слияния и отмены ошибок. Шпаргалка подходит для Linux, macOS и Windows (в Git Bash, PowerShell или командной строке команды одинаковые).

Как устроен Git за минуту

Чтобы команды не казались заклинаниями, достаточно понять три места, где живут изменения:

  1. Рабочая папка - файлы, которые вы правите в редакторе.
  2. Индекс (staging area) - «корзина» изменений, которые войдут в следующий коммит. Туда их кладёт git add.
  3. Репозиторий - история коммитов в скрытой папке .git. Туда изменения попадают после git commit.

Коммит - это снимок проекта с автором, датой и сообщением. У каждого коммита есть хеш вроде c4e02fb, по нему к коммиту можно обратиться в любой команде. Ветка - просто подвижный указатель на последний коммит линии разработки, поэтому создаются и удаляются ветки мгновенно.

Удалённый репозиторий (GitHub, GitLab, Gitea, свой сервер) - копия истории на другом компьютере. С ним обмениваются коммитами командами push, pull и fetch.

Установка и первая настройка

Проверить, установлен ли Git:

bash
git --version

Если команда не найдена, установите Git:

  • Windows - установщик с git-scm.com, вместе с ним ставится Git Bash.
  • macOS - xcode-select --install или brew install git.
  • Debian и Ubuntu - sudo apt install git, Fedora - sudo dnf install git. Подробнее о пакетных менеджерах - в статье про управление пакетами в Linux.

Один раз после установки укажите имя и почту. Они записываются в каждый коммит:

bash
git config --global user.name "Иван Петров"
git config --global user.email "ivan@example.com"
git config --global init.defaultBranch main

Последняя строка делает основную ветку новых репозиториев main вместо старого master. Посмотреть все настройки можно командой git config --list.

Создать репозиторий или скачать готовый

Команда Что делает
git init Превращает текущую папку в репозиторий (создаёт .git)
git clone URL Скачивает удалённый репозиторий целиком, со всей историей
git clone URL папка То же, но в папку с указанным именем
git clone --depth 1 URL Скачивает только последний коммит, без истории - быстро для больших проектов
bash
mkdir site && cd site
git init

Основной цикл: status, add, commit

Почти вся работа - это повторение трёх шагов: посмотреть, что изменилось, добавить нужное в индекс и сохранить коммит.

bash
git status
git add index.html style.css
git commit -m "Первая версия сайта"

git status - самая полезная команда, запускайте её всегда, когда не уверены. Она показывает текущую ветку, файлы в индексе, изменённые и новые файлы, а ещё подсказывает, какой командой отменить действие.

Вывод git status в новом репозитории: два неотслеживаемых файла

Команда Что делает
git add файл Добавляет изменения файла в индекс
git add . Добавляет все изменения в текущей папке и ниже
git add -p Показывает изменения кусками и спрашивает, какие добавить
git commit -m "текст" Создаёт коммит из индекса
git commit -am "текст" Добавляет все изменённые отслеживаемые файлы и сразу коммитит (новые файлы не попадут)
git commit --amend Исправляет последний коммит: сообщение или забытый файл
git rm файл Удаляет файл с диска и из репозитория
git mv старое новое Переименовывает или перемещает файл

Сообщение коммита пишите так, чтобы через полгода было понятно, что сделано: «Исправлен расчёт доставки», а не «правки».

Смотрим изменения и историю

Команда Что показывает
git diff Изменения в рабочей папке, которые ещё не в индексе
git diff --staged Изменения в индексе, которые войдут в коммит
git diff main..feature Разницу между двумя ветками
git log Историю коммитов с автором и датой
git log --oneline Историю в одну строку на коммит
git log --oneline --graph --all Историю всех веток в виде графа
git log -p файл Все изменения конкретного файла
git show хеш Содержимое одного коммита
git blame файл Кто и в каком коммите менял каждую строку

В выводе git diff удалённые строки начинаются с минуса, добавленные - с плюса:

Команды git status и git diff: изменён index.html, добавлена строка footer

Если история не помещается на экран, Git открывает её в просмотрщике: листать стрелками или пробелом, выйти клавишей q.

Ветки: создать, переключиться, слить

Ветки нужны, чтобы делать новую функцию или исправление, не ломая рабочую версию. Обычный порядок такой:

bash
git switch -c feature/menu      # создать ветку и перейти в неё
# ...правим файлы...
git commit -am "Добавлено меню"
git switch main                 # вернуться в основную ветку
git merge feature/menu          # влить изменения
git branch -d feature/menu      # удалить ветку, она больше не нужна
Команда Что делает
git branch Список локальных веток, текущая отмечена звёздочкой
git branch -a Локальные и удалённые ветки
git branch имя Создаёт ветку, но не переключается в неё
git switch имя Переключается в ветку
git switch -c имя Создаёт ветку и сразу переключается
git checkout имя Старый способ переключения, работает и сейчас
git merge ветка Вливает ветку в текущую
git rebase main Переносит коммиты текущей ветки поверх свежего main
git branch -d имя Удаляет слитую ветку
git branch -D имя Удаляет ветку принудительно, даже неслитую

Команды git switch и git restore появились в Git 2.23 как понятная замена перегруженной git checkout. В старых инструкциях вы встретите checkout, она делает то же самое.

Так выглядит история после слияния: ветка feature/menu ответвилась, получила свой коммит и вернулась в main коммитом слияния.

Граф git log --oneline --graph --all после слияния ветки feature/menu

Если при слиянии возник конфликт

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

html
<<<<<<< HEAD
<h1>Главная</h1>
=======
<h1>Добро пожаловать</h1>
>>>>>>> feature/menu

Оставьте нужный вариант, удалите служебные строки с <<<<<<<, ======= и >>>>>>>, затем:

bash
git add index.html
git commit

Передумали сливать - git merge --abort вернёт всё как было до слияния.

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

Команда Что делает
git remote -v Показывает подключённые удалённые репозитории
git remote add origin URL Подключает удалённый репозиторий под именем origin
git push -u origin main Первая отправка ветки, связывает её с удалённой
git push Отправляет новые коммиты текущей ветки
git fetch Скачивает новые коммиты, но не меняет ваши файлы
git pull Скачивает и сразу вливает изменения в текущую ветку
git pull --rebase То же, но ставит ваши коммиты поверх чужих, без лишнего коммита слияния
git push origin --delete имя Удаляет ветку на сервере

Если git push отвечает rejected и fetch first, значит, на сервере есть коммиты, которых нет у вас. Сначала выполните git pull, потом снова git push.

Как отменить изменения

Это раздел, ради которого шпаргалку чаще всего открывают. Выбирайте команду по тому, где сейчас лежит ошибка.

Ситуация Команда
Испортил файл, хочу вернуть как в последнем коммите git restore файл
Добавил файл в индекс по ошибке git restore --staged файл
Опечатка в сообщении последнего коммита (ещё не отправлен) git commit --amend -m "новый текст"
Отменить последний коммит, но сохранить изменения git reset --soft HEAD~1
Удалить последний коммит вместе с изменениями git reset --hard HEAD~1
Отменить коммит, который уже отправлен на сервер git revert хеш
Удалить все неотслеживаемые файлы git clean -n (посмотреть), затем git clean -f

Главное правило: reset и --amend переписывают историю, поэтому их применяют только к коммитам, которые вы ещё не отправили. Для опубликованных коммитов есть git revert: он создаёт новый коммит, обратный ошибочному, и никому не ломает историю.

git reset --hard и git restore удаляют несохранённые правки без возврата. Если сомневаетесь, сначала сделайте git stash.

Если коммит пропал после неудачного reset, его почти всегда можно найти: git reflog показывает все положения веток за последние недели. Найдите нужный хеш и выполните git reset --hard хеш.

Отложить работу: git stash

Бывает, что нужно срочно переключиться на другую ветку, а текущие правки ещё не готовы для коммита. Их можно временно спрятать:

Команда Что делает
git stash Прячет незакоммиченные изменения и очищает рабочую папку
git stash -u То же, включая новые неотслеживаемые файлы
git stash list Список отложенных изменений
git stash pop Возвращает последние отложенные изменения и удаляет их из списка
git stash apply Возвращает изменения, но оставляет их в списке
git stash drop Удаляет последнюю запись из списка

Метки версий: git tag

Метки отмечают коммиты, которые стали релизами:

bash
git tag -a v1.0 -m "Первый релиз"
git push origin v1.0
git tag                 # список меток

Файл .gitignore

Чтобы Git не предлагал добавить мусор (логи, сборки, папку зависимостей, файлы с паролями), перечислите его в файле .gitignore в корне проекта:

text
node_modules/
dist/
*.log
.env
.DS_Store

.gitignore действует только на файлы, которые ещё не отслеживаются. Если файл уже попал в репозиторий, уберите его из индекса, не удаляя с диска: git rm --cached файл.

Полезные алиасы

Длинные команды можно сократить. Например, после этих строк git st будет работать как git status, а git lg покажет граф истории:

bash
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --all"

Короткая шпаргалка на каждый день

Задача Команда
Что изменилось git status, git diff
Сохранить работу git add . и git commit -m "..."
Новая ветка git switch -c имя
Влить ветку git switch main и git merge имя
Получить чужие изменения git pull
Отправить свои git push
Вернуть файл git restore файл
Отменить отправленный коммит git revert хеш
Найти потерянный коммит git reflog

Полное описание каждой команды есть во встроенной справке: git help команда или git команда -h для краткой версии.