Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Команда git stash: сохраняем работу без коммита
git stash — одна из самых полезных команд Git, которая часто недооценивается. Она позволяет временно сохранить незакоммиченные изменения и вернуть рабочую директорию в чистое состояние.
Аналогия: стол с документами
Представьте рабочий стол:
- На столе лежат бумаги, на которых вы работаете (working directory)
- Вы складываете их в папку (stash) и убираете со стола
- Стол становится чистым, вы можете работать с другими документами
- Позже вы достаёте папку и продолжаете работать
Основные сценарии использования
1. Срочно нужно переключиться на другую ветку
Сценарий: Вы работаете над feature, но нужна срочная правка в main.
# Текущее состояние
$ git status
On branch feature/new-feature
Modified: src/users.py
Modified: src/orders.py
# Вы не готовы коммитить эти изменения
# Нужно переключиться, но git не позволит:
$ git checkout main
error: Your local changes to 'src/users.py' would be overwritten by checkout
# Решение: спрячем изменения
$ git stash
Saved working directory and index state WIP on feature/new-feature
# Теперь рабочая директория чистая
$ git status
On branch feature/new-feature
nothing to commit, working tree clean
# Переключаемся на main
$ git checkout main
Switched to branch 'main'
# Исправляем баг
# ... делаем изменения ...
$ git add . && git commit -m "Fix critical bug"
# Возвращаемся на feature
$ git checkout feature/new-feature
Switched to branch 'feature/new-feature'
# Восстанавливаем сохранённые изменения
$ git stash pop
On branch feature/new-feature
Modified: src/users.py
Modified: src/orders.py
Dropped refs/stash@{0}...
2. Очистить рабочую директорию перед pull
# Были локальные изменения, которые конфликтуют с pull
$ git pull
error: Your local changes to the following files would be overwritten by merge:
src/config.py
Please commit your changes or stash them before you merge.
# Спрячем изменения
$ git stash
# Теперь pull работает
$ git pull
Updating abc1234..def5678
Fast-forward
src/api.py | 10 +++++
1 file changed, 10 insertions(+)
# Восстанавливаем наши изменения
$ git stash pop
3. Переключиться между ветками с незавершённой работой
# Вы работаете над feature1
$ git checkout feature1
$ git status
Modified: src/feature1.py
# Возникла более срочная feature2
$ git stash
$ git checkout -b feature2
$ git status
On branch feature2
nothing to commit, working tree clean
# Работаете над feature2, коммитите...
$ git add . && git commit -m "Implement feature2"
# Возвращаетесь на feature1
$ git checkout feature1
$ git stash pop
# feature1 изменения восстановлены
Практические команды
Сохранить изменения (stash)
# Простой stash
$ git stash
# Сохраняется: все Modified и Deleted файлы
# НЕ сохраняются: Untracked файлы
# С описанием (очень полезно!)
$ git stash save "Fixed header styling"
# Позже будет легче вспомнить, что там было
# Включить untracked файлы
$ git stash -u
# или
$ git stash --include-untracked
# Stash только staged изменения
$ git stash -k
# или
$ git stash --keep-index
# Стэш индивидуальных файлов (интерактивный режим)
$ git stash -p
# Будет спрашивать для каждого куска кода: стэшить или нет?
Просмотреть сохранённые stashes
# Список всех stash-ей
$ git stash list
stash@{0}: WIP on feature/new-feature: abc1234 Add user profile
stash@{1}: On main: def5678 Update config
stash@{2}: WIP on feature/payment: ghi9012 Handle Stripe API
# Посмотреть содержимое конкретного stash
$ git stash show stash@{0}
src/users.py | 15 +++++++---------
src/profile.py | 8 ++++----
2 files changed, 11 insertions(+), 12 deletions(-)
# Полный diff конкретного stash
$ git stash show -p stash@{0}
diff --git a/src/users.py b/src/users.py
index abc123..def456 100644
--- a/src/users.py
+++ b/src/users.py
@@ -10,5 +10,5 @@
...
Восстановить изменения
# Восстановить последний stash (и удалить его из списка)
$ git stash pop
# Восстановить конкретный stash
$ git stash pop stash@{2}
# Восстановить, но не удалять из списка
$ git stash apply stash@{0}
# Полезно, если хотите применить то же в другом месте
# Восстановить конкретный файл
$ git stash show -p stash@{0} | git apply
Удалить stash
# Удалить последний stash
$ git stash drop
# Удалить конкретный stash
$ git stash drop stash@{2}
# Очистить ВСЕ stash-ей (будьте осторожны!)
$ git stash clear
Реальный пример: рабочий день
# 9:00 Начали работать над feature
$ git checkout feature/dashboard
$ vim src/dashboard.py
$ git status
Modified: src/dashboard.py
# 11:30 Срочный баг в production
$ git stash save "WIP: Dashboard refactoring"
Saved working directory and index state on feature/dashboard
$ git checkout main
$ git pull origin main
$ git checkout -b hotfix/critical-bug
$ vim src/api.py
$ git add . && git commit -m "Fix: Handle null request body"
$ git push origin hotfix/critical-bug
# Создаёте pull request, ждёте review...
# 14:00 PR одобрили, merged to main
$ git checkout feature/dashboard
# Восстанавливаем нашу работу
$ git stash pop
$ git status
Modified: src/dashboard.py
# Продолжаем работу
$ vim src/dashboard.py
Проблемы и как их избежать
Проблема 1: Забыли, что в stash
# Плохо
$ git stash
$ git stash
$ git stash
# Теперь есть 3 stash, не помните в каком что
# Хорошо: всегда используйте описания
$ git stash save "WIP: User authentication"
$ git stash save "WIP: Payment integration"
$ git stash list
stash@{0}: WIP: Payment integration
stash@{1}: WIP: User authentication
Проблема 2: Конфликты при pop
$ git stash pop
Auto-merging src/api.py
CONFLICT (content): Merge conflict in src/api.py
# Нужно решить конфликт вручную
$ git status
UU src/api.py # Conflict
# Разрешаем конфликт
$ vim src/api.py
# ... исправляем ...
$ git add src/api.py
$ git stash drop # Удаляем stash, так как конфликт разрешён
Проблема 3: Lost and found (потерянные stash)
# Если случайно потеряли stash, используйте:
$ git fsck --lost-found
# Или посмотрите reflog
$ git reflog
abc1234 HEAD@{0}: stash pop: ...
def5678 HEAD@{1}: checkout: switching to main
# Можете восстановить по хешу
Когда НЕ использовать stash
❌ Плохое использование:
# Нельзя использовать stash как backup
$ git stash # Не коммитите уже 2 месяца работу!
Когда-нибудь её потеряете
# Вместо этого:
$ git add .
$ git commit -m "WIP: Dashboard redesign"
# Коммитите, это safe
❌ Слишком сложные stash
# Стэшить 50 файлов с разными логическими изменениями — плохо
# Лучше разделить на несколько коммитов
git stash vs git commit
| Аспект | git stash | git commit |
|---|---|---|
| Когда | Временное сохранение | Постоянное сохранение |
| Видно в истории | Нет | Да |
| Можно отправить | Нет | Да, в pull request |
| Безопасность | Может потеряться | Сохранено вечно |
| Использование | Quick switch между задачами | Checkpoint в разработке |
Совет профессионала: автоматический stash
# Если часто забываете про стэш перед pull:
$ git config --global rebase.autoStash true
# Теперь git pull будет автоматически stash-ить ваши изменения
$ git pull
# Автоматически: git stash → pull → git stash pop
Заключение
git stash — это не просто команда, это спасательный жилет для разработчика:
✅ Позволяет переключаться между задачами без коммитов ✅ Спасает от потери работы ✅ Делает возможным параллельную разработку ✅ Незаменим в командной разработке ✅ Экономит часы на refactoring и debugging
Про совет: привыкайте всегда давать описание (git stash save "message"). Это сэкономит вам время через месяц, когда вы вспомните, что спрячили в stash.