В процессе разработки бывает так, что работа еще не готова к коммиту, но изменения нужно быстро убрать из рабочей директории. У Git для этого есть специальная команда — git stash. Разбираемся, как она работает, на примерах.
Что такое git stash и зачем она нужна
Git stash — это команда, которая сохраняет текущее состояние локальных правок в специальное локальное хранилище и возвращает рабочее дерево к состоянию HEAD, то есть последнего коммита текущей ветки. В документации Git команда описана как способ сохранить текущее состояние рабочей директории и индекса, чтобы быстро вернуться к чистому состоянию.
Как добавить изменения через git stash
Команду git stash часто используют в короткой форме, без дополнительных параметров. Эта команда делает то же самое, что git stash push, то есть сохраняет текущие изменения в stash и очищает рабочую директорию от изменений в отслеживаемых файлах.
Stash — это временно сохраненный «снимок» локальных изменений в рабочей директории и индексе, который Git складывает в специальное локальное хранилище, чтобы потом эти правки можно было достать оттуда и снова применить.
По умолчанию в stash попадают изменения в отслеживаемых файлах: правки в статусе staged (индексированные) и unstaged (неиндексированные).
Напоминаем, что:
- unstaged (неиндексированный) файл — это файл в рабочей директории, который вы редактировали, но пока не добавили изменения в индекс через git add;
- staged (индексированный) файл — это файл, который добавили в индекс через git add; к нему еще не применили git commit.
Кстати, мы уже рассказывали, как можно убрать файл из индекса, если вы поторопились с git add.
Важно то, что хотя git stash по умолчанию сохраняет изменения именно в отслеживаемых файлах, в неотслеживаемых также можно сохранить, если указать параметры -u или —include-untracked, про которые поговорим ниже.
Как использовать stash без параметров: пример
Откроем среду разработки и внесем небольшие изменения в файл программы (он должен быть отслеживаемым). Например, сделаем вывод в консоль уведомления о том, что программа запущена.

Чтобы убрать незакоммиченные изменения из рабочей директории в stash, нужно зайти в консоль Git (Git Bash или аналог) в корневой папке проекта или открыть консоль прямо в среде разработки и ввести:
git stash
или
git stash push

После запуска команды может появиться предупреждение:
warning: in the working copy of path, LF will be replaced by CRLF...
Это предупреждение связано не с ошибкой git stash, а с настройками окончаний строк. Обычно оно означает, что Git при следующей записи файла в рабочую копию преобразует окончания строк к формату CRLF, который типичен для Windows.
Но нам важно, что команда отработала и консоль сообщила следующее:
Saved working directory and index state WIP on main: a753589 Initial commit
То есть Git сохранил текущее состояние рабочей директории и индекса в stash, чтобы вернуть дерево к чистому состоянию.
В результате выполнения git stash в git status обычно можно увидеть чистое состояние, например nothing to commit, working tree clean.

Как добавить изменения в stash: опции
У команды git stash есть полезные опции. Самая простая из них — это -m, которая позволяет добавить описание к stash. Например:
git stash push -m "новый заголовок"
или
git stash push --message "новый заголовок"
Указанное сообщение потом будет видно в списке stash-записей.
Также с помощью опций можно добавлять в stash неотслеживаемые файлы, сохранять только некоторые части изменений и многое другое. Разберем основные параметры.
- Добавить неотслеживаемые файлы
-u, --include-untracked
Чтобы сохранить неотслеживаемые файлы, используют опцию -u или полную форму --include-untracked. То есть:
git stash push -u
или
git stash push --include-untracked
- Добавить все, включая ignored-файлы
-a, --all
Сохраняет и untracked, и ignored-файлы.
git stash push -a
или
git stash push --all
- Сохранить только часть изменений
-p, --patch
Запускает в консоли интерактивный режим и позволяет выбрать, какие именно части изменений отправить в stash, а какие — оставить в рабочей директории.
git stash -p
или
git stash push --patch
Вот так это выглядит:

Git видит, что мы добавили одну строку (он выделил ее зеленым цветом и знаком +). Нужно ответить на вопрос, хотим ли мы положить в stash этот hunk (часть изменений). Варианты ответов:
y — да, убрать этот hunk в stash;
n — нет, оставить этот hunk как есть, в рабочей директории;
q — выйти и больше ничего не обрабатывать;
a — убрать этот hunk и все следующие hunks в этом файле;
d — не убирать этот hunk и все следующие hunks в этом файле;
e — вручную отредактировать текущий hunk;
? — показать справку прямо в терминале.
А если, например, добавить две строки, которые находятся рядом в одном файле, то они попадут в один hunk (часть изменений). При --patch Git будет рассматривать вместе.
- Сохранить только staged-изменения
-S, --staged
Сохраняет только те изменения, которые уже были добавлены в индекс через git add.
git stash push -S
или
git stash push --staged
- Сохранить остальные изменения, но оставить индекс нетронутым
-k, --keep-index
Позволяет убрать в stash изменения только для указанных файлов или путей, не затрагивая остальные.
git stash push -k
или
git stash push --keep-index
- Передать список файлов из файла
--pathspec-from-file, --pathspec-file-nul
Нечастый вариант использования stash, когда нужно передать список файлов из отдельного файла, а не прописывать все в командной строке.
Взять список файлов по одному пути на строку:
git stash push --pathspec-from-file=paths.txt
Взять список файлов, где пути разделены не переводами строк, а символом \0:
git stash push --pathspec-from-file=paths.txt --pathspec-file-nul
Просмотр изменений в stash
Проще всего изменения в stash можно посмотреть через список:
git stash list
Эта команда показывает список всех stash-записей. Git нумерует их как stash@{0}, stash@{1}, stash@{2} и т. д. Запись stash@{0} — самая свежая.
Получить более подробную информацию об изменениях можно через следующие команды:
- Посмотреть краткую сводку по stash
show
Показывает сводку по stash-записи. По умолчанию это краткая информация о том, какие файлы изменились и насколько. Если stash не указать явно, Git покажет данные по последней записи, то есть по stash@{0}.
Как это выглядит:
git stash show
или
git stash show stash@{0}
- Посмотреть полный diff stash
show -p, show --patch
Показывает все изменения целиком.
git stash show -p
или
git stash show -p stash@{0}
Возврат изменений из stash
Сохраненные изменения из stash обычно возвращают двумя командами — git stash pop и git stash apply.
Обе команды пытаются применить сохраненные правки поверх текущего состояния рабочей директории. Главное различие между ними в том, что:
— pop после успешного применения удаляет запись из stash,
— apply тоже применяет запись, но оставляет ее в списке.
Если при pop возникает конфликт, запись автоматически не удаляется.
- Вернуть изменения и удалить запись из stash
pop
Применяет изменения из stash к текущей рабочей директории и после успешного применения удаляет эту запись из списка stash. Если возникнет конфликт, запись не удалится автоматически. Конфликты и их возможные решения рассмотрим ниже.
git stash pop
или
git stash pop stash@{0}
- Вернуть изменения, но оставить запись в stash
apply
Применяет изменения из stash, но не удаляет саму запись из списка. Это удобно, если вы хотите сначала проверить результат, а stash оставить как резервную копию.git stash apply
илиgit stash apply stash@{0}
Удаление изменений в stash
После возврата к работе stash лучше почистить, иначе список быстро захламляется.
Чтобы удалить одну запись, используют git stash drop, а для очистки всего списка — git stash clear. Команда drop удаляет одну stash-запись, а clear очищает весь stash целиком.
- Удалить одну запись из stash
drop
Удаляет одну stash-запись. Если номер не указать, Git удалит последнюю запись, то есть stash@{0}. Если нужно удалить конкретную запись, ее можно указать явно.git stash drop
илиgit stash drop stash@{0} - Очистить весь stash
clear
Удаляет все stash-записи сразу. Эту команду используют, если в stash накопилось много старых сохранений и они больше не нужны.git stash clear
В официальной документации Git отдельно пишут, что после ошибочного drop или clear обычных механизмов безопасного восстановления нет (только предложенный там же вариант с git fsck --unreachable), поэтому с удалением лучше быть аккуратнее.
Конфликты при выполнении stash-команд
При применении stash могут возникать конфликты. Обычно это происходит, если после создания stash вы изменили те же файлы, переключились на другую ветку или попытались применить stash, или пытаетесь применить stash поверх состояния, в котором те же участки кода уже были изменены по-другому. В таком случае Git не может автоматически собрать итоговую версию файла, поэтому конфликт приходится разбирать вручную.
Порядок решения конфликтов примерно такой:
- Проверить, какие файлы конфликтуют.
Для этого нужно применить команду:
git status
Она покажет конфликтующие файлы и текущее состояние рабочей директории. После неудачного pop или apply это первая команда, с которой лучше начать.
- Исправить конфликт вручную.
Откройте конфликтующие файлы, удалите конфликтные маркеры и оставьте итоговый вариант кода. При конфликтах Git оставляет в файлах специальные пометки, которые нужно разобрать вручную. - Отметить конфликт как решенный.
После исправления файлов их нужно заново добавить в индекс черезgit addилиgit add path/to/file. Так Git поймет, что конфликт уже разрешен. - При необходимости удалить оставшийся stash вручную.
Если вы использовалиgit stash pop, но во время применения возник конфликт, запись останется в stash. После успешного ручного разрешения конфликта ее можно удалить отдельно.
git stash drop stash@{0}
Git stash: коротко о главном
- Git stash помогает временно убрать незакоммиченные изменения из рабочей директории и вернуться к чистому состоянию проекта.
- Команда git stash без параметров работает так же, как git stash push.
- По умолчанию stash сохраняет изменения в отслеживаемых файлах, включая staged и unstaged.
- Новые untracked-файлы по умолчанию в stash не попадают. Чтобы сохранить и их, используют -u или —include-untracked.
- Если нужно сохранить все, включая ignored-файлы, используют -a или —all.
- Через -m или —message можно добавить понятное описание stash-записи.
- Через —patch можно сохранить не все изменения целиком, а только выбранные фрагменты.
- Список stash-записей можно посмотреть через git stash list.
- Краткую сводку по stash можно посмотреть через git stash show, а полный diff — через git stash show -p.
- Для возврата изменений используют git stash pop и git stash apply.
- Pop возвращает изменения и после успешного применения удаляет запись из stash.
- Apply возвращает изменения, но оставляет запись в stash.
- Если при pop возникает конфликт, запись автоматически не удаляется.
- Одну stash-запись удаляют через git stash drop, а весь список очищают через git stash clear.
- При конфликтах после stash apply или stash pop нужно проверить состояние через git status, вручную исправить конфликтующие файлы, добавить их через git add и при необходимости удалить оставшийся stash вручную.
- Git stash удобен, когда нужно быстро переключиться на другую задачу, не делая лишний коммит и не теряя текущие правки.
