В чем разница между stage (индекс) и stash в Git?

«В чем разница между stage (индекс) и stash в Git?» — вопрос из категории CI/CD и DevOps, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Git Stage (Индекс)

  • Назначение: Точный контроль над тем, какие изменения попадут в следующий коммит.
  • Команды: git add, git restore --staged.
  • Жизненный цикл: Изменения остаются в индексе, пока не будут закоммичены или убраны оттуда.
  • Пример:
    # Подготовить к коммиту только файл A
    git add file_a.txt
    # Проверить статус (file_a.txt — в stage, file_b.txt — нет)
    git status

Git Stash

  • Назначение: Временно отложить все текущие изменения (как staged, так и unstaged), чтобы очистить рабочую директорию.
  • Команды: git stash, git stash pop, git stash list.
  • Жизненный цикл: Изменения сохраняются в отдельном списке и могут быть применены позже в любой ветке.
  • Пример:
    # Сохранить ВСЕ текущие изменения в stash и очистить рабочую директорию
    git stash -u
    # Переключиться на другую ветку для срочного исправления
    git checkout main
    # Вернуться и восстановить отложенные изменения
    git checkout feature
    git stash pop

Ключевое отличие: Stage — это «черновик коммита», а Stash — «временная полка» для всей незавершённой работы.