Git stash conflict: как разрешить конфликт при извлечении stash
Пошаговое руководство по устранению конфликтов при git stash pop/apply:stash, конфликтные файлы, отмена и безопасное извлечение.
Симптомы
- CONFLICT (content): Merge conflict в файле из stash
- git stash pop завершается ошибкой
- Файлы из stash конфликтуют с текущими изменениями
- stash apply не применяется из-за конфликтов
- Непонятно, какие изменения из stash, а какие локальные
Возможные причины
- В stash и в рабочей директории изменён один и тот же файл
- Stash содержит изменения, которые перезаписывают локальные
- Локальные коммиты изменили ту же строку, что и stash
- Stash был сделан на устаревшую версию ветки
Пошаговое решение
Проверьте текущее состояние
Выполните git status для просмотра текущих изменений. Если есть незакоммиченные изменения, stash попытается объединить их с stash, что вызовет конфликты. Сначала сделайтеcommit или stash текущих изменений: git stash или git commit -m "WIP". Затем извлекайте stash: git stash pop. Это безопаснее, чемapply при конфликтах.
git status Извлеките stash с сохранением
Если stash pop вызывает конфликт, используйте git stash apply stash@{0}. Это применит stash, но не удалит его из списка. Вы сможете повторить попытку или выбрать другой stash. Послеapply исправьте конфликты, затемgit stash drop stash@{0} для удаления stash. Преимущество: stash остаётся доступным до полного разрешения конфликтов.
git stash apply stash@{0} Посмотрите содержимое 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 Разрешите конфликт вручную
При конфликте 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" Отмените 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 Используйте 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} Отмените 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.
Источники
- stackoverflow.com — проверено 02.06.2026
- git-scm.com — проверено 02.06.2026
- atlassian.com — проверено 02.06.2026
- stackoverflow.com — проверено 02.06.2026