Почему нельзя применить stash к рабочему каталогу?
Я не могу применить stash обратно к рабочему каталогу.
Маленькая история:
Сначала я попытался выдвинуть некоторые зафиксированные изменения, но он сказал: "Нет, ты не можешь, сначала потяни"... Хорошо, тогда я извлечу вещи из GitHub, а затем отправлю свои изменения. Когда я попытался вытащить, он сказал, что у меня есть изменения, которые будут перезаписаны, и что я должен спрятать свои изменения. Хорошо, я спрятал изменения... сделал тянуть, и подтолкнул зафиксированные изменения. Но теперь я не могу восстановить незафиксированные изменения, над которыми я работал.
Это ошибка:
MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash
Конечно, я еще не понимаю всех понятий git, они меня немного смущают... может быть, я сделал что-то не так.
Было бы здорово, если бы кто-нибудь мог помочь мне решить эту проблему... Я искал в Google и во всем больше часа, и пока не нашел решения.
Помощь очень ценится. Спасибо!
Ответы
Ответ 1
Похоже, что ваш кошелек включал неиспользуемый файл, который впоследствии был добавлен в репо. Когда вы попытаетесь проверить это, git справедливо отказывается, потому что это будет переписывать существующий файл.
Чтобы исправить, вы могли бы сделать что-то вроде удаления этого файла (все в порядке, он все еще находится в репо), применяя ваш кошелек, а затем заменяя сохраненную версию файла версией в репо.
Изменить: Также возможно, что файл был создан только в рабочем дереве без добавления в репо. В этом случае не просто удалите локальный файл, а скорее:
- переместить его в другое место
- применить кэш
- вручную объединить две версии файлов (рабочее дерево и перемещение).
Ответ 2
Самый безопасный и простой способ, вероятно, снова будет замалчиваться:
git stash -u # This will stash everything, including unstaged files
git stash pop [email protected]{1} # This will apply your original stash
Затем, если вы довольны результатом, вы можете позвонить
git stash drop
чтобы удалить ваш "безопасный" тайник.
Ответ 3
Как уже упоминалось @blahdiblah, вы можете вручную удалить файлы, на которые он жалуется, переключить ветки, а затем вручную добавить их обратно. Но я лично предпочитаю оставаться "внутри git".
Лучший способ сделать это - конвертировать тайник в ветку. Когда это ветка, вы можете нормально работать в git, используя обычные методы/инструменты, связанные с веткой, которые вы знаете и любите. Это на самом деле полезный общий метод работы с записями, даже если у вас нет указанной ошибки. Это хорошо работает, потому что на самом деле это кошелек под крышками (см. PS).
Преобразование тайника в ветку
Ниже создается ветвь, основанная на HEAD, когда был создан stash, а затем применяет тайник (он не фиксирует его).
git stash branch STASHBRANCH
Работа с "ветвью штампа"
То, что вы делаете дальше, зависит от взаимосвязи между косой чертой и где ваша целевая ветка (которую я назову ORIGINALBRANCH) теперь.
Вариант 1 - Обычно разблокировать ветвь штемпеля (много изменений с момента заполнения)
Если вы внесли много изменений в свой ORIGINALBRANCH, то вы, вероятно, лучше всего относитесь к STASHBRANCH, как к любой локальной ветке. Зафиксируйте свои изменения в STASHBRANCH, перезапустите его на ORIGINALBRANCH, затем переключитесь на ORIGINALBRANCH и переустановите/объедините изменения STASHBRANCH над ним. Если есть конфликты, то обрабатывайте их нормально (одним из преимуществ этого подхода является просмотр и разрешение конфликтов).
Вариант 2 - Reset исходная ветвь для соответствия тире (ограниченные изменения с момента заполнения)
Если вы просто спрятались при сохранении некоторых поэтапных изменений, затем зафиксировали, и все, что вы хотите сделать, это получить дополнительные изменения, которые, когда они не были поставлены, когда вы спрятались, можете сделать следующее. Он вернется к исходной ветке и индексу без изменения рабочей копии. Конечным результатом будут ваши дополнительные изменения в вашей рабочей копии.
git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset
Фон
Штампы коммиты любят ветки/теги (не патчи)
PS. Заманчиво задуматься о том, что в качестве патча запирается (как и соблазн думать о фиксации как патче), но прикрытие - это на самом деле фиксация против HEAD, когда она была создана. Когда вы применяете/поп, вы делаете что-то похожее на вишневую подборку в вашу текущую ветку. Имейте в виду, что ветки и теги - это просто ссылки на коммиты, поэтому во многих случаях замаскивания, ветки и теги - это просто разные способы указания на фиксацию (и ее историю).
Иногда требуется, даже если вы не изменили рабочие каталоги
PPS, вам может понадобиться этот метод после использования stash с --patch и/или --include-untracked. Даже без изменения рабочих каталогов эти параметры иногда могут создавать кошельки, которые вы не можете просто применить обратно. Я должен признать, что не понимаю, почему. См. http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html для обсуждения.
Ответ 4
Решение: вам нужно удалить указанный файл, а затем попытаться снова нажать "всплывать" / "применить", и он должен пройти. Не удаляйте другие файлы, только те, которые указаны в этой ошибке.
Проблема: Git иногда отстой. При запуске git stash -u
он включает в себя неископанные файлы (круто!), Но не удаляет эти необработанные файлы, а не умеет знать, как применять скрытые не проверенные файлы поверх остатки (не здорово!), что действительно делает параметр -u
довольно бесполезным.
Ответ 5
Чтобы вместо этого применить различия кода в stashе как патч, используйте следующую команду:
git stash show --patch | patch -p1
Ответ 6
Это случалось со мной много раз, я хранил неотслеживаемые файлы с git stash -u
, которые в итоге были добавлены в репозиторий, и я больше не могу применять спрятанные изменения.
Я не смог найти способ заставить git stash pop/apply
заменить файлы, поэтому я сначала удаляю локальные копии неотслеживаемых файлов, которые были сохранены (будьте осторожны, так как это приведет к удалению любых изменений, которые не были зафиксированы) и примените скрытые изменения:
rm 'git ls-tree -r [email protected]{0}^3 --name-only'
git stash apply
Наконец, я использую git status
, git diff
и другие инструменты, чтобы проверять и добавлять обратно части из удаленных файлов, если чего-то не хватает.
Если у вас есть незафиксированные изменения, которые вы хотите сохранить, вы можете сначала создать временную фиксацию:
git add --all
git commit -m "dummy"
rm 'git ls-tree -r [email protected]{0}^3 --name-only'
git stash apply
Используйте любые инструменты, которые вам подходят, чтобы объединить ранее зафиксированные изменения в локальные файлы и удалить фиктивную фиксацию:
git reset HEAD~1
Ответ 7
Моя аналогичная блокировка поп-операции состояла в том, что оставшиеся игнорировались файлы (см. файл .gitignore). Статус Git показал, что я отслеживал и не отслеживал, но мои действия не очищали проигнорированные файлы.
Детали: Я использовал git stash save -a
, проверил мастер для компиляции и просмотра оригинального поведения, а затем попытался вернуть все, чтобы продолжить редактирование. Когда я проверил свою ветку и попытался попсу, мои проигнорированные файлы все еще были там до сохранения сохранения. Это связано с тем, что проверка хозяина затрагивала только зафиксированные файлы - он не уничтожал проигнорированные файлы. Таким образом, поп не удалось, по сути говоря, он не хотел восстанавливать мои скрытые игнорируемые файлы поверх файлов, которые все еще были там. К сожалению, я не мог понять, как начать слияние с ними.
В конечном итоге я использовал git clean -f -d -x
для удаления игнорируемых файлов. Интересно, что из моих ~ 30, 4 файлов все еще осталось после очистки (похоронен в подкаталогах). Мне нужно выяснить, в какой категории они находятся, что их нужно вручную удалить.
Затем моя попка преуспела.
Ответ 8
Попробуйте это:
git checkout stash.
Ответ 9
Другое решение:
cd to/root/your/project
# Show what git will be remove
git clean -n
# If all is good
git clean -f
# If not all is good, see
git clean --help
# Finish
git stash pop
Ответ 10
С Git 2.14.x/2.15 (Q3 2017), qwertzguy от 2014 больше не потребуется.
До Q3 2017 вам пришлось удалить файл, о котором идет речь, а затем попытаться снова нажать pop/apply.
При следующем выпуске Git вам не придется этого делать.
См. commit bbffd87 (11 августа 2017 г.) Nicolas Morey -Chaisemartin (nmorey
).
(слияние Junio C Hamano - gitster
- в совершить 0ca2f32, 23 августа 2017 г.
stash
: очистить незатребованные файлы до reset
При вызове git stash -u
в репо, который содержит файл, который не является больше игнорируется из-за текущей модификации файла gitignore
этот файл спрятан, но не удаляется из рабочего дерева.
Это связано с тем, что git-stash
сначала выполняет reset --hard
, который очищает .gitignore
, а затем вызовите git clean
, оставив файл нетронутым.
Это приводит к ошибке git stash pop
из-за существующего файла.
Этот патч просто переключает порядок между очисткой и сбросом и добавляет тест для этой утилиты.
Ответ 11
Самый безопасный путь к следующему тиснению
git stash -u
Это будет сбрасывать все, включая неустановленное изменение
git отсечка
после того, как вы закончите работу над ним, чтобы удалить ваш "безопасный" тайник.