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

Что такое git stash?

1.3 Junior🔥 241 комментариев
#Опыт и софт-скиллы

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Что такое Git Stash?

Git stash — это команда Git, которая позволяет временно сохранить незакоммиченные изменения (как в рабочем каталоге, так и в индексе/staging area) в специальное хранилище, чтобы вы могли вернуться к чистому состоянию рабочей директории. Это особенно полезно, когда вам нужно быстро переключиться на другую задачу, ветку или исправить срочный баг, не коммитя незавершённую работу.

Проще говоря, git stash — это "отложить в сторону" текущие правки, чтобы позже к ним вернуться.

Основные варианты использования

  • Смена контекста: Переключиться на другую ветку для срочного исправления, не теряя текущие наработки.
  • Сохранение "грязного" состояния: Временное сохранение изменений перед выполнением операций, требующих чистого рабочего каталога (например, git merge, git rebase, git pull).
  • Эксперименты: Сохранить текущее состояние, чтобы попробовать альтернативное решение, с возможностью легко откатиться.

Базовые команды и их действие

  1. Создание stash:

    git stash
    

    Сохраняет все отслеживаемые изменения (modified и staged) в новый stash-объект и откатывает рабочий каталог к состоянию последнего коммита. По умолчанию stash не включает неотслеживаемые (untracked) файлы и игнорируемые.

  2. Сохранение с неотслеживаемыми файлами:

    git stash -u  # или --include-untracked
    

    Добавляет в stash и неотслеживаемые файлы (новые файлы, ещё не добавленные в Git).

  3. Сохранение ВСЕГО (включая игнорируемые файлы):

    git stash -a  # или --all
    

    Редко используется, но может быть полезно для полного резервного копирования состояния.

  4. Просмотр списка stash'ей:

    git stash list
    

    Выводит список всех сохранённых stash-записей в формате stash@{n}: ветка: сообщение-коммита. Каждый stash имеет уникальный индекс (например, stash@{0} — самый последний).

  5. Применение stash:

    git stash apply  # применяет последний stash, но не удаляет его из списка
    git stash apply stash@{2}  # применяет конкретный stash
    

    Изменения из stash накладываются на текущую рабочую директорию. Могут возникнуть конфликты, если текущее состояние изменилось.

  6. Применение и удаление из списка:

    git stash pop  # применяет последний stash и удаляет его из списка
    git stash pop stash@{1}
    

    Удобно, когда stash больше не нужен.

  7. Удаление stash:

    git stash drop stash@{0}  # удаляет конкретный stash
    git stash clear  # удаляет ВСЕ stash'и
    
  8. Создание 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 проекта.

Что такое git stash? | PrepBro