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

Что такое git stash?

1.0 Junior🔥 71 комментариев
#Другое

Комментарии (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

  1. Описательные имена: git stash save "WIP: OAuth2 authentication"
  2. Проверяй перед применением: git stash show -p перед pop
  3. Не полагайся на stash для долгосрочного хранения — используй commit
  4. Создавай ветку из stash если неуверен: git stash branch
  5. Периодически очищай: git stash drop stash@{old}
  6. Используй apply, а не pop если хочешь сохранить stash

Недостатки stash

  • Локален (не синхронизируется с remote)
  • Может быть потерян при очистке
  • Сложен при наличии конфликтов
  • Не отслеживается в истории проекта

Альтернативы:

  • Commit на отдельную ветку (лучше для истории)
  • Использовать ветки WIP: feature/wip-auth
  • Draft PR на GitHub (для командной работы)

Заключение

Git stash — очень полезный инструмент для временного переключения между ветками. Используй его для краткосрочного хранения. Для долгосрочного хранения и совместной работы всегда предпочитай коммиты и ветки.