Баннер мобильный (3) Пройти тест

Git stash: как временно сохранить изменения и убрать их из рабочей директории

Как спрятать изменения перед переключением ветки и как их потом вернуть

Инструкция

15 апреля 2026

Поделиться

Скопировано
Git stash: как временно сохранить изменения и убрать их из рабочей директории

Содержание

    В процессе разработки бывает так, что работа еще не готова к коммиту, но изменения нужно быстро убрать из рабочей директории. У 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 пример

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

    git stash

    или

    git stash push
    Предупреждение от Git

    После запуска команды может появиться предупреждение:

    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.

    Git stash вывод

    Как добавить изменения в 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

    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 удобен, когда нужно быстро переключиться на другую задачу, не делая лишний коммит и не теряя текущие правки.

    Инструкция

    Поделиться

    Скопировано
    0 комментариев
    Комментарии