Преимущества использования системы контроля версий Git трудно переоценить. Данная система позволяет нескольким разработчикам одновременно работать над одним проектом, разделять проект на отдельные ветви и затем снова объединять код в одну ветку.
В рамках данной статьи мы будем полагать, что читатель уже знаком с основными принципами работы данного решения и, в частности, с механизмами ветвления. В этой статье мы поговорим о такой полезной функции, как стешинг (Git Stash).
Для начала давайте представим ситуацию: программист работает над функцией в ветке, и ему нужно срочно поработать над другой задачей, но та функция, которую он сейчас пишет еще не завершена; соответственно, он не может выполнить коммит недописанного кода. Можно, конечно, сохранить текущие изменения где‑то на рабочей машине локально сторонними средствами и затем, вернувшись к этой задаче, снова скопировать их. Но при таком кустарном подходе велика вероятность человеческой ошибки.
Более правильным решением является использование функции git stash
. Данная команда сохраняет ранее написанный код, а затем возвращается к последнему коммиту, чтобы начать все сначала. В результате вы можете прервать работу над текущей функцией, перейти к другой задаче, а затем снова вернуться к работе над данной функцией, поскольку она сохранена локально.
Немного практики
Работать с функциями стешинга достаточно просто. Внесем изменения в файлы нашего проекта, но не будем выполнять коммит. Вместо этого выполним команду git status
и убедимся, что у нас есть измененные файлы проекта. Затем выполним git stash
, а затем снова git status
.

Как видно, изменения исчезли из вывода, но не исчезли совсем. По умолчанию git stash
сохраняет изменения, которые были добавлены в индекс (staged changes), и изменения, внесенные в файлы, которые в данный момент отслеживаются Git'ом (unstaged changes). Чтобы сохранить неотслеживаемые файлы, используйте git stash ‑u
.
По сути, стешинг работает по принципу стека — Last In First Out, поэтому если у вас сохранено несколько проектов, то извлекать изменения нужно в соответствующие ветки.
Смотрим точки сохранения
Для того, чтобы посмотреть список сохраненных изменений, можно воспользоваться командой
git stash list

Также вы можете создать несколько точек сохранения и просматривать их с помощью команды git stash list
. Каждая запись содержит имя (например, stash@{1}
), название ветки, которая была текущей на момент создания записи, и краткое описание коммита, на котором основана запись.
Когда надо вернуться
После того, как вы завершили работу над другим проектом и готовы вернуться к предыдущему, вам необходимо выполнить одну из команд git stash pop
или git stash apply
.
Эти команды выполняют схожие функции и единственное различие между ними заключается в том, что git stash pop
удаляет изменения из хранилища и повторно применяет их в рабочей копии, а git stash apply
только повторно применяет изменения в рабочей копии, не удаляя их из хранилища.
Вот пример работы git stash pop
:

А это git stash apply
:

Проще говоря, «pop» удаляет состояние из списка сешинга, а «apply» не удаляет состояние из этого списка. С помощью последующей команды мы можем повторно применить сохраненные изменения. Состояние проекта из вершины стека нашего стешинга будет применено к текущему рабочему каталогу, и он же будет извлечен из стека.
Когда мы используем git stash
, данные будут храниться в виде стэшей в нашем локальном репозитории. По умолчанию данные будут храниться в файле git/refs/stash
. В этом файле хранятся все ссылки, а фактические данные хранятся в каталоге .git/objects
, как и другие объекты Git.
Не забываем убрать за собой
Иногда может возникнуть ситуация, в которой нам не будет нужна какая‑либо из точек сохранения. В таком случае нам потребуется команда git stash drop
. Так, если мы хотим удалить stash@{1})
, то необходимо использовать команду git stash drop stash@{1}
. Если мы укажем просто git stash drop
, то команда удалит stash@{0}
.
Ну а если мы хотим удалить все точки сохранения сразу, то нужно воспользоваться командой git stash clear.

Мы рассмотрели основные этапы жизненного цикла git stash
, но возможны различные частные случаи использования данной команды.
Создание ветки из точки сохранения
Возможно в процессе работы вы захотите создать и использовать новую ветку, начиная с коммита, на котором изначально была создана точка восстановления, и применить сохраненные изменения. Для реализации этого вам необходимо использовать команду git stash branch branch_name stash_name
.
Она извлекает точку восстановления, указанную в качестве аргумента, а если мы ничего не указали, то извлекает самую последнюю.

Стешинг неотслеживаемых или игнорируемых файлов
Мы можем использовать команду git stash
для хранения файлов, которые не отслеживаются или игнорируются. Для этого нам необходимо выполнить следующие действия.
Сохранить все неотслеживаемые файлы с помощью команды
git stash save --include-untracked
Использование ключа ‑include‑untracked
приведет к сохранению всех неотслеживаемых файлов.
Далее нам необходимо проверить, что точка восстановления создана
git stash list
Далее вытолкнем сохраненные данные с помощью
git stash apply stash@{0}
Наконец, выполним удаление
git stash drop stash@{0}
Как видно, здесь все достаточно просто.
Лучшие практики стешинга
И в завершение давайте рассмотрим несколько советов по использованию стешинга. Прежде всего, не злоупотребляйте git stash
. Эта команда должна использоваться умеренно, когда очень важно работать над другой задачей.
При работе с git stash
, вы можете добавить сообщение, описывающее изменения, которые вы сохраняете. Делайте эти сообщения осмысленными. Когда позже вам понадобится вспомнить, что вы сохранили, это пригодится. Используйте информативные и вызывающие сообщения, которые точно отражают скрываемые изменения.
Стешинг — полезный инструмент при работе с ветками Git. Перед сохранением изменений создайте новую ветку, чтобы вы могли переключаться на другие задачи или ветки, не затрагивая текущие изменения. Вернитесь к ветке и примените сохраненные изменения, когда будете готовы снова работать над ними.
Изменения следует вносить так быстро, как это возможно: хранение должно использоваться только в качестве временного решения. Как только вы закончили вносить изменения, необходимо зафиксировать их в репозитории, чтобы сохранить запись об изменениях.
Заключение
В этой статье мы рассмотрели некоторые аспекты работы с одним из наиболее востребованным инструментом DevOps инженера — репозиторием Git. Использование стешинга может существенно облегчить работу с системой контроля версий.
А также напоминаю об открытых уроках, которые пройдут в рамках онлайн-курса по DevOps в Otus:
15 января, 20:00 — «Ansible: быстрый старт». Участники узнают, как с помощью усилий автоматизировать сложную задачу, управлять серверной инфраструктурой и масштабировать проекты. Записаться
23 января, 20:00 — «Работа с данными и сетями в Docker». Поговорим о том, как эффективно управлять контейнерами данных, обеспечивать их безопасность и масштабировать сетевые взаимодействия в сложных окружениях. Записаться
Комментарии (7)
khajiit
15.01.2025 20:36О какой работе над другим проектом идет речь в рамках одного репозитория?
jbourne
15.01.2025 20:36khajiit
15.01.2025 20:36Oh, my!
Этому больше нравится концепция submodulejbourne
15.01.2025 20:36Похоже. Но чуть отличается.
Например, что в монорепе у вас сцеплены версии всех внутренних компонентов и зависимостей. И они всегда актуальные.
Плюс можно вводить правила единые для всего кода. Все типа рядом. Может быть чуть легче организовать высоко уровневые тесты.
В общем есть нормальная пачка удобств, когда все рядом и актуальное + часто бывает легче искать, что вообще есть.
Например в финтехе, когда многое предпочитают писать сами из-за безопасности, но хотят избежать постоянного переписывания велосипедов всеми командами; на монорепе - легче минимизировать объем дублирования может быть.
Но есть и сложности из-за размера: настраивать частичные билды, а не всего и вся; часть тулов может прийдется писать самому или покупать проприетарные (опенсорсные не справляются иногда; касается чекалок, форматтеров, LSP, ..., вплоть до сорс контрола). В общем проблемы монорепы описаны тоже, тем же Гуглом.
Пару раз работал на монорепе. В целом - нормально и много интересных моментов. Но чувствуется, что требуется выше минимальный скил управления кодом в целом в команде + окупается только на реально больших репах.
Не знаю по поводу ГитХаба, но ГитЛаб монорепу умеет (ограниченные билды и т.д.).
rusticus
15.01.2025 20:36Обычно создаю новую ветку и делаю там коммит, а потом обратно переключаюсь в мастер
sergio_nsk
Не рассмотрен полезный флаг
--autostash
уgit rebase
.Зашакалистые картинки могли бы быть чётким текстом.
Testman2023
Зря Вы пытаетесь инфу донести. Это реклама курсов. Все уплочено.