git stash
Временное сохранение незакоммиченных изменений «в ящик» для того, чтобы переключиться на другую задачу и вернуться позже.
Зачем нужно
Бывает нужно срочно переключиться на другую ветку (исправить баг, просмотреть PR), но текущие изменения ещё не готовы к коммиту. git stash сохраняет весь незакоммиченный прогресс в отдельный стек и очищает рабочую директорию, не теряя ни строчки кода. Потом можно вернуться и восстановить изменения одной командой.
Где используется
- Срочное переключение на другую ветку без создания «грязного» коммита
- Перенос незакоммиченных изменений в другую ветку
- Временная «заморозка» эксперимента во время ответа на вопрос коллеги
- Сброс рабочей директории с возможностью восстановить позже
Основной контент
Базовые операции
# Сохранить все изменения (tracked-файлы)
git stash
# Сохранить с описательным именем
git stash push -m "feature: незавершённый поиск"
# Сохранить включая untracked-файлы
git stash push -u
# Сохранить включая untracked И игнорируемые файлы
git stash push -a
Просмотр и восстановление
# Список всех stash
git stash list
# stash@{0}: On feature/search: feature: незавершённый поиск
# stash@{1}: WIP on main: abc1234 fix: исправить timeout
# Посмотреть содержимое последнего stash
git stash show
# Посмотреть подробно (с diff)
git stash show -p
# Посмотреть конкретный stash
git stash show stash@{1}
# Применить последний stash (stash остаётся в списке)
git stash apply
# Применить конкретный stash
git stash apply stash@{1}
# Применить и удалить из стека (самый частый способ)
git stash pop
# Применить конкретный и удалить
git stash pop stash@{1}
Удаление stash
# Удалить конкретный stash
git stash drop stash@{0}
# Удалить все stash
git stash clear
Перенос stash в новую ветку
# Создать ветку и применить stash в ней
git stash branch feature/search-wip stash@{0}
# Это создаёт ветку, переключается на неё и делает git stash pop
Типичный сценарий
# Работаешь над feature/search, приходит срочный баг
git stash push -u -m "wip: незаконченный поиск"
# Переключаешься, фиксишь баг
git switch main
git switch -c hotfix/null-pointer
# ...fix...
git commit -m "fix: исправить NPE в /api/users"
git switch main
git merge hotfix/null-pointer
# Возвращаешься к работе
git switch feature/search
git stash pop
Частые ошибки
- Забыть про stash и потерять работу — периодически запускай
git stash list; stash хранится только локально - Stash не сохраняет untracked-файлы — если файл не добавлен хотя бы раз через
git add, нужен-uфлаг - Конфликты при
stash pop— если ветка изменилась, pop может создать конфликты; они решаются как обычные merge-конфликты - Слишком много stash — stash — временное хранилище, не долгосрочное; используй ветки для длительной работы