Git
Шпаргалка по Git: config, commit, ветки, merge, push/pull, stash, отмена изменений, конфликты, теги, rebase и таблица частых команд.
Git — это распределённая система контроля версий. Она хранит историю изменений проекта, позволяет работать в ветках, откатывать ошибки и совместно вести разработку. Ниже — компактная шпаргалка с рабочими командами для повседневной работы.
Настройка (config)
Первое, что нужно сделать после установки Git — представиться. Имя и почта попадают в каждый коммит. Флаг --global задаёт настройки для всех репозиториев пользователя.
# кто вы (попадёт в коммиты)
git config --global user.name "Иван Петров"
git config --global user.email "[email protected]"
# редактор для сообщений коммитов
git config --global core.editor "code --wait"
# ветка по умолчанию при init
git config --global init.defaultBranch main
# посмотреть все настройки и откуда они взяты
git config --list
git config --list --show-origin
# узнать одно значение
git config user.email
Полезные алиасы сокращают набор частых команд:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph --all"
Создание и клонирование репозитория
Новый репозиторий создаётся командой git init, существующий — копируется через git clone.
# создать репозиторий в текущей папке
git init
# создать в новой папке
git init my-project
# клонировать удалённый репозиторий
git clone https://github.com/user/repo.git
# клонировать в папку с другим именем
git clone https://github.com/user/repo.git my-folder
# клонировать только последний коммит (быстрее, мельче)
git clone --depth 1 https://github.com/user/repo.git
Базовый цикл: status / add / commit
Повседневная работа крутится вокруг трёх действий: посмотреть статус, добавить изменения в индекс (stage) и зафиксировать их коммитом.
# что изменилось
git status
git status -s # короткий вид
# добавить файлы в индекс
git add file.txt # один файл
git add src/ # папку
git add . # всё в текущей папке
git add -A # все изменения в репозитории
# зафиксировать
git commit -m "Добавил форму входа"
# add + commit для уже отслеживаемых файлов
git commit -am "Поправил валидацию"
Жизненный цикл файла: неотслеживаемый → проиндексированный (после add) → закоммиченный (после commit). Убрать файл из индекса, не теряя изменений:
git restore --staged file.txt # современный вариант
git reset HEAD file.txt # старый вариант
Просмотр истории: log и diff
История коммитов смотрится через git log, а сами изменения — через git diff.
# история
git log
git log --oneline # по строке на коммит
git log --oneline --graph --all # с графом веток
git log -5 # последние 5
git log --author="Иван" # коммиты автора
git log -- file.txt # история одного файла
# что именно изменилось
git diff # рабочая папка vs индекс
git diff --staged # индекс vs последний коммит
git diff HEAD # все незакоммиченные изменения
git diff main..dev # разница между ветками
# подробности коммита
git show
Ветки: branch / switch / checkout / merge
Ветки позволяют разрабатывать фичи изолированно. Современный Git предлагает git switch для переключения и git branch для управления; старый универсальный git checkout тоже работает.
# список веток
git branch # локальные
git branch -a # включая удалённые
# создать ветку
git branch feature-login
# переключиться (современно)
git switch feature-login
# создать и сразу переключиться
git switch -c feature-login
git checkout -b feature-login # старый эквивалент
# вернуться на main
git switch main
Слияние (merge) переносит изменения из одной ветки в текущую:
# находясь на main, влить feature-login
git switch main
git merge feature-login
# слияние без fast-forward (всегда отдельный коммит слияния)
git merge --no-ff feature-login
Работа с удалёнкой: remote / fetch / pull / push
Удалённый репозиторий (обычно origin) — это копия на сервере (GitHub, GitLab и т.п.).
# посмотреть удалённые
git remote -v
# подключить удалённый репозиторий
git remote add origin https://github.com/user/repo.git
# сменить URL
git remote set-url origin [email protected]:user/repo.git
fetch / pull / push: fetch только скачивает изменения, pull = fetch + merge, push отправляет ваши коммиты.
# скачать изменения, но не сливать
git fetch origin
# забрать и влить
git pull
git pull --rebase # без коммита слияния, история линейнее
# отправить коммиты
git push
# первый push новой ветки (свяжет с удалённой)
git push -u origin feature-login
Отмена изменений: restore / reset / revert / checkout
Это самый частый источник путаницы. Выбор зависит от того, где находятся изменения и нужно ли менять историю.
Отменить правки в рабочей папке (ещё не в индексе)
git restore file.txt # вернуть файл к последнему коммиту
git checkout -- file.txt # старый вариант
git restore . # отменить все правки
Убрать из индекса (но оставить правки)
git restore --staged file.txt
reset — двигать указатель ветки
# отменить последний коммит, оставить изменения в рабочей папке
git reset --soft HEAD~1 # изменения остаются в индексе
git reset HEAD~1 # (--mixed) изменения в рабочей папке
git reset --hard HEAD~1 # ОПАСНО: удаляет изменения совсем
revert — безопасная отмена в публичной истории
# создаёт новый коммит, отменяющий указанный — историю не переписывает
git revert
Правило: для уже запушенных коммитов используйте revert, а не reset --hard, чтобы не ломать историю у коллег.
Временное откладывание: stash
git stash прячет незакоммиченные изменения, чтобы переключиться на другую задачу с чистой рабочей папкой.
# спрятать изменения
git stash
git stash push -m "черновик формы" # с описанием
# список тайников
git stash list
# вернуть последний тайник
git stash pop # вернуть и удалить из стэша
git stash apply # вернуть, но оставить в стэше
# вернуть конкретный
git stash apply stash@{1}
# удалить
git stash drop stash@{0}
git stash clear # удалить все
Файл .gitignore
В .gitignore перечисляют файлы и папки, которые Git должен игнорировать (зависимости, сборки, секреты).
# пример .gitignore
node_modules/
dist/
*.log
.env
.DS_Store
__pycache__/
*.pyc
Если файл уже был закоммичен, добавление в .gitignore не поможет — нужно убрать его из индекса:
git rm --cached .env
git commit -m "Убрал .env из репозитория"
Разрешение конфликтов
Конфликт возникает, когда одна и та же строка изменена по-разному в сливаемых ветках. Git помечает спорные места в файле.
# после merge с конфликтом
git status # покажет файлы с конфликтами (Unmerged)
Внутри файла Git вставляет маркеры — нужно вручную выбрать нужный вариант и удалить маркеры:
<<<<<<< HEAD
ваш вариант (текущая ветка)
=======
чужой вариант (вливаемая ветка)
>>>>>>> feature-login
После правок:
git add файл-с-конфликтом
git commit # завершить merge
# передумали сливать — отменить merge целиком
git merge --abort
Теги
Теги отмечают важные точки истории — обычно релизы (v1.0.0).
# список тегов
git tag
# лёгкий тег
git tag v1.0.0
# аннотированный тег (с автором и сообщением — рекомендуется)
git tag -a v1.0.0 -m "Первый релиз"
# тег на конкретный коммит
git tag -a v0.9.0 -m "Бета"
# отправить теги на удалёнку
git push origin v1.0.0
git push --tags
# удалить тег
git tag -d v1.0.0
git push origin --delete v1.0.0
Rebase кратко
git rebase переносит коммиты ветки на новое основание, делая историю линейной. В отличие от merge, не создаёт коммит слияния.
# перенести коммиты текущей ветки поверх main
git switch feature-login
git rebase main
# интерактивный rebase: объединить/переписать последние 3 коммита
git rebase -i HEAD~3
# при конфликте: поправить, затем
git add файл
git rebase --continue
# отменить начатый rebase
git rebase --abort
Важно: не делайте rebase уже запушенных коммитов, которые видят другие — это переписывает историю и ломает их копии.
Типовые сценарии
Откатить последний коммит
# оставить изменения в рабочей папке
git reset --soft HEAD~1
# выбросить коммит и изменения целиком (опасно)
git reset --hard HEAD~1
# уже запушен — безопасная отмена новым коммитом
git revert HEAD
Удалить ветку
# локально (только если слита)
git branch -d feature-login
# принудительно
git branch -D feature-login
# на удалёнке
git push origin --delete feature-login
Исправить сообщение последнего коммита
git commit --amend -m "Новое сообщение"
# если коммит уже запушен — придётся force-push (осторожно)
git push --force-with-lease
Забрать чужие изменения
git switch main
git pull
# или линейно, без коммита слияния
git pull --rebase
Добавить забытый файл в последний коммит
git add forgotten.txt
git commit --amend --no-edit
Частые команды
| Команда | Что делает |
|---|---|
git init | создать репозиторий |
git clone <url> | склонировать удалённый репозиторий |
git status | показать состояние рабочей папки |
git add <файл> | добавить в индекс |
git commit -m "…" | зафиксировать изменения |
git log --oneline | краткая история коммитов |
git diff | незакоммиченные изменения |
git branch | список веток |
git switch -c <ветка> | создать и перейти в ветку |
git merge <ветка> | влить ветку в текущую |
git pull | забрать и влить изменения |
git push | отправить коммиты |
git push -u origin <ветка> | первый push новой ветки |
git stash / git stash pop | спрятать / вернуть изменения |
git restore <файл> | отменить правки файла |
git reset --soft HEAD~1 | отменить последний коммит |
git revert <hash> | безопасно отменить коммит |
git commit --amend | исправить последний коммит |
git tag -a v1.0.0 -m "…" | создать аннотированный тег |
git rebase main | перенести ветку поверх main |
git branch -d <ветка> | удалить ветку |
Совет: если запутались — git status почти всегда подсказывает следующий шаг и нужную команду.