Table of Contents
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