Git stash: как спрятать изменения и вернуть их обратно
Команда git stash убирает незакоммиченные изменения во временное хранилище и возвращает рабочую папку к состоянию последнего коммита. Вернуть изменения можно командой git stash pop или git stash apply.
Основные команды
Команда | Что делает |
|---|---|
| Прячет изменения отслеживаемых файлов |
| То же, но с понятным названием |
| Прячет ещё и новые, неотслеживаемые файлы |
| Показывает все сохранённые наборы |
| Применяет последний набор и удаляет его из списка |
| Применяет выбранный набор и оставляет его в списке |
| Удаляет один набор |
| Удаляет все наборы |
Спрятать и вернуть
git stash push -m "правка формы входа" # спрятать с названием
git switch hotfix # переключиться на другую ветку
# ...поработать, закоммитить...
git switch main
git stash pop # вернуть спрятанноеСпрятать только часть изменений
git stash push -m "только стили" -- src/styles.css # один файл или папка
git stash push -u -m "вместе с новыми файлами" # включая неотслеживаемыеБез -u новые файлы, которые вы ещё не добавляли в git, останутся в рабочей папке и не попадут в набор.
Посмотреть, что внутри
git stash list # stash@{0}: On main: правка формы входа
git stash show stash@{0} # список изменённых файлов
git stash show -p stash@{0} # полный diffСоздать ветку из набора
Если после возвращения изменений возникают конфликты, удобнее выделить их в отдельную ветку:
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 <хеш>.