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

Категория: Git · Язык: Bash · Обновлено:

Команда git stash убирает незакоммиченные изменения во временное хранилище и возвращает рабочую папку к состоянию последнего коммита. Вернуть изменения можно командой git stash pop или git stash apply.

Основные команды

Команда

Что делает

git stash

Прячет изменения отслеживаемых файлов

git stash push -m "текст"

То же, но с понятным названием

git stash push -u

Прячет ещё и новые, неотслеживаемые файлы

git stash list

Показывает все сохранённые наборы

git stash pop

Применяет последний набор и удаляет его из списка

git stash apply stash@{1}

Применяет выбранный набор и оставляет его в списке

git stash drop stash@{0}

Удаляет один набор

git stash clear

Удаляет все наборы

Спрятать и вернуть

Bash
git stash push -m "правка формы входа"   # спрятать с названием
git switch hotfix                        # переключиться на другую ветку
# ...поработать, закоммитить...
git switch main
git stash pop                            # вернуть спрятанное

Спрятать только часть изменений

Bash
git stash push -m "только стили" -- src/styles.css   # один файл или папка
git stash push -u -m "вместе с новыми файлами"       # включая неотслеживаемые

Без -u новые файлы, которые вы ещё не добавляли в git, останутся в рабочей папке и не попадут в набор.

Посмотреть, что внутри

Bash
git stash list                       # stash@{0}: On main: правка формы входа
git stash show stash@{0}             # список изменённых файлов
git stash show -p stash@{0}          # полный diff

Создать ветку из набора

Если после возвращения изменений возникают конфликты, удобнее выделить их в отдельную ветку:

Bash
git stash branch feature/login-form stash@{0}

Команда создаёт ветку от коммита, на котором делали набор, применяет его и удаляет из списка.

Частые вопросы

В чём разница между pop и apply?

pop применяет набор и сразу удаляет его из списка. apply оставляет его, и можно применить к другой ветке ещё раз.

Что делать, если при pop возник конфликт?

Набор при этом не удаляется. Разрешите конфликт, добавьте файлы командой git add, а затем удалите набор вручную: git stash drop.

Можно ли вернуть набор, удалённый по ошибке?

Часто да. Выполните git fsck --no-reflog | grep "dangling commit", найдите нужный коммит и применить его можно через git stash apply <хеш>.