Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Git Stash?
Git stash — это команда Git, которая позволяет временно сохранить незакоммиченные изменения (как в рабочем каталоге, так и в индексе/staging area) в специальное хранилище, чтобы вы могли вернуться к чистому состоянию рабочей директории. Это особенно полезно, когда вам нужно быстро переключиться на другую задачу, ветку или исправить срочный баг, не коммитя незавершённую работу.
Проще говоря, git stash — это "отложить в сторону" текущие правки, чтобы позже к ним вернуться.
Основные варианты использования
- Смена контекста: Переключиться на другую ветку для срочного исправления, не теряя текущие наработки.
- Сохранение "грязного" состояния: Временное сохранение изменений перед выполнением операций, требующих чистого рабочего каталога (например,
git merge,git rebase,git pull). - Эксперименты: Сохранить текущее состояние, чтобы попробовать альтернативное решение, с возможностью легко откатиться.
Базовые команды и их действие
-
Создание stash:
git stashСохраняет все отслеживаемые изменения (modified и staged) в новый stash-объект и откатывает рабочий каталог к состоянию последнего коммита. По умолчанию stash не включает неотслеживаемые (untracked) файлы и игнорируемые.
-
Сохранение с неотслеживаемыми файлами:
git stash -u # или --include-untrackedДобавляет в stash и неотслеживаемые файлы (новые файлы, ещё не добавленные в Git).
-
Сохранение ВСЕГО (включая игнорируемые файлы):
git stash -a # или --allРедко используется, но может быть полезно для полного резервного копирования состояния.
-
Просмотр списка stash'ей:
git stash listВыводит список всех сохранённых stash-записей в формате
stash@{n}: ветка: сообщение-коммита. Каждый stash имеет уникальный индекс (например,stash@{0}— самый последний). -
Применение stash:
git stash apply # применяет последний stash, но не удаляет его из списка git stash apply stash@{2} # применяет конкретный stashИзменения из stash накладываются на текущую рабочую директорию. Могут возникнуть конфликты, если текущее состояние изменилось.
-
Применение и удаление из списка:
git stash pop # применяет последний stash и удаляет его из списка git stash pop stash@{1}Удобно, когда stash больше не нужен.
-
Удаление stash:
git stash drop stash@{0} # удаляет конкретный stash git stash clear # удаляет ВСЕ stash'и -
Создание stash с сообщением:
git stash save "сообщение"Позволяет добавить описательное сообщение для easier идентификации (сейчас
git stashтоже поддерживает сообщение через-m).
Что происходит под капотом?
Когда вы выполняете git stash, Git:
- Создает два (или три) коммита:
- Индексный коммит (staged changes).
- Рабочий коммит (unstaged changes в отслеживаемых файлах).
- Опциональный коммит для неотслеживаемых файлов (при использовании
-uили-a).
- Эти коммиты сохраняются не в истории веток, а в специальной области
.git/refs/stashи связаны через ссылки. - Рабочий каталог откатывается к
HEAD.
Пример рабочего процесса
# 1. Работаем над новой функцией
git checkout -b feature/new-ui
# ... вносим изменения в несколько файлов
# 2. Внезапно нужно переключиться на main для исправления бага
git stash -u -m "WIP: new UI components"
git checkout main
# 3. Чиним баг, коммитим, возвращаемся к feature-ветке
git checkout feature/new-ui
git stash pop # возвращаем изменения и удаляем stash
Практические советы для Android-разработки
- Используйте осмысленные сообщения для stash'ей, особенно в больших командах:
git stash push -m "Рефакторинг LoginActivity, WIP" - Осторожнее с
git stash pop: Если возможно, лучшеapply+ ручнойdrop, чтобы избежать потери данных при конфликтах. - Stash — не замена коммитам: Не стоит хранить в stash важные изменения долгое время. Лучше сделать временный коммит (
git commit -m "WIP") и потом отредактировать его (git commit --amend) или сделать interactive rebase. - Полезные алиасы (добавить в
~/.gitconfig):[alias] sl = stash list ss = stash save sa = stash apply
Git stash — это мощный инструмент для гибкого управления рабочим процессом, позволяющий сохранять контекст и быстро реагировать на изменения в priorities проекта.