Как временно сохранять изменения в коде в локальном хранилище Git?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как временно сохранять изменения в коде в локальном хранилище 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— восстановить без удаления