git stash: временно отложить изменения

Спасательный приём, когда нужно срочно переключиться, а коммитить недоделанное не хочется.

git stash прячет незакоммиченные изменения в отдельное хранилище и возвращает рабочую директорию к чистому состоянию последнего коммита.

Зачем нужен stash

Знакомая ситуация: вы на середине задачи, код ещё сырой, и тут прилетает срочный баг, который надо чинить в другой ветке. Коммитить полуготовое не хочется. Git не даст переключить ветку с незакоммиченными изменениями, если они мешают. Решение — git stash: он отложит ваши правки в сторону, очистит рабочую директорию, а позже вернёт всё обратно.

Базовое использование

git stash

Вывод:

Saved working directory and index state WIP on main: a1b2c3d Добавить профиль

Теперь рабочая директория чистая — можно спокойно переключаться и чинить баг. Чтобы дать заначке понятное имя, добавьте сообщение:

git stash push -m "Половина формы регистрации"

Возвращаем изменения

Когда вы готовы продолжить, верните отложенное:

git stash pop

pop применяет последнюю заначку и удаляет её из хранилища. Если хотите применить, но оставить заначку на месте, используйте apply:

git stash apply

Управление заначками

Заначек может быть несколько — это стек. Полезные команды:

git stash listпоказать все заначки
git stash popприменить последнюю и удалить
git stash apply stash@{1}применить конкретную
git stash drop stash@{0}удалить конкретную
git stash clearудалить все заначки

Вывод команды git stash list:

stash@{0}: On main: Половина формы регистрации
stash@{1}: WIP on main: a1b2c3d Добавить профиль

Тонкость с новыми файлами

По умолчанию git stash прячет только отслеживаемые файлы. Чтобы убрать и новые (untracked) тоже, добавьте флаг:

git stash -u

Когда stash, а когда коммит

Stash удобен для коротких переключений: отложил, быстро сделал срочное дело, вернул обратно. Но не превращайте его в свалку: заначки легко забыть, они не привязаны к ветке и со временем теряются из виду. Если работа затягивается, лучше сделать честный коммит (пусть и с пометкой «WIP» — work in progress) в своей ветке — он надёжнее и нагляднее. Правило простое: stash — на минуты, коммит — на всё остальное.

Применение заначки на другой ветке

Приятная особенность: заначку можно применить не только там, где её сделали. Спрятали изменения на одной ветке, поняли, что им место на другой, переключились и сделали git stash pop — изменения «переедут» туда. Это спасает, когда вы случайно начали писать код не в той ветке.

Итог

  • git stash прячет незакоммиченные изменения, очищая рабочую директорию.
  • git stash pop возвращает и удаляет заначку, apply — возвращает, но оставляет.
  • Флаг -u прячет в том числе новые (untracked) файлы.
Проверьте себя
1. Что делает команда git stash?
AУдаляет все изменения навсегда
BПрячет незакоммиченные изменения и очищает рабочую директорию
CОтправляет изменения на сервер
DСоздаёт новую ветку
2. Чем git stash pop отличается от git stash apply?
AНичем
Bpop применяет заначку и удаляет её, apply применяет, но оставляет
Cpop удаляет ветку, apply создаёт
Dapply работает только с тегами
3. Как спрятать в stash в том числе новые (untracked) файлы?
Agit stash -u
Bgit stash --all-files
Cgit stash new
Dэто невозможно
Поддержать проект