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

Как временно сохранять изменения в коде в локальном хранилище Git?

1.0 Junior🔥 161 комментариев
#Инструменты и DevOps

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

Как временно сохранять изменения в коде в локальном хранилище Git?

Git Stash — это инструмент для временного сохранения незафиксированных изменений. Это очень полезно, когда нужно быстро переключиться на другую ветку или работу, не теряя текущие изменения.

Основной концепт

Git stash — это как временный буфер обмена для твоего кода. Ты можешь сохранить изменения, переключиться на что-то другое, а потом вернуть их обратно.

Текущее состояние        Stash применен
┌─────────────────┐     ┌──────────────┐
│ Изменения (WIP) │────>│ Сохранено    │
│ Файл A: +10 -5  │     │ Файл A: +10-5│
│ Файл B: новый   │     │ Файл B: новый│
└─────────────────┘     └──────────────┘
     (чистая рабочая директория)

Базовая команда

# Сохранить все текущие изменения
git stash

# Эквивалентно:
git stash save

# Сохранить с описанием
git stash save "описание моих изменений"

# В новых версиях Git (2.13+) — короче:
git stash push -m "мое описание"

Список сохраненных изменений

# Посмотреть все сохраненные изменения (stash'и)
git stash list

# Пример вывода:
# stash@{0}: WIP on main: abc1234 Last commit message
# stash@{1}: WIP on main: abc1234 Добавлено описание
# stash@{2}: WIP on feature: def5678 Фикс бага

# Посмотреть детали конкретного stash'а
git stash show stash@{0}

# Посмотреть полный diff
git stash show -p stash@{0}

# Если не указать номер, покажет последний
git stash show

Восстановление изменений

Способ 1: Применить и удалить (pop)

# Восстановить последний stash и удалить его
git stash pop

# Восстановить конкретный stash
git stash pop stash@{2}

Способ 2: Применить, но сохранить (apply)

# Применить последний stash, но оставить его в списке
git stash apply

# Применить конкретный stash
git stash apply stash@{1}

# Потом можно удалить вручную:
git stash drop stash@{1}

Управление stash'ами

# Удалить последний stash
git stash drop

# Удалить конкретный stash
git stash drop stash@{1}

# Удалить все stash'и (осторожно!)
git stash clear

# Создать ветку из stash'а
git stash branch имя-ветки
git stash branch feature/my-work stash@{0}

Практические примеры

Пример 1: Срочное переключение на главную ветку

# Ты работал над feature, но заметил критический баг в main
# Текущее состояние:
# - Modified: src/component.tsx
# - Modified: src/utils.ts
# - Untracked: temp-file.txt

# Сохрани свою работу
git stash save "WIP: новая фича в компоненте"

# Теперь работа сохранена, рабочая директория чиста
git status
# On branch feature/my-work
# nothing to commit, working tree clean

# Переключись на main
git checkout main

# Исправь баг
# ... делаешь правки ...
git add .
git commit -m "Fix critical bug"

# Вернись на свою ветку
git checkout feature/my-work

# Восстанови свою работу
git stash pop
# На экране:
# Modified: src/component.tsx
# Modified: src/utils.ts

Пример 2: Частичное сохранение (интерактивный режим)

# Хочешь сохранить только конкретные файлы
git stash push -m "Только фиксы" src/utils.ts src/helpers.ts

# Остальные файлы остаются в рабочей директории
git status
# modified: src/component.tsx (остался в рабочей директории)

Пример 3: Сохранение с неслеживаемыми файлами

# По умолчанию stash не сохраняет новые файлы (untracked)
git status
# modified: existing.js
# Untracked files: new-file.js

git stash
git status
# Untracked files: new-file.js (этот файл остался!)

# Сохранить ВСЁ, включая новые файлы
git stash -u
# или
git stash --include-untracked

# Теперь новые файлы тоже сохранены
git status
# nothing to commit, working tree clean

Advanced: Применение stash'а с конфликтами

# Если при pop/apply будут конфликты:
git stash pop

# Конфликты! Git скажет:
# CONFLICT (content): Merge conflict in src/component.tsx

# Посмотри конфликты
git status

# Разрешь конфликты вручную в редакторе
# <<<<<<< Updated upstream
# твое новое содержимое
# =======
# содержимое из stash'а
# >>>>>>> Stashed changes

# После разрешения конфликтов:
git add .

# Теперь stash "завершен"
# (не нужно делать git stash drop, он уже удален)

Практические советы

Совет 1: Используй описательные имена

# Плохо
git stash save

# Хорошо - понимаешь, что там сохранено
git stash save "feat: добавлен фильтр по датам"
git stash save "fix: исправлена ошибка в форме"
git stash save "wip: темная тема (незавершено)"

Совет 2: Регулярно очищай старые stash'и

# Посмотри, что там было
git stash list

# Удали ненужное
git stash drop stash@{5}

Совет 3: Используй stash для сравнения

# Посмотреть, что в stash'е отличается от текущего состояния
git stash show -p

# Посмотреть, что изменилось в конкретном файле
git stash show -p src/component.tsx

Совет 4: Если забыл применить stash

# Не паникуй! Git хранит историю
# Даже удаленные stash'и можно восстановить (иногда)

# Посмотри в reflog
git reflog

# Или используй:
git stash show stash@{0}@{<time>}

Сравнение pop vs apply

Команда         | Удаляет stash | Прерывает при конфликте
────────────────┼──────────────┼─────────────────────────
git stash pop   | Да           | Нет (оставляет stash)
git stash apply | Нет          | Нет (остается в списке)

Интеграция с рабочим процессом

Типичный workflow:

# 1. Ты работал над фичей
git status
# modified: components/Button.tsx

# 2. Нужно срочно что-то в main
git stash save "feat: новая кнопка"

# 3. Переключись и зафиксируй срочное
git checkout main
git pull
# ... исправь что-то критическое ...
git add .
git commit -m "Hotfix: критический баг"
git push

# 4. Вернись на свою фичу
git checkout feature/button
git stash pop

# 5. Продолжай работу
# Твои изменения восстановлены!

Полезные alias (для быстрого доступа)

# Добавь в .gitconfig:
[alias]
    st = stash
    stl = stash list
    stp = stash pop
    sta = stash apply
    std = stash drop
    stc = stash clear

# Теперь можно использовать:
git st save "мои изменения"
git stl
git stp

Заключение

Git stash — это мощный инструмент для временного сохранения изменений. Используй его для:

  • Быстрого переключения между задачами
  • Очистки рабочей директории перед pull
  • Временного сохранения экспериментов
  • Сохранения ветки во время срочных багов

Ключевые команды:

  • git stash save — сохранить
  • git stash list — список
  • git stash pop — восстановить и удалить
  • git stash apply — восстановить без удаления