↓Перейти к содержанию
  1. Git: руководства и команды/

git stash: временное сохранение работы без коммита

·5 минут·

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