Как временно сохранить изменения в Git с помощью git stash

Быстрые ссылки
Почему временно сохранявать изменения?
Как сохранить изменения в хранилище (stash)
Просмотр сохранённых (stashed) изменений
Восстановление сохранённых изменений
Если нужно переключиться на другую ветку, а вы ещё не готовы коммитить изменения в текущей ветке, вы можете временно сохранить (stash) свои изменения и вернуться к ним позже. Это работает в Git, независимо от того, используете ли вы GitHub или другой хостинг.
Почему временно сохранять изменения?
Временное сохранение (stash) помогает не загрязнять рабочую ветку незавершённой работой. Это удобно, когда нужно срочно починить баг в другой ветке или быстро переключиться на задачу без коммита полуготового кода.
Пример: вы работаете в ветке A, но в ветке B найден критический баг. Вы не готовы коммитить изменения в A, поэтому выполняете git stash, переключаетесь в B, исправляете баг, затем возвращаетесь в A и восстанавливаете сохранённые изменения.
Короткое определение: stash — временное хранилище рабочей копии и индекса, которое не отправляется в удалённый репозиторий.
Как сохранить изменения в хранилище (stash)
Сначала полезно посмотреть, что именно вы собираетесь сохранять:
git status
Вы увидите, какие файлы в индексе (staged) и какие — нет. По умолчанию git stash сохраняет и staged, и unstaged изменения.
Чтобы сохранить изменения в stash, выполните:
git stash
После выполнения вы получите сообщение о том, что изменения сохранены в stash на текущей ветке. Рабочая директория вернётся в состояние до внесённых изменений, и вы сможете безопасно переключиться на другую ветку.
Совет: можно добавить метку к сохранению:
git stash push -m "WIP: исправление логики авторизации"Замечание о современных командах: git stash push предпочтительнее в новых версиях Git, тогда как git stash save считается устаревающей формой.
Просмотр сохранённых изменений
Если вы сохранили несколько наборов изменений, полезно увидеть список stash:
git stash list
Каждый элемент имеет имя вида stash@{N}, где N — индекс. Например, stash@{0} — самый последний сохранённый набор.

Чтобы посмотреть подробности конкретного stash, выполните:
git stash show
Для показа в формате diff используйте:
git stash show -pВосстановление сохранённых изменений
Когда вы готовы вернуться к работе, есть два основных способа вернуть изменения из stash:
- Скопировать изменения в рабочую директорию, сохранив копию в stash:
git stash apply
- Скопировать изменения и удалить запись из stash (pop):
git stash pop
Если у вас несколько сохранений, укажите нужный индекс:
git stash apply stash@{2}или
git stash pop stash@{2}После применения возможно возникновение конфликтов, как при обычном слиянии. Разрешите конфликты, выполните git add и, при необходимости, завершите работу обычным коммитом.
Дополнительные полезные команды:
- Удалить конкретный stash:
git stash drop stash@{1}- Очистить все записи:
git stash clear- Сохранить также неотслеживаемые файлы (untracked):
git stash push -u- Сохранить все файлы, включая игнорируемые:
git stash push -aВажно: по умолчанию git stash не сохраняет неотслеживаемые файлы. Используйте -u или -a, если нужно сохранить и их.
Типичные проблемы и как их решать
Конфликты при применении stash. Решение: разрешите конфликты в файлах, затем git add и, при необходимости, сделайте коммит.
Забыл, какие изменения в stash. Решение: git stash show -p stash@{N}.
Нужны не все изменения из stash. Решение: примените stash на новую временную ветку, выберите нужные хунки (git add -p) и закоммитьте только нужное.
Потеря нечётко сохранённых неотслеживаемых файлов. Решение: для будущего используйте git stash push -u.
Когда не стоит использовать stash
Когда изменения уже подготовлены для отдельного коммита или пулл-реквеста — лучше создать отдельную ветку и закоммитить.
Если вы хотите сохранить историю изменений и сообщения коммитов — stash не сохраняет историю коммитов.
Для долгосрочной работы между машинами: stash хранится локально, не подходит как заменитель ветки и пуша в удалённый репозиторий.
Шаблон действий (чек-лист)
- git status — проверьте изменения.
- При необходимости добавьте метку: git stash push -m “описание”.
- Переключитесь на нужную ветку: git checkout bugfix-branch.
- Внесите и закоммитьте исправления.
- Вернитесь в рабочую ветку: git checkout feature-branch.
- Восстановите stash: git stash apply или git stash pop.
- Разрешите конфликты, выполните git add и, при необходимости, коммит.
- Удалите ненужные записи: git stash drop или git stash clear.
Критерии приёмки
- Рабочая директория соответствует ожидаемому состоянию после применения stash.
- Все нужные изменения восстановлены и корректно протестированы.
- Конфликты разрешены; репозиторий в рабочем состоянии (git status показывает чистую рабочую директорию или ожидаемые файлы).
Краткий глоссарий
- stash — временное локальное хранилище изменений.
- stash@{N} — идентификатор сохранённого набора изменений.
- apply — применить изменения из stash, оставив запись в списке.
- pop — применить изменения и удалить запись из stash.
Краткое резюме
git stash — быстрый и удобный инструмент для временного сохранения незавершённой работы. Используйте метки, учитывайте неотслеживаемые файлы и выбирайте между apply и pop в зависимости от необходимости сохранить копию.
Related: How to Delete a Branch on GitHub