Коротко: практичные git-приёмы на каждый день: stash, поиск потерянного коммита через reflog, bisect для бага и cherry-pick для переноса коммита.
Большинство разработчиков пользуются 5–6 командами git и не знают, что почти из любой «катастрофы» есть быстрый выход. Ниже — практичные приёмы, которые экономят время каждый день: спрятать незакоммиченное, найти «потерянный» коммит, отыскать баг бинарным поиском и перенести один коммит между ветками.
git stash — спрятать работу на минуту
Нужно срочно переключиться на другую ветку, но текущие правки не готовы к коммиту:
# спрятать всё незакоммиченное (включая новые файлы)
git stash -u
git switch hotfix # сделали срочное дело
git switch - # вернулись назад
git stash pop # достали правки обратно
Полезное: git stash list — список заначек, git stash show -p — посмотреть диф, git stash branch new-branch — создать ветку из заначки.
git reflog — «машина времени» для веток
Случайно сделали reset --hard, потеряли коммиты после ребейза или удалили ветку? Почти всё восстановимо: git хранит историю перемещений HEAD ~90 дней.
git reflog # список, где был HEAD
# HEAD@{2}: reset: moving to HEAD~3 <- вот сюда хотим вернуться
git reset --hard HEAD@{2} # вернулись в нужную точку
Это спасает чаще, чем кажется: «потерянные» коммиты обычно живы, надо лишь найти их хэш в reflog и git checkout / cherry-pick на них.
git bisect — найти баг бинарным поиском
Баг появился «где-то в последних 200 коммитах». Вместо ручного перебора — бинарный поиск: git сам делит историю пополам.
git bisect start
git bisect bad # текущий коммит сломан
git bisect good v1.4.0 # на этом теге всё работало
# git checkout-нет середину — проверяете, отвечаете:
git bisect good # или
git bisect bad
# за ~log2(N) шагов git назовёт первый плохой коммит
git bisect reset # выйти из режима
Можно автоматизировать: git bisect run ./test.sh — git сам прогонит скрипт на каждом шаге (exit 0 = good, ≠0 = bad).
git cherry-pick — перенести один коммит
Коммит ушёл не в ту ветку, или нужно «выдернуть» один фикс в релизную ветку:
git switch release
git cherry-pick a1b2c3d # применить конкретный коммит сюда
git cherry-pick a1b2c3d^..f4e5d6 # диапазон коммитов
Ещё несколько ежедневных приёмов
- Поправить последний коммит:
git commit --amend(текст или забытый файл черезgit addперед этим). - Отменить коммит, сохранив изменения:
git reset --soft HEAD~1. - Безопасный force-push после ребейза:
git push --force-with-lease(не затрёт чужие новые коммиты). - Кто и когда менял строку:
git blame -L 10,20 file.php. - Найти, в каком коммите появилась строка:
git log -S "нужный_текст". - Откатить опубликованный коммит безопасно:
git revert <hash>(создаёт обратный коммит, не переписывает историю).
Когда что применять
- stash — отвлекли, нужно быстро переключиться;
- reflog — «всё пропало» после reset/rebase;
- bisect — регрессия, непонятно где;
- cherry-pick — перенести точечный коммит;
- revert — откатить уже запушенное без переписывания истории.
Эти команды превращают git из источника стресса в надёжный инструмент. Если в команде хаос с ветвлением и релизами — на консультации помогу выстроить понятный git-flow и процессы.


Комментарии