← Назад к вопросам

Зачем нужна команда git stash?

1.0 Junior🔥 161 комментариев
#Git и VCS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Команда 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 stashgit 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.