ШПАРГАЛКА

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 почти всегда подсказывает следующий шаг и нужную команду.

Поддержать проект