Git stash: как сохранить и восстановить незакоммиченные изменения
git stash — инструмент для временного сохранения незакоммиченных изменений. Разбираем все команды: push, pop, apply, drop, show, branch — с практическими примерами.
Представь: ты в середине правки, и тебя просят срочно переключиться на другую ветку. Коммитить недоделанное — плохая идея. Откатывать изменения — потеря работы. Именно для таких случаев в Git есть git stash — временное хранилище незакоммиченных изменений.
Stash работает как стопка листков: кладёшь незавершённую работу «на полку», переключаешься на другую задачу, потом возвращаешься и достаёшь обратно. В этой статье разберём все основные команды — от базовых до продвинутых сценариев.
Ключевые выводы
— git stash временно сохраняет незакоммиченные изменения и очищает рабочую директорию
— git stash pop применяет верхний stash и удаляет его; git stash apply применяет, но оставляет в стеке
— Флаг -u добавляет в stash неотслеживаемые файлы, флаг --keep-index оставляет staged-изменения нетронутыми
— При конфликте после pop stash не удаляется автоматически — нужно разрешить конфликты вручную
— git stash branch создаёт новую ветку прямо из stash — удобно для сложных случаев
Эта статья — часть нашего полного путеводителя по Git. Там — весь маршрут: от первого коммита до продвинутых workflow.
Что такое git stash и зачем он нужен
git stash сохраняет все изменения в рабочей директории (tracked-файлы) в специальный стек внутри репозитория и возвращает рабочую директорию к последнему коммиту. Это не коммит — изменения не попадают в историю. Это временная полка.
Stash хранится локально в .git/refs/stash и не отправляется при git push. Стек может содержать любое количество записей.
Именованные stash: git stash push -m
Без имени stash называется WIP on branch-name: hash message — не очень информативно. Флаг -m задаёт понятное описание:
Хорошее описание особенно важно, когда в стеке накапливается несколько записей. Через неделю «WIP on main: a3f2b1c» ничего не скажет — в отличие от конкретного сообщения.
Просмотр: list и show
Индексы в стеке работают как в массиве: stash@{0} — последний сохранённый, stash@{1} — предыдущий и так далее.
Применение и удаление: pop, apply, drop, clear
Ключевое различие между pop и apply: первый удаляет запись из стека после применения, второй — нет. Используй apply, если хочешь подстраховаться и оставить stash до полной проверки результата.
Включить untracked файлы: git stash -u
По умолчанию git stash сохраняет только отслеживаемые файлы (те, что уже есть в индексе). Новые файлы, которые ещё не добавлены через git add, остаются в рабочей директории.
Флаг -u (или --include-untracked) добавляет и их:
Сохранить только unstaged: git stash --keep-index
Иногда нужно убрать только рабочие (unstaged) изменения, оставив всё, что уже добавлено через git add. Флаг --keep-index делает именно это:
Удобно, когда готовишь коммит: добавил нужное в staged, а незакоммиченные черновики убрал временно — и коммитишь только то, что хотел.
Конфликты при pop: что делать
Если с момента сохранения stash основная ветка ушла вперёд и изменились те же строки, при git stash pop возникнут конфликты — точно так же, как при merge.
Важно: при конфликте pop не удаляет stash из стека автоматически. Это защита от потери данных — решай конфликты спокойно.
Если конфликты слишком сложные — лучше использовать git stash branch, о котором расскажем ниже.
Практический сценарий: hotfix без потери текущей работы
Классическая ситуация: ты разрабатываешь новую фичу, и приходит сообщение «упал прод, нужен срочный фикс». Вот как это решается с git stash:
Весь процесс занимает меньше минуты. Незакоммиченная работа сохранена, история не засорена недоделанными коммитами.
git stash branch: создать ветку из stash
Бывает, что изменений в stash накопилось так много, что применить их поверх текущей ветки без конфликтов не получится. Команда git stash branch решает это элегантно: она создаёт новую ветку с того коммита, где был сделан stash, и применяет его туда без конфликтов.
После успешного применения stash удаляется автоматически. Это лучший вариант, когда работа в stash выросла в самостоятельную задачу или когда конфликты неизбежны.
Если тебе нужно не просто отложить изменения, а откатить уже сделанные коммиты, читай как откатить коммит в Git — там разобраны git reset, git revert и когда что использовать.
Часто задаваемые вопросы
Чем git stash pop отличается от git stash apply?
git stash pop применяет верхний stash и удаляет его из стека. git stash apply применяет, но оставляет запись в стеке — её можно применить повторно или удалить позже через git stash drop. Используй apply, когда хочешь перестраховаться до проверки результата.
Сохраняется ли stash при переключении между ветками?
Да. Stash хранится в .git/refs/stash и не привязан к конкретной ветке. Ты можешь сохранить изменения на одной ветке и применить на любой другой — именно это делает stash удобным для быстрого переключения контекста.
Почему git stash не сохраняет новые файлы?
По умолчанию git stash сохраняет только отслеживаемые файлы — те, что уже есть в индексе Git. Новые файлы (untracked) остаются нетронутыми. Чтобы включить их в stash, используй флаг -u: git stash -u.
git stash — один из самых полезных инструментов в ежедневной работе с Git. Он избавляет от необходимости делать «грязные» коммиты ради переключения контекста, позволяет быстро реагировать на срочные задачи и аккуратно управлять незавершённой работой. Освой эти команды, и переключение между задачами перестанет быть стрессом.