Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Git Stash: Временное сохранение изменений
Git stash — это команда, которая позволяет временно сохранить незафиксированные изменения в отдельное хранилище и очистить рабочую копию. Это полезно, когда нужно переключиться на другую ветку, но текущие изменения не готовы к коммиту.
Основная концепция
Когда вы работаете над feature, но вам срочно нужно переключиться на main для хотфикса:
# Текущее состояние: незафиксированные изменения
$ git status
On branch feature/new-auth
Changes not staged for commit:
modified: src/Auth.java
modified: src/User.java
# Git не позволит переключиться с незафиксированными изменениями
$ git checkout main
error: Your local changes would be overwritten by checkout
# Решение: временно сохраняем изменения
$ git stash
Saved working directory clean
# Теперь можно переключиться
$ git checkout main
Switched to branch main
# После работы на main, возвращаемся и восстанавливаем
$ git checkout feature/new-auth
$ git stash pop
On branch feature/new-auth
Changes not staged for commit:
modified: src/Auth.java
modified: src/User.java
Основные команды
Сохранение
# Сохранить все изменения
$ git stash
# С описанием
$ git stash save "WIP: new authentication feature"
# Сохранить конкретные файлы
$ git stash push src/Auth.java src/User.java
# Сохранить и untracked файлы
$ git stash -u # include-untracked
Просмотр
# Список всех сохранённых изменений
$ git stash list
stash@{0}: WIP on feature/new-auth: abc1234 Fix login
stash@{1}: WIP on feature/old-auth: def5678 Update password
# Содержимое stash'а
$ git stash show stash@{0}
src/Auth.java | 10 +++++++---
src/User.java | 5 ++---
2 files changed, 9 insertions(+), 6 deletions(-)
# Full diff
$ git stash show -p stash@{0}
Восстановление
# Восстановить последний stash и удалить его
$ git stash pop
# Восстановить конкретный stash
$ git stash pop stash@{1}
# Применить БЕЗ удаления из списка
$ git stash apply
# Применить и сохранить staged состояние
$ git stash pop --index
Удаление
# Удалить последний stash
$ git stash drop
# Удалить конкретный
$ git stash drop stash@{1}
# Удалить все
$ git stash clear
Создание ветки из stash
# Создаёт новую ветку и применяет stash
$ git stash branch feature/auth-work
Switched to a new branch feature/auth-work
# Изменения применены, stash удалён
Реальные сценарии
Сценарий 1: Экстренный хотфикс
# Работаешь над feature
$ git checkout feature/payment
$ # редактируешь файлы
# Срочно нужен хотфикс в production
$ git stash # Сохраняем работу
$ git checkout main
$ git checkout -b hotfix/critical
$ # Фиксишь баг
$ git commit -m "Fix critical bug"
$ git push
# Возвращаешься к своей работе
$ git checkout feature/payment
$ git stash pop # Восстанавливаем
Сценарий 2: Ошибочная ветка
# Случайно отредактировал файлы на main
$ git branch
* main
feature/refactor
$ git stash # Сохраняем
$ git checkout feature/refactor # Переходим на правильную ветку
$ git stash pop # Восстанавливаем
Сценарий 3: Частичное сохранение
# Отредактировал несколько файлов
$ git status
modified: Feature.java # готов к коммиту
modified: Debug.java # WIP
modified: Test.java # WIP
# Сохраняем только незавершённую работу
$ git stash push Debug.java Test.java -m "WIP: debugging"
# Commit готовой части
$ git add Feature.java
$ git commit -m "Add new feature"
# Позже восстанавливаем WIP
$ git stash pop
Важные детали
Что сохраняется
# ✅ Сохраняется:
# - Modified tracked файлы
# - Deleted tracked файлы
# - Staged changes (git add)
# ❌ НЕ сохраняется:
# - Untracked файлы (новые файлы, не добавленные в git)
# - Ignored файлы (.gitignore)
# Чтобы сохранить untracked:
$ git stash -u # include-untracked
$ git stash --all # всё, включая ignored
LIFO стек
Stash работает как стек (Last In, First Out):
$ git stash save "First"
$ git stash save "Second"
$ git stash save "Third"
$ git stash list
stash@{0}: Third # Последний добавленный
stash@{1}: Second
stash@{2}: First # Первый добавленный
$ git stash pop # Вернёт Third
Конфликты при pop
# Если при восстановлении возникают конфликты
$ git stash pop
Auto-merging src/Auth.java
CONFLICT (content): Merge conflict in src/Auth.java
# Разреши конфликт вручную в редакторе
$ git add src/Auth.java
$ git commit
# Stash автоматически удалится
Best Practices
- Описательные имена:
git stash save "WIP: OAuth2 authentication" - Проверяй перед применением:
git stash show -pпередpop - Не полагайся на stash для долгосрочного хранения — используй commit
- Создавай ветку из stash если неуверен:
git stash branch - Периодически очищай:
git stash drop stash@{old} - Используй apply, а не pop если хочешь сохранить stash
Недостатки stash
- Локален (не синхронизируется с remote)
- Может быть потерян при очистке
- Сложен при наличии конфликтов
- Не отслеживается в истории проекта
Альтернативы:
- Commit на отдельную ветку (лучше для истории)
- Использовать ветки WIP:
feature/wip-auth - Draft PR на GitHub (для командной работы)
Заключение
Git stash — очень полезный инструмент для временного переключения между ветками. Используй его для краткосрочного хранения. Для долгосрочного хранения и совместной работы всегда предпочитай коммиты и ветки.