#Как выглядит неисправность
После git stash pop появляются маркеры конфликтов. При конфликте Git обычно сохраняет запись stash, поэтому повторный pop может повторно наложить те же правки.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сохранённые изменения затрагивают те же строкиТекущая ветка изменилась после создания stash | unmerged paths и конфликтные маркеры | Объединить нужные строки вручную |
| У stash был собственный индексСохранённые staged-изменения не совпали с текущим индексом | Ошибка применения --index | Проверить отдельные изменения в stash перед восстановлением |
#Пошаговое устранение
- 1. Не повторяйте pop вслепуюОткройте терминал в репозитории, выполните git status и git stash list. При конфликте, как правило, stash@{0} остаётся в списке. Запишите его сообщение и не удаляйте запись.
- Чтение состояния; в PowerShell при адресации stash лучше заключать ссылку в кавычкиLinux · Терминал (Bash)КомандаЧтение состояния; в PowerShell при адресации stash лучше заключать ссылку в кавычки.
git statusgit stash list
- 2. Посмотрите сохранённые измененияВыполните git stash show -p "stash@{0}" и проверьте, какие файлы и строки нужны. В выводе могут встречаться секреты; не публикуйте журнал. Если важен набор неотслеживаемых файлов, покажите его с соответствующим параметром --include-untracked.
- Показывает патч из stash, не меняет файлыLinux · Терминал (Bash)КомандаПоказывает патч из stash, не меняет файлы.
git stash show -p "stash@{0}"
- 3. Получите список нерешённых файловКоманда git diff --name-only --diff-filter=U перечислит конфликтные пути. Откройте каждый, сравните секции <<<<<<<, =======, >>>>>>> с ожидаемой логикой и сохраните слитый результат. Если не понимаете, что оставить, используйте копии и обратитесь к владельцу изменений.
- Безопасная диагностикаLinux · Терминал (Bash)КомандаБезопасная диагностика.
git diff --name-only --diff-filter=U
- 4. Завершите ручное разрешениеУдалите маркеры, запустите тест проекта, затем git add -- path/to/file для каждого исправленного файла. Для stash pop не нужно запускать git rebase --continue или git merge --continue: это не самостоятельный rebase/merge.
- Меняет индекс указанного файла; Git status должен не показывать unmerged pathsLinux · Терминал (Bash)С осторожностьюМеняет индекс указанного файла; Git status должен не показывать unmerged paths.
git add -- path/to/filegit statusКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Убедитесь в сохранности stashСравните восстановленные правки через git diff --cached и git diff и проверьте git stash list. Только после подтверждения и сохранения важных изменений решайте, нужен ли старый stash; удаление — отдельное необязательное действие.
- 6. Если конфликтов слишком многоСоздайте копию рабочей папки с текущими правками. В копии всего репозитория вместе с его .git можно использовать git stash branch с сохранённой записью stash на исходной основе; убедитесь, что эта запись действительно существует в копии. Не делайте reset --hard в основном проекте.
#Как проверить результат
После исправлений git status не показывает unmerged paths, нужный код на месте, тесты проходят; stash оставлен до уверенности в сохранности данных.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.