Git stash: как отложить изменения и вернуть их без путаницы

Git stash: как отложить изменения и вернуть их без путаницы
Содержание статьи

Git stash временно сохраняет незавершённые изменения и убирает их из рабочего дерева. Команда полезна, когда нужно переключиться на другую задачу, а текущая работа ещё не готова к обычному коммиту. Для первого знакомства удобнее возвращать изменения через apply: запись остаётся в списке до отдельного решения об удалении.

На Mentoring.digital разберём безопасную последовательность проверки и возврата. Первую тренировку лучше провести в отдельном учебном репозитории: stash меняет состояние рабочих файлов, а не просто создаёт дополнительную заметку.

Что сохраняется при push

Обычный git stash push сохраняет изменения отслеживаемых файлов, включая состояние индекса. Новые неотслеживаемые файлы в него по умолчанию не входят. Флаг -u добавляет untracked-файлы, но не игнорируемые. Флаг -a включает и игнорируемые файлы; не используйте его автоматически, поскольку туда могут попасть большие каталоги сборки или локальные данные.

git status --short
git stash push -u -m "WIP: catalog filter"
git stash list
git stash show --stat 'stash@{0}'
git stash show --include-untracked -p 'stash@{0}'

Сначала прочитайте status, чтобы понимать, какие файлы будут затронуты. Сообщение после -m поможет найти запись среди других. stash@{0} обозначает последнюю запись, а не постоянный идентификатор вашей задачи: после нового сохранения нумерация сдвигается.

Кавычки вокруг stash@{0} полезны в оболочках, где фигурные скобки имеют специальное значение, в том числе в PowerShell. В show добавлен --include-untracked, чтобы при просмотре патча увидеть и сохранённые новые файлы. Обычная краткая статистика может не показать всё содержимое такой записи.

Apply и pop отличаются судьбой записи

Вернитесь в нужную ветку и убедитесь, что в рабочем дереве нет посторонних незавершённых изменений. Перед apply ещё раз проверьте list и содержимое выбранного stash. Следующие команды только возвращают и показывают изменения, но не создают коммит.

git status --short
git stash apply 'stash@{0}'
git status --short
git diff
git diff --cached

apply оставляет запись в списке stash. pop применяет изменения и при успешном применении удаляет соответствующую запись. При конфликте pop не удаляет её автоматически: сначала нужно разобраться с конфликтующим состоянием.

Сравните diff, staged-изменения и новые файлы со своим ожиданием, запустите подходящие проверки проекта. Только после этого решайте, нужна ли сохранённая запись. git stash drop 'stash@{0}' удаляет выбранную запись из списка, поэтому до запуска нужно снова проверить её номер. Не используйте git stash clear для удаления одной записи: он очищает весь список.

Почему индекс и файлы могут вернуться не так, как ожидалось

Обычный apply не обещает восстановить прежнее распределение изменений между индексом и рабочим деревом. Если важно вернуть staged-состояние, существует git stash apply --index 'stash@{0}'. Эта попытка тоже может завершиться конфликтом. Перед применением важно понимать, какие изменения были подготовлены к коммиту.

Запись stash основана на определённом состоянии репозитория. Если после сохранения код заметно изменился, применение поверх нового состояния может конфликтовать. Команда git stash branch создаёт ветку от исходной базы записи и применяет её туда; при успешном применении указанной записи stash она удаляет её из списка. Это отдельный вариант работы, а не универсальная кнопка отмены.

При конфликте начните с git status и чтения конфликтующих файлов. Не запускайте pop повторно поверх уже частично применённых изменений. Сначала определите, что успело вернуться, разрешите конфликт и проверьте результат. Универсальной безопасной команды «стереть последствия apply» для любого рабочего дерева нет.

Как не потеряться в отложенной работе

  • Давайте сохранению короткое содержательное сообщение.
  • Проверяйте выбранную запись перед применением и перед удалением.
  • Не считайте stash отправленной в удалённый репозиторий резервной копией: обычный push ветки не публикует этот список.
  • Для длительной или совместной работы используйте отдельную ветку и понятные коммиты.
  • Отдельно проверяйте новые файлы и состояние индекса, а не только визуальный результат в редакторе.

Полезная тренировка: изменить отслеживаемый файл, создать новый, сохранить с -u и вернуть через apply. Убедитесь, что оба изменения восстановились, а запись ещё видна в list. Такие операции удобно осваивать на курсе по Git. Если результат отличается от ожидаемого, наставнику по Git покажите последовательность команд и status без секретного содержимого файлов.

Похожие статьи по данной теме