Коротко: практичные 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 и процессы.