← Назад к вопросам

Что такое Stash?

1.6 Junior🔥 171 комментариев
#Git и VCS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Stash в Git

Stash — это функция Git, которая позволяет временно сохранить изменения (всё, что не закоммичено) без создания коммита и вернуться к чистому рабочему каталогу. Это очень полезно, когда нужно переключиться на другую ветку, но текущие изменения ещё не готовы к коммиту.

Основная идея

Stash буквально означает "припрятать, спрятать". Git сохраняет ваши несохранённые изменения в отдельном хранилище (stack), а рабочий каталог возвращается в состояние последнего коммита.

# Состояние: есть несохранённые изменения
git status
# On branch main
# Changes not staged for commit:
#   modified: file.py

# Припрятываем изменения
git stash

# Рабочий каталог теперь чист
git status
# On branch main
# nothing to commit, working tree clean

Когда использовать Stash

  • Переключение между ветками — текущие изменения блокируют переключение
  • Быстрый фиксик — сохранить текущую работу, сделать срочный фиксик в другой ветке
  • Удаление случайных изменений — не коммитить мусор
  • Разделение работы — сделать несколько логических групп изменений

Команды Stash

Сохранить изменения:

# Базовое сохранение
git stash

# С описанием
git stash save "WIP: добавляю новую функцию"

# Или в новых версиях Git
git stash push -m "WIP: добавляю новую функцию"

# Включить неотслеживаемые файлы
git stash --include-untracked

# Или сокращённо
git stash -u

Просмотр сохранённых изменений:

# Список всех stash'ей
git stash list
# stash@{0}: WIP: добавляю новую функцию
# stash@{1}: WIP: исправляю баг
# stash@{2}: On main: временно припрятал

# Просмотр содержимого stash'а
git stash show stash@{0}

# С diff'ом
git stash show -p stash@{0}
# или просто
git stash show -p  # показывает stash@{0}

Восстановить изменения:

# Восстановить последний stash и удалить его
git stash pop

# Восстановить конкретный stash
git stash pop stash@{1}

# Восстановить, но оставить stash в списке
git stash apply stash@{0}

# Или просто (применяет stash@{0})
git stash apply

Удалить сохранённые изменения:

# Удалить последний stash
git stash drop

# Удалить конкретный stash
git stash drop stash@{1}

# Удалить все stash'и
git stash clear

Практический сценарий

# Работаете над функцией A
echo "def new_feature():" > feature.py
git status
# Changes not staged for commit:
#   modified: feature.py

# Срочно нужно переключиться на main для фиксика
# Но git не позволит переключиться с несохранённых изменений

# Припрячьте работу
git stash save "WIP: функция A в процессе"

# Теперь можете безопасно переключиться
git checkout main

# Сделайте срочный фиксик
echo "# quick fix" > hotfix.py
git add hotfix.py
git commit -m "hotfix: критический баг"

# Вернитесь на рабочую ветку
git checkout feature/new-feature

# Восстановите припрятанные изменения
git stash pop

# Продолжите работу
echo "    return True" >> feature.py

Конфликты при восстановлении

Иногда при pop или apply может быть конфликт слияния:

# Восстановляем stash
git stash pop

# Конфликт!
# error: Your local changes to 'file.py' would be overwritten by merge
# Aborting

# Решение 1: сначала коммитьте текущие изменения
git add .
git commit -m "текущая работа"
git stash pop

# Решение 2: используйте apply, разберитесь с конфликтом
git stash apply
# CONFLICT (content): Merge conflict in file.py
# Отредактируйте файл, разберитесь с конфликтом
git add file.py

Продвинутые операции

Создать ветку из stash'а:

# Если после stash'а были изменения в том же месте
git stash branch my-feature

# Git автоматически создаст новую ветку и применит stash
# Это помогает избежать конфликтов слияния

Частичный stash (отдельные файлы):

# Припрячьте только определённые файлы
git stash push file1.py file2.py

# Остальные файлы останутся в рабочем каталоге

Интерактивный stash (в новых версиях Git):

# Выбирайте какие части сохранять
git stash -p

# Будет интерактивно спрашивать для каждого "hunk"

Не путайте со следующим

Stash ≠ Commit:

  • Stash: временное хранилище, не входит в историю
  • Commit: постоянная история в ветке

Stash ≠ Discard:

  • Stash: сохраняет изменения
  • git checkout .: удаляет изменения

Stash ≠ Branch:

  • Stash: сохраняет несохранённые изменения
  • Branch: работа в отдельной ветке с коммитами

Практические советы

# ✅ Хорошая практика: давайте описательные имена
git stash save "WIP: добавляю аутентификацию"
git stash save "hotfix: баг с парсингом JSON"

# ❌ Плохая практика: зашифрованные имена
git stash save "stash1"
git stash save "temp"

# Регулярно очищайте старые stash'и
git stash list
git stash drop stash@{10}

# Если забыли какой stash нужен
git stash show -p stash@{0}
# прочитайте и решите

Когда НЕ использовать Stash

  • Долгосрочное хранение изменений — используйте ветки
  • Важная работа — коммитьте правильно
  • Совместная разработка — делитесь ветками, не stash'ами

Выводы

Stash — это инструмент для временного сохранения работы, когда нужно быстро переключиться. Используйте его для:

  1. Срочных переключений между ветками
  2. Сохранения WIP перед опасными операциями
  3. Выделения отдельных изменений в новую ветку

Но помните: Stash не заменяет правильный Git workflow с коммитами и ветками.