Git Stash: что это, описание команды
В Git иногда нужно переключаться между ветками, не доведя текущие изменения до конца. Сохранить их поможет команда git stash, которая складывает правки «в стол», чтобы вы не создавали лишних коммитов. Рассказываем, как это работает.

Что такое Git Stash
Git stash — «черновик» для правок, которые еще не применили. Представьте, вы что-то правите в проекте, но в процессе возникла необходимость переключиться на другую ветку или заняться неотложной задачей. Если ничего не предпринять, изменения будут утеряны.
Что можно сделать в такой ситуации:
Создать новую ветку и закоммитить туда все изменения. Способ кажется удобным. Только если постоянно создавать такие ветки, репозиторий превратится в свалку.
Скопировать все файлы, куда вы начали вносить изменения и дать им понятные названия. Например, «доделать_фикс бага». Делать так с каждым файлом неудобно.
Третий и оптимальный вариант — применить команду git stash. Она поможет сохранить незаконченные изменения в архив и скрыть правки. Коммиты при этом не создаются. Изменения сохраняются в локальное хранилище на вашем устройстве. Вы можете спокойно переключиться на другую ветку и затем вернуться к изменениям.
Git stash save и Git stash push
Для сохранения изменений используются две команды — git stash save и git stash push. Первая работает, но уже устарела.
Git stash save
Чтобы убрать незаконченные изменения в локальное хранилище, можно воспользоваться командой git stash save. Правки уйдут в стеш, а рабочая директория останется чистой.
Допустим, вы начали вносить правки, и нужно их отложить:

Вы применяете команду:
Что получится:
Отложенные правки складываются в список. Его можно сравнить со стопкой тарелок — последнюю положили, значит, первую возьмете. Только есть вероятность потеряться в списке, поскольку по умолчанию Git сам придумывает имена сохранения. Выглядеть они могут странно, например:
Можно подписать сохранения самостоятельно, если сделать так:
Еще может случиться, что в правках вы добавили файлы, которых не было в проекте. Команда git stash save по умолчанию их не сохраняет. Если нужно это сделать, добавьте параметр --include-untracked или -u:
Если хотите спрятать игнорируемые файлы из.gitignore, используйте команду с флагом -a:
Если хотите отложить часть правок, используйте команду в интерактивном режиме:
Git покажет каждое изменение и спросит, отложить его или оставить.
Git stash push
Эта команда — усовершенствованная версия git stash save. Она делает все то же самое — временно прячет изменения, чтобы не засорять рабочую директорию. Что можно делать с ее помощью:
Выбирать, что конкретно прятать.
Сохранять новые файлы, которых еще нет в проекте
Добавлять игнорируемые и untracked-файлы.
Подписывать стеши через параметр -m.
Примеры:
Спрятать правки с уточняющим сообщением — git stash push -m "Bug fix main page"
Спрятать только новые файлы — git stash push -u -m "Include new files"
Спрятать отдельные файлы/папки — git stash push -m "Frontend changes only" src/frontend/
Спрятать игнорируемые файлы — git stash push -a -m "Save everything"
Для наглядности — различия команд Git stash save и Git stash push:
Параметры | git stash save | git stash push |
Статус команды | Старая команда, используется редко | Новая, более удобная команда |
Для чего нужна | Быстро убрать изменения | Убрать все изменения ли выборочно |
Можно ли выбрать отдельные файлы | Нет | Да, можно указать конкретные файлы |
Работает с незакоммиченными файлами (untracked) | Нет | Да, если добавить флаг -u |
Работает с игнорируемыми файлами | Нет | Через флаг -a |
Можно оставить изменения, которые уже в индексе | Да | Да |
Можно добавить сообщение к стешу | Да | Через -m |
Рекомендуется использовать | Нет | Да, в любой ситуации |
Просмотр и управление стешами
Когда вы начнете использовать git stash save или git stash push, со временем накопится несколько стешей. Для управления ими полезны команды git stash list и git stash show.
Git stash list
Команда показывает все сохранения в вашем локальном хранилище. Пример вывода:
stash@{0} — стеш, который вы положили последним;
stash@{1}, stash@{2} — более ранние сохранения.
После двоеточия в выводе идет сообщение, которое вы указывали при сохранении правок. Если ничего не писали, Git автоматически напишет «WIP on [ветка]».
Git stash show
Команда позволит посмотреть, какие изменения лежат в конкретном стеше. Пример применения:
Пример вывода:
Вы увидите, какие файлы были изменены и что именно добавлялось. Если хотите получить все подробности, добавьте флаг -p:
Применение и удаление стешей
Разберем, как применять сохраненные стеши и удалять ненужные, чтобы быстро управлять своими черновиками.
Применение изменений
Когда вы выполняете git stash, Git сохраняет незакоммиченные изменения во временное хранилище. Если хотите вернуть изменения в рабочую копию, используйте git stash apply и git stash pop.
Команда git stash apply позволяет взять изменения и наложить на их рабочую директорию. При этом стэш не удаляется. Так вы сможете оставить копию на случай, если планируете применять изменения к разным веткам или хотите убедиться, что они корректные.
Пример:
Команда git stash pop тоже позволит применить изменения, но после сразу их удалит. Используйте ее, если уверены, что копии изменений вам больше не понадобятся.
Если при применении изменений возникнут конфликты, pop их покажет. Но запись не удалится до тех пор, пока вы не примените ее полностью.
Пример:
Сравнение командУдаление стешей
Со временем stash-память захламляется, поэтому ее нужно чистить. Если хотите удалить конкретный стеш, примените git stash drop. Остальным записям ничего не угрожает — они останутся в памяти.
Пример:
Если хотите удалить все стеши, применяйте git stash clear. Только восстановить записи не получится, поэтому действуйте осторожно.
Пример:
Команду полезно применять после крупного рефакторинга, при захламлении stash-памяти или перед переходом на новый проект.
Расширенные возможности Git Stash
Git stash может больше, чем просто прятать изменения. Две полезные функции — сохранение неотслеживаемых файлов и создание ветки из стеша.
Работа с неотслеживаемыми файлами
По умолчанию git stash сохраняет только изменения в отслеживаемых файлах. Но иногда нужно убрать новые файлы или игнорируемые файлы из .gitignore. Используйте -u или -a:
После выполнения команды рабочая директория очищается, а все незаконченные правки остаются в стеше.
Создание ветки из стеша
Иногда изменения в стеше стоит развивать в отдельной ветке. Для этого есть команда:
Она создает новую ветку с указанным именем и применяет к ней выбранный стеш, сразу удаляя его из общего списка.
Например, вы экспериментировали с новым интерфейсом в ветке main и спрятали правки в стеш. Затем поняли, что это отдельная фича и ее нужно доработать. Начните развивать новую ветку:
Управление несколькими наборами стешей
Чтобы контролировать локальные изменения, работайте со списком стешей. Основные команды:
Действие | Команда | Что делает |
Просмотр всех стешей | git stash list | Выдает все сохраненные изменения с индексами и сообщениями |
Просмотр содержимого конкретного стеша | git stash show stash@{1} | Выводит файлы и изменения в выбранном стеше |
Полный просмотр изменений | git stash show -p stash@{1} | Выводит точные строки в правках |
Применение стеша без удаления | git stash apply stash@{1} | Восстанавливает правки, но стеш остается в списке |
Применение и удаление стеша | git stash pop stash@{1} | Восстанавливает правки и удаляет стеш из списка |
Удаление одного стеша | git stash drop stash@{2} | Удаляет выбранные правки из списка |
Удаление всех стешей | git stash clear | Очищает перечень сохраненных изменений |
Лучшие практики использования инструмента
Git Stash — полезный инструмент, если правильно им пользоваться. Несколько универсальных рекомендаций:
Добавляйте сообщения к каждому сохранению. Комментарии помогут разобраться в записях из списка стеша.
Применяйте флаг --include-untracked. Так вы сможете сохранять не только измененные, но и новые файлы, которых еще нет в индексе.
Периодически очищайте список отложенных изменений. Удаляйте неактуальные или использованные фрагменты во избежание путаницы и накопления «мусора».
Создавайте новую ветку командой git stash branch. Это полезно, если из-за применения отложенных изменений происходят конфликты в рабочей копии.
Применяйте интерактивный режим (git stash -p). Вы сможете временно скрыть определенные части кода, не трогая остальные изменения.
Применяйте apply вместо pop. Сохраняйте копии изменений в стеке на случай неудачного слияния или необходимости повторного использования.

Сценарии использования Git Stash и способы разрешения конфликтов
Представьте — вы работаете над новой фичей в файле index.html, а коллега в то же время меняет этот файл в ветке main. Возникает конфликт. Чтобы его разрешить, сначала спрячьте свои изменения:
Переключитесь на ветку main и подтяните обновления:
Верните свои изменения:
Конфликты могут возникать при применении стеша. Тогда Git выдаст подобное сообщение:
Откройте файл с конфликтом. Вы увидите что-то такое:
Оставьте правильную версию или совместите изменения. Дальше добавьте файл в staging:
Завершите применение стеша:
Выводы
Git Stash — полезный инструмент для разработчиков, который помогает сохранять незаконченные изменения и работать без лишних коммитов. С помощью команды можно безопасно переключаться между ветками, одновременно управлять несколькими задачами и возвращать изменения в рабочую среду. Стеши помогают поддерживать порядок в директории, избегать конфликтов и экспериментировать с проектом без страха потерять правки.
Для разработчиков, работающих в распределенных командах, Git Stash особенно полезен при частом переключении контекста между задачами. Если вы используете облачные виртуальные машины для разработки, сервис Evolution Compute от Cloud.ru предоставляет гибкие окружения для работы с Git-репозиториями с гарантированной доступностью 99,9% и удобным управлением через API, веб-интерфейс или Terraform. Это позволяет создавать изолированные dev/test среды, где вы можете безопасно экспериментировать со стешами и ветками без воздействия на основной код.
