Разработка 7 мин чтения

Git stash conflict: как разрешить конфликт при извлечении stash

Пошаговое руководство по устранению конфликтов при git stash pop/apply:stash, конфликтные файлы, отмена и безопасное извлечение.

Gitstashконфликтmergeразрешение конфликтов

Симптомы

  • CONFLICT (content): Merge conflict в файле из stash
  • git stash pop завершается ошибкой
  • Файлы из stash конфликтуют с текущими изменениями
  • stash apply не применяется из-за конфликтов
  • Непонятно, какие изменения из stash, а какие локальные

Возможные причины

  • В stash и в рабочей директории изменён один и тот же файл
  • Stash содержит изменения, которые перезаписывают локальные
  • Локальные коммиты изменили ту же строку, что и stash
  • Stash был сделан на устаревшую версию ветки

Пошаговое решение

1

Проверьте текущее состояние

Выполните git status для просмотра текущих изменений. Если есть незакоммиченные изменения, stash попытается объединить их с stash, что вызовет конфликты. Сначала сделайтеcommit или stash текущих изменений: git stash или git commit -m "WIP". Затем извлекайте stash: git stash pop. Это безопаснее, чемapply при конфликтах.

Команда
git status
2

Извлеките stash с сохранением

Если stash pop вызывает конфликт, используйте git stash apply stash@{0}. Это применит stash, но не удалит его из списка. Вы сможете повторить попытку или выбрать другой stash. Послеapply исправьте конфликты, затемgit stash drop stash@{0} для удаления stash. Преимущество: stash остаётся доступным до полного разрешения конфликтов.

Команда
git stash apply stash@{0}
3

Посмотрите содержимое stash

До извлечения проверьте, что stash содержит:git stash show stash@{0} -p (детальный diff) или git stash show stash@{0} --stat (список файлов). Это покажет, какие файлы были изменены. Если конфликтный файл уже изменён локально, решите: (1) сделать commit текущих изменений, (2) отменить локальные изменения, (3) применить stash и исправить конфликты.

Команда
git stash show stash@{0} -p
4

Разрешите конфликт вручную

При конфликте Git вставит маркеры `<<<<<<<`, `=======`, `>>>>>>>` в конфликтные файлы. Откройте файл и выберите нужную версию: локальную или из stash. Удалите все маркеры. Сохраните файл. Добавьте в индекс: git add имя-файла. После разрешения всех конфликтов сделайте commit: git commit -m "Resolved stash conflict". Stash останется в списке до git stash drop.

Команда
git add resolved-file.txt && git commit -m "Resolved stash conflict"
5

Отмените stash pop при ошибке

Если git stash pop завершился конфликтом, Git автоматически НЕ удаляет stash (в отличие от успешного pop). Проверьте git stash list — stash должен остаться. Если stash был удалён (поп неудачен на старых версиях Git), восстановите:git fsck --unreachable | grep commit. Затемgit stash apply коммит-хеш. В modern Git stash остаётся при неудачном pop.

Команда
git stash list
6

Используйте git stash branch

Безопасный способ — создать ветку из stash: git stash branch new-branch stash@{0}. Это создаст новую ветку от коммита, на котором был сделан stash, и применит stash. Конфликты будут в контексте этой ветки, не затрагивая основную работу. После разрешения конфликтов слейте ветку: git checkout main && git merge new-branch.

Команда
git stash branch new-branch stash@{0}
7

Отмените stash без извлечения

Если stash больше не нужен, удалите его: git stash drop stash@{0}. Для удаления всех stash: git stash clear. Осторожно: git stash clear удаляет ВСЕ stash безвозвратно. Если нужно посмотреть stash перед удалением:git stash list и git stash show stash@{0}. Удаляйте stash после успешногоapply или commit.

Команда
git stash list && git stash drop stash@{0}

Git stash сохраняет незакоммиченные изменения в “стек” и очищает рабочую директорию. При извлечении stash (git stash pop) могут возникнуть конфликты, если stash и текущая ветка изменили одни и те же строки файла.

Разница между stash pop и stash apply

git stash pop применяет stash и удаляет его из списка. git stash apply применяет, но НЕ удаляет. При конфликте pop оставляет stash в списке (в modern Git), ноapply безопаснее: вы можете повторить попытку. Рекомендация: используйте apply до тех пор, пока не убедитесь, что конфликтов нет.

Проверка состояния репозитория

Выполните git status для просмотра текущего состояния.git log —oneline -10 покажет последние 10 коммитов. git remote -v — URL удалённого репозитория. Если репозиторий повреждён: git fsck —full. Это проверит целостность объектов Git.

Откат изменений

Для отката незакоммиченных изменений: git checkout — имя-файла. Для отката коммита: git revert КОММИТ (создаёт новый коммит, отменяющий изменения). Для опасного отката: git reset —hard КОММИТ (перезаписывает историю). Используйтеgit reflog для поиска потерянных коммитов.

Работа с ветками

Список веток: git branch -a. Создание: git branch имя-ветки. Переключение: git checkout имя-ветки (или git switch). Слияние: git merge имя-ветки. Удаление: git branch -d имя-ветки (безопасное) или git branch -D (принудительное). Переименование: git branch -m старое имя новое.

Настройка удалённого репозитория

Проверьте URL: git remote -v. Измените: git remote set-url origin URL. Добавьте: git remote add upstream URL. Скачайте изменения: git fetch origin. Загрузите: git pull origin ветка. Отправьте: git push origin ветка. Для первого push: git push -u origin ветка (установит tracking).

Разрешение конфликтов

При конфликте: git status покажет конфликтные файлы. Откройте файл, найдите маркеры <<<<<<<, =======, >>>>>>>. Выберите нужную версию, удалите маркеры. Добавьте: git add имя-файла. Завершите: git commit. Для отмены слияния: git merge —abort. Для использования инструмента: git mergetool.

Источники

  1. stackoverflow.com — проверено 02.06.2026
  2. git-scm.com — проверено 02.06.2026
  3. atlassian.com — проверено 02.06.2026
  4. stackoverflow.com — проверено 02.06.2026