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

В чем разница между stash и patch в Git?

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

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

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

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

Различие между git stash и git patch в Git

В Git git stash и создание патчей (patch) — это два разных механизма работы с изменениями, но оба позволяют временно сохранить модификации файлов. Ключевая разница заключается в цели, способе хранения и дальнейшем использовании.

📦 Git Stash: Быстрое временное хранилище изменений

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

Основные характеристики:

  • Локальное хранение: Stash'и хранятся только в локальном репозитории (в .git/refs/stash). Они не передаются при push/pull.
  • Простота использования: Одна команда git stash сохраняет все изменения, git stash pop — возвращает последние.
  • Стековая структура: Можно иметь несколько stash'ей, управляя ими через git stash list, git stash apply, git stash drop.
  • Контекст: Сохраняет не только изменения файлов, но и состояние индекса (проиндексированные файлы) и неотслеживаемых файлов (с флагом -u).

Пример использования stash:

# 1. Сохранить текущие изменения и очистить рабочую директорию
git stash save "Работа над функцией X"

# 2. Переключиться на другую ветку, сделать срочный фикс
git checkout main
git checkout -b hotfix
# ... вносим изменения ...
git commit -m "Срочный фикс"

# 3. Вернуться к исходной ветке и восстановить изменения
git checkout feature-branch
git stash pop

📄 Git Patch: Файл с описанием изменений для переноса

Патч — это текстовый файл в формате diff (обычно с расширением .patch), который содержит описание различий между коммитами, ветками или состояниями рабочего каталога. Патч — это универсальный способ передать изменения вне системы контроля версий (например, по почте) или применить их к другому репозиторию.

Основные характеристики:

  • Портативность: Патч — это обычный текстовый файл, который можно отправить кому угодно и применить в любом репозитории, где актуальна та же кодовая база.
  • Гибкость создания: Можно создать из любых различий: между коммитами, между рабочей директорией и индексом и т.д.
  • Явное применение: Патч не применяется автоматически — нужно использовать git apply или git am.
  • Два основных формата:
    * **Независимый diff (`git diff > changes.patch`)**: Создается командой `git diff`. Применяется через `git apply`. Не содержит информации о коммите (автор, сообщение).
    * **Патч с метаданными коммита (`git format-patch`)**: Создается командой `git format-patch`. Содержит полную информацию о коммите (автор, дата, сообщение). Применяется через `git am`, который создает новый коммит.

Пример создания и применения патча:

# 1. Создать патч из последнего коммита
git format-patch HEAD~1 --stdout > my_feature.patch

# 2. Или создать патч из незакоммиченных изменений
git diff > unstaged_changes.patch

# 3. Применить патч (без создания коммита)
git apply unstaged_changes.patch

# 4. Применить патч с форматом format-patch (с созданием коммита)
git am my_feature.patch

🔍 Сводка ключевых различий

Критерийgit stashgit patch
Основное назначениеВременное локальное сохранение изменений для быстрого переключения контекстаПеренос изменений между репозиториями или ветками через файл
ХранениеВнутри .git директории (локальный стек)Отдельный текстовый файл (.patch)
ПереносимостьТолько в рамках локального репозиторияВысокая, файл можно передать куда угодно
Метаданные коммитаНе сохраняет (только изменения файлов)git format-patch сохраняет автора, сообщение и дату
Типичное применение"Отложить" текущую работу, чтобы пофиксить баг в другой веткеОтправить изменения коллеге по email или внести в другой клон репозитория
Командыstash, pop, apply, listdiff, format-patch, apply, am

💡 Когда что использовать?

Используйте git stash, когда:

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

Используйте патчи, когда:

  • Нужно передать изменения человеку, у которого нет доступа к вашему репозиторию.
  • Хотите предложить изменения в открытый проект через email (как в Linux kernel).
  • Требуется применить одни и те же изменения к нескольким разным веткам или репозиториям.
  • Нужно создать архив изменений для документации или code review вне Git.

Оба подхода можно комбинировать: например, создать stash, затем из него сгенерировать патч для отправки коллеге:

git stash
git stash show -p > my_changes.patch
# Отправляем файл my_changes.patch

Таким образом, stash — это инструмент для локального управления временными изменениями, а patchуниверсальный формат для обмена изменениями между разработчиками и системами.

В чем разница между stash и patch в Git? | PrepBro