Stash: Временное сохранение изменений¶
git stash позволяет временно сохранить изменения, не сделав коммит, и вернуться к чистой рабочей директории. Это полезно, когда нужно быстро переключиться на другую задачу или ветку.
Базовое использование¶
Сохранить изменения (спрятать в stash)¶
git stash
Эта команда: 1. Сохраняет все измененные отслеживаемые файлы в стек stash. 2. Восстанавливает файлы до состояния последнего коммита (рабочая директория становится чистой).
Примечание: По умолчанию
git stashне сохраняет новые (неотслеживаемые) файлы.
Сохранить включая новые файлы¶
Чтобы спрятать также новые файлы, которые еще не были добавлены через git add:
git stash -u
# или явно
git stash --include-untracked
Сохранить всё (включая игнорируемые файлы)¶
git stash -a
# или
git stash --all
Просмотр сохраненных stash¶
git stash list
Вывод выглядит так:
stash@{0}: WIP on feature/login: a1b2c3d Добавить форму
stash@{1}: WIP on main: e4f5g6h Исправить баг
Применение сохраненных изменений¶
Применить последний stash (без удаления из списка)¶
git stash apply
Изменения вернутся в рабочую директорию, но запись в списке stash останется.
Применить конкретный stash¶
git stash apply stash@{1}
Применить и удалить из списка¶
git stash pop
Эквивалентно apply + drop. Удобно для быстрого возврата изменений.
Удалить stash¶
# Удалить последний
git stash drop
# Удалить конкретный
git stash drop stash@{1}
# Очистить весь список
git stash clear
Создание именованного stash¶
По умолчанию stash получает имя автоматически. Можно дать свое имя для удобства:
git stash save "Работа над авторизацией"
# или в новых версиях Git
git stash push -m "Работа над авторизацией"
Теперь в списке будет видно понятное описание.
Частые сценарии использования¶
Сценарий 1: Срочная задача¶
Вы работаете над фичей, половина кода написана, но коммит делать рано. Поступила срочная задача.
# Спрятать текущую работу
git stash save "WIP: форма логина"
# Переключиться на main и сделать срочную правку
git checkout main
git pull
# ... правки, коммит, пуш ...
# Вернуться к фиче
git checkout feature/login
git stash pop
Сценарий 2: Переключение веток без коммита¶
Пытаетесь переключиться, но Git ругается на незакоммиченные изменения:
git checkout other-branch
# error: Your local changes to the following files would be overwritten by checkout
# Решение:
git stash
git checkout other-branch
# ... работа ...
git checkout -
git stash pop
Работа с конфликтами¶
Если при stash pop возникают конфликты, Git сообщит об этом. Разрешите конфликты вручную, затем:
git add <файлы>
# Не нужно делать commit, просто продолжайте работу
Stash будет удален из списка автоматически после успешного pop, даже если были конфликты.