Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Stash в Git
Stash — это функция Git, которая позволяет временно сохранить изменения (всё, что не закоммичено) без создания коммита и вернуться к чистому рабочему каталогу. Это очень полезно, когда нужно переключиться на другую ветку, но текущие изменения ещё не готовы к коммиту.
Основная идея
Stash буквально означает "припрятать, спрятать". Git сохраняет ваши несохранённые изменения в отдельном хранилище (stack), а рабочий каталог возвращается в состояние последнего коммита.
# Состояние: есть несохранённые изменения
git status
# On branch main
# Changes not staged for commit:
# modified: file.py
# Припрятываем изменения
git stash
# Рабочий каталог теперь чист
git status
# On branch main
# nothing to commit, working tree clean
Когда использовать Stash
- Переключение между ветками — текущие изменения блокируют переключение
- Быстрый фиксик — сохранить текущую работу, сделать срочный фиксик в другой ветке
- Удаление случайных изменений — не коммитить мусор
- Разделение работы — сделать несколько логических групп изменений
Команды Stash
Сохранить изменения:
# Базовое сохранение
git stash
# С описанием
git stash save "WIP: добавляю новую функцию"
# Или в новых версиях Git
git stash push -m "WIP: добавляю новую функцию"
# Включить неотслеживаемые файлы
git stash --include-untracked
# Или сокращённо
git stash -u
Просмотр сохранённых изменений:
# Список всех stash'ей
git stash list
# stash@{0}: WIP: добавляю новую функцию
# stash@{1}: WIP: исправляю баг
# stash@{2}: On main: временно припрятал
# Просмотр содержимого stash'а
git stash show stash@{0}
# С diff'ом
git stash show -p stash@{0}
# или просто
git stash show -p # показывает stash@{0}
Восстановить изменения:
# Восстановить последний stash и удалить его
git stash pop
# Восстановить конкретный stash
git stash pop stash@{1}
# Восстановить, но оставить stash в списке
git stash apply stash@{0}
# Или просто (применяет stash@{0})
git stash apply
Удалить сохранённые изменения:
# Удалить последний stash
git stash drop
# Удалить конкретный stash
git stash drop stash@{1}
# Удалить все stash'и
git stash clear
Практический сценарий
# Работаете над функцией A
echo "def new_feature():" > feature.py
git status
# Changes not staged for commit:
# modified: feature.py
# Срочно нужно переключиться на main для фиксика
# Но git не позволит переключиться с несохранённых изменений
# Припрячьте работу
git stash save "WIP: функция A в процессе"
# Теперь можете безопасно переключиться
git checkout main
# Сделайте срочный фиксик
echo "# quick fix" > hotfix.py
git add hotfix.py
git commit -m "hotfix: критический баг"
# Вернитесь на рабочую ветку
git checkout feature/new-feature
# Восстановите припрятанные изменения
git stash pop
# Продолжите работу
echo " return True" >> feature.py
Конфликты при восстановлении
Иногда при pop или apply может быть конфликт слияния:
# Восстановляем stash
git stash pop
# Конфликт!
# error: Your local changes to 'file.py' would be overwritten by merge
# Aborting
# Решение 1: сначала коммитьте текущие изменения
git add .
git commit -m "текущая работа"
git stash pop
# Решение 2: используйте apply, разберитесь с конфликтом
git stash apply
# CONFLICT (content): Merge conflict in file.py
# Отредактируйте файл, разберитесь с конфликтом
git add file.py
Продвинутые операции
Создать ветку из stash'а:
# Если после stash'а были изменения в том же месте
git stash branch my-feature
# Git автоматически создаст новую ветку и применит stash
# Это помогает избежать конфликтов слияния
Частичный stash (отдельные файлы):
# Припрячьте только определённые файлы
git stash push file1.py file2.py
# Остальные файлы останутся в рабочем каталоге
Интерактивный stash (в новых версиях Git):
# Выбирайте какие части сохранять
git stash -p
# Будет интерактивно спрашивать для каждого "hunk"
Не путайте со следующим
Stash ≠ Commit:
- Stash: временное хранилище, не входит в историю
- Commit: постоянная история в ветке
Stash ≠ Discard:
- Stash: сохраняет изменения
git checkout .: удаляет изменения
Stash ≠ Branch:
- Stash: сохраняет несохранённые изменения
- Branch: работа в отдельной ветке с коммитами
Практические советы
# ✅ Хорошая практика: давайте описательные имена
git stash save "WIP: добавляю аутентификацию"
git stash save "hotfix: баг с парсингом JSON"
# ❌ Плохая практика: зашифрованные имена
git stash save "stash1"
git stash save "temp"
# Регулярно очищайте старые stash'и
git stash list
git stash drop stash@{10}
# Если забыли какой stash нужен
git stash show -p stash@{0}
# прочитайте и решите
Когда НЕ использовать Stash
- Долгосрочное хранение изменений — используйте ветки
- Важная работа — коммитьте правильно
- Совместная разработка — делитесь ветками, не stash'ами
Выводы
Stash — это инструмент для временного сохранения работы, когда нужно быстро переключиться. Используйте его для:
- Срочных переключений между ветками
- Сохранения WIP перед опасными операциями
- Выделения отдельных изменений в новую ветку
Но помните: Stash не заменяет правильный Git workflow с коммитами и ветками.