git stash: временное сохранение работы без коммита
Вы работаете над новой функцией, и вдруг нужно срочно переключиться на другую задачу или ветку. Изменения не готовы для коммита, но и терять их нельзя. git stash временно убирает текущие изменения «на полку» и очищает рабочую директорию.
Что такое git stash #
git stash сохраняет незакоммиченные изменения в специальный стек (stash stack) и возвращает рабочую директорию к состоянию последнего коммита. Это временное хранилище — не замена коммитам, а инструмент быстрого переключения контекста.
В других системах контроля версий похожая концепция называется «shelve» (TFS/Azure DevOps) или «shelf». В Git это stash.
Базовый stash: сохранение изменений #
# Сохранить все незакоммиченные изменения
git stash
# Эквивалентно
git stash push
# Сохранить с описательным сообщением
git stash push -m "WIP: работа над новой формой входа"
# Старый синтаксис (тоже работает)
git stash save "WIP: работа над новой формой входа"
# После stash рабочая директория чистая
git status # nothing to commit, working tree clean
После выполнения git stash рабочая директория очищена, и можно переключаться на другие ветки.
Stash с неотслеживаемыми файлами #
По умолчанию git stash сохраняет только отслеживаемые (tracked) файлы — те, что уже были в git add хотя бы один раз. Новые файлы, которые вы создали но не добавляли в Git, сохранены не будут.
# Включить в stash также новые (неотслеживаемые) файлы
git stash -u
git stash --include-untracked
# Включить даже игнорируемые файлы (.gitignore)
git stash -a
git stash --all
Просмотр сохранённых stash #
# Показать список всех stash
git stash list
# Пример вывода:
# stash@{0}: WIP on feature: a1b2c3d Добавить форму
# stash@{1}: WIP on main: b2c3d4e Обновить зависимости
# stash@{2}: On main: WIP: работа над авторизацией
# Просмотр содержимого последнего stash (краткий)
git stash show
# Просмотр с diff
git stash show -p
# Просмотр конкретного stash
git stash show stash@{1}
git stash show -p stash@{1}
Восстановление stash #
# Восстановить последний stash и удалить из стека
git stash pop
# Восстановить конкретный stash и удалить из стека
git stash pop stash@{2}
# Восстановить, но оставить в стеке (apply)
git stash apply
# Применить конкретный stash без удаления из стека
git stash apply stash@{1}
# Восстановить с сохранением состояния индекса
git stash pop --index
Разница между pop и apply: pop удаляет stash из стека после применения, apply — нет. Используйте apply, если хотите применить одни и те же изменения к нескольким веткам.
Управление stash: удаление #
# Удалить последний stash
git stash drop
# Удалить конкретный stash
git stash drop stash@{1}
# Удалить все stash (осторожно!)
git stash clear
Создание ветки из stash #
Если stash содержит значительный объём работы, удобнее развернуть его в отдельную ветку:
# Создать ветку из последнего stash
# Ветка создаётся от коммита, на котором был сделан stash
git stash branch new-feature-branch
# Из конкретного stash
git stash branch new-feature-branch stash@{2}
Эта команда: создаёт новую ветку от коммита, где был сохранён stash, применяет stash, удаляет stash из стека. Особенно полезно, когда stash применяется к изменённой ветке и возникают конфликты.
Частичный stash: сохранить только часть изменений #
# Интерактивный режим — выбрать какие изменения сохранить в stash
git stash -p
git stash push --patch
# Git будет показывать каждый блок изменений:
# y — добавить в stash
# n — оставить в рабочей директории
# s — разбить на меньшие блоки
# q — завершить
# Сохранить конкретные файлы в stash
git stash push path/to/file.js
git stash push path/to/file1.js path/to/file2.css
Конфликты при восстановлении stash #
Если с момента создания stash ветка изменилась, при git stash pop могут возникнуть конфликты:
git stash pop
# CONFLICT (content): Merge conflict in src/auth.js
# Разрешить конфликты в файлах
git status
# После разрешения — добавить файлы
git add src/auth.js
# stash уже не нужен (при pop он удалён из стека даже при конфликте)
# Просмотреть список stash для подтверждения
git stash list
Если используете git stash apply и возникнет конфликт — stash останется в стеке, что удобнее для повторных попыток.
Практические примеры #
# Типичный рабочий процесс
git stash
git checkout main
git pull
git checkout feature
git stash pop
# Stash с описанием
git stash push -m "WIP: реализую авторизацию через OAuth"
# Просмотр всего стека
git stash list
# Применить нужный stash
git stash apply stash@{2}
# Удалить ненужный stash
git stash drop stash@{0}
# Применить stash в новую ветку
git stash branch hotfix-branch
# Экспорт stash как patch-файла
git stash show -p stash@{0} > my-changes.patch
# Импорт из patch
git apply my-changes.patch
# Stash только поставленных в индекс изменений
git stash push --staged
# Включить новые файлы в stash
git stash -u
Часто задаваемые вопросы #
Что происходит с stash при удалении ветки? Stash не связан с конкретной веткой — он хранится в .git/refs/stash. Удаление ветки не затронет stash. Можно применить stash в любой ветке.
Как долго хранятся stash? Бессрочно, пока вы их не удалите. Stash не очищается автоматически. Используйте git stash list для просмотра и git stash clear или git stash drop для удаления ненужных.
Можно ли применить stash из другой ветки? Да. Stash — глобальное хранилище, не привязанное к ветке. Переключитесь на нужную ветку и выполните git stash pop или git stash apply.
Как разрешить конфликты при восстановлении stash? Так же как при merge: открыть конфликтный файл, выбрать нужную версию, убрать маркеры <<<<<<<, =======, >>>>>>>, выполнить git add <file>, затем закоммитить.
В чём разница между stash pop и stash apply? pop применяет stash и удаляет его из стека. apply применяет, но оставляет в стеке. Используйте apply, когда хотите применить одни изменения к нескольким веткам или когда не уверены, что stash больше не понадобится.
Заключение #
git stash — удобный инструмент для быстрого переключения контекста без потери работы. Основные команды: git stash (сохранить), git stash list (просмотреть), git stash pop (восстановить и удалить), git stash apply (восстановить без удаления). Добавляйте описания через -m для удобной навигации в стеке. Помните: stash — временное хранилище, итоговую работу нужно закоммитить.