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 — временное хранилище, не долгосрочное; используй ветки для длительной работы

Связанные темы

Ресурсы