Git — распределённая система контроля версий: фиксируй изменения, ветвись, сливай и безопасно экспериментируй.

📝 Топ‑20 самых полезных флагов Git (быстрый обзор)#

  • -p — показывать патчи (diff) для команд вроде git show, git log -p, git add -p (интерактивно по кускам).
  • -n — ограничение количества (например, git log -n 5).
  • --oneline — компактный вывод коммитов в одну строку.
  • --graph — псевдографика веток в логе.
  • --decorate — показывать имена веток/тегов рядом с коммитами.
  • -a — для git commit: добавить все отслеживаемые изменения.
  • -m "msg" — сообщение коммита прямо в командной строке.
  • -am "msg" — добавить отслеживаемые изменения и закоммитить одним шагом.
  • --amend — переписать последний коммит (сообщение/содержимое).
  • --no-ff — принудительный merge-коммит даже без дополнительных изменений.
  • --rebase — ребейз вместо merge при git pull --rebase.
  • -u/--set-upstream — связать локальную ветку с удалённой (git push -u origin feature).
  • --staged/--cached — работать только с проиндексированными изменениями (git diff --staged).
  • --soft/--mixed/--hard — режимы git reset (мягко/индекс/жёстко).
  • --force-with-lease — безопаснее, чем --force, при перезаписи истории на push.
  • --depth N — неглубокое клонирование/фетч (shallow clone).
  • --single-branch — клонировать только одну ветку.
  • --tags — явная работа с тегами (fetch/push).
  • --all — для многих команд работать со всеми ветками/ремоутами.
  • --prune — очистка удалённых ссылок на несуществующие ветки при fetch.

🚀 Айсберг команд git — от базового к гуру#

🟢 Уровень 1 — База (разогрев)#

git init

  • Инициализировать репозиторий в текущей папке

git clone git@github.com:user/project.git

  • Клонировать удалённый репозиторий

git status

  • Показать состояние: изменённые/новые/удалённые файлы

git add file.txt

  • Добавить файл в индекс

git add -A

  • Проиндексировать все изменения (добавления/удаления/изменения)

git commit -m "msg"

  • Создать коммит с сообщением

git log --oneline --graph --decorate --all

  • Красивый компактный лог с ветками

git diff

  • Показать непроиндексированные изменения

git diff --staged

  • Показать изменения, находящиеся в индексе (перед коммитом)

🟡 Уровень 2 — Ветки и переключения#

git branch

  • Список локальных веток

git branch -a

  • Список локальных и удалённых веток

git switch -c feature

  • Создать ветку feature и сразу переключиться

git switch main

  • Переключиться на main (современная альтернатива checkout)

git branch -d feature

  • Удалить локальную ветку (безопасно, если слита)

git branch -D feature

  • Принудительно удалить локальную ветку

git push origin --delete feature

  • Удалить ветку на сервере

git branch -m old new

  • Переименовать текущую ветку из old в new

🟠 Уровень 3 — Ремоты и синхронизация#

git remote -v

  • Показать подключённые удалённые репозитории

git remote add origin git@github.com:user/project.git

  • Добавить удалённый репозиторий origin

git fetch origin

  • Забрать изменения без слияния

git pull origin main

  • Забрать и слить изменения из origin/main

git pull --rebase

  • Подтянуть изменения и переписать сверху свои коммиты (линейная история)

git push origin main

  • Отправить текущую ветку на сервер

git push -u origin feature

  • Впервые запушить feature и связать её с origin/feature

git fetch --prune

  • Удалить «висячие» ссылки на удалённые ветки

🔵 Уровень 4 — Откаты и восстановление#

git restore file.txt

  • Отменить локальные правки файла (вернуть из HEAD)

git restore --staged file.txt

  • Убрать файл из индекса (оставив изменения в рабочем каталоге)

git reset --soft HEAD~1

  • Откатить последний коммит, оставив всё в индексе

git reset --mixed HEAD~1

  • Откатить коммит и вынуть изменения из индекса (по умолчанию)

git reset --hard HEAD~1

  • Полный откат к предыдущему коммиту (осторожно!)

git revert <hash>

  • Создать обратный коммит, отменяющий изменения указанного коммита

git checkout <hash> -- path/to/file

  • Извлечь версию файла из старого коммита в текущую ветку

git restore -s <hash> -- path/to/file

  • Современный эквивалент извлечения файла из указанного коммита

🟣 Уровень 5 — Слияния, ребейз и конфликт‑менеджмент#

git merge feature

  • Слить ветку feature в текущую

git merge --no-ff feature

  • Создать merge-коммит даже при fast‑forward

git rebase main

  • Перенести текущую ветку поверх main

git rebase -i HEAD~5

  • Интерактивный ребейз последних 5 коммитов (squash, reword, drop)

git cherry-pick <hash>

  • Забрать отдельно один коммит в текущую ветку

git mergetool

  • Запустить графический/внешний инструмент для разрешения конфликтов

git rerere enable

  • Включить запоминание решений конфликтов (reuse recorded resolution)

🔴 Уровень 6 — Поиск, анализ и история#

git log --since="2 weeks ago" --author="name" -- path/

  • История по автору, времени и пути

git log -p -n 3

  • Показать последние 3 коммита с патчами

git show <hash>

  • Детали конкретного коммита (diff, автор, дата)

git blame -L 10,40 file.txt

  • Кто и когда менял строки 10–40 в файле

git bisect start; git bisect bad; git bisect good <hash>

  • Бинарный поиск коммита, сломавшего поведение

git shortlog -sn

  • Таблица авторов и количества коммитов

git rev-parse --short HEAD

  • Короткий хеш текущего коммита

🟤 Уровень 7 — Продвинутая работа с индексом и патчами#

git add -p

  • Интерактивно выбрать куски изменений для индекса

git stash push -m "wip"

  • Сохранить незакоммиченные изменения в stash с меткой

git stash pop

  • Достать последние отложенные изменения

git stash --keep-index

  • Отложить только неиндексированные правки

git worktree add ../proj-feature feature

  • Вывести вторую рабочую копию ветки feature рядом с основной

git format-patch -n 3

  • Сгенерировать патчи из последних 3 коммитов

git apply file.patch

  • Применить патч к рабочему каталогу

🧠 Уровень 8 — Оптимизация, безопасность и большие репозитории (гуру)#

git gc --aggressive

  • Глубокая сборка мусора и оптимизация хранилища

git prune --expire=now --progress

  • Очистка недостижимых объектов (осторожно)

git lfs install; git lfs track "*.bin"

  • Поддержка больших файлов через Git LFS

git config --global core.autocrlf input

  • Настроить корректную работу с переводами строк на *nix

git config --global pull.rebase false

  • Глобальная политика merge vs rebase при git pull

git push --force-with-lease

  • Перезаписать историю, но безопасно (не затрёт чужие новые коммиты)

git sparse-checkout init --cone && git sparse-checkout set path1 path2

  • Частичная checkout‑выборка больших моно‑репозиториев

🎯 Бонус — полезные алиасы (~/.gitconfig)#

[alias]
  s = status -sb
  lg = log --oneline --graph --decorate --all
  last = log -1 --stat
  st = stash
  co = checkout
  sw = switch
  cm = commit -m
  amend = commit --amend --no-edit
  br = branch -vv
  df = diff
  ds = diff --staged