Я не могу вернуть тайник в рабочий каталог.
Маленькая история:
Сначала я попытался протолкнуть некоторые зафиксированные изменения, но он сказал: «Нет, вы не можете, сначала потяните» ... Хорошо, тогда я извлечу что-то из GitHub, а затем отправлю свои изменения. Когда я попытался вытащить, он сказал, что у меня есть изменения, которые будут перезаписаны, и что я должен спрятать свои изменения. Хорошо, я спрятал изменения ... потянул и подтолкнул зафиксированные изменения. Но теперь я не могу восстановить незафиксированные изменения, над которыми работал.
Это ошибка:
MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash
Наверняка я еще не понимаю всех концепций git, они меня немного смущают ... может я что-то сделал не так.
Было бы здорово, если бы кто-нибудь помог мне решить эту проблему ... Я искал в Google и все остальное уже больше часа, и я еще не нашел решения.
Помощь очень ценится. Спасибо!
git stash
должен помочь быстро сделать резервную копию локальных изменений. Удаление набора файлов вручную для его восстановления прерывает поток.git stash branch
Подход в другой ответ звучит лучше, но все же гораздо более ручной , чем хотелось бы .Самый безопасный и простой способ - это снова спрятать вещи:
Впоследствии, если результат вас устраивает, вы можете позвонить
чтобы убрать ваш «безопасный» тайник.
источник
apply
вместоpop
.pop
является комбинациейapply
иdrop
, но будет только в томdrop
случае, еслиapply
сработало без конфликтов. Но да,apply
обычно безопаснее.Как упоминалось @bentolo, вы можете вручную удалить файлы, на которые он жалуется, переключить ветки, а затем вручную добавить их обратно. Но лично я предпочитаю оставаться «в рамках мерзавца».
Лучший способ сделать это - преобразовать тайник в ветку. Когда это ветвь, вы можете нормально работать в git, используя обычные методы / инструменты, связанные с ветвями, которые вы знаете и любите. На самом деле это полезный общий метод работы с тайниками, даже если у вас нет указанной ошибки. Это хорошо работает, потому что тайник - это действительно скрытая фиксация (см. PS).
Преобразование тайника в ветку
Следующее создает ветку на основе HEAD при создании тайника, а затем применяет тайник (он не фиксирует его).
Работа с "веткой тайника"
Что вы будете делать дальше, зависит от отношения между тайником и местом, где сейчас находится ваша целевая ветка (которую я назову ORIGINALBRANCH).
Вариант 1 - переустановить ветку тайника в обычном режиме (много изменений с момента тайника)
Если вы внесли много изменений в свой ORIGINALBRANCH, то вам, вероятно, лучше всего относиться к STASHBRANCH как к любому локальному филиалу. Зафиксируйте свои изменения в STASHBRANCH, переустановите его на ORIGINALBRANCH, затем переключитесь на ORIGINALBRANCH и переустановите / объедините изменения STASHBRANCH поверх него. Если есть конфликты, обработайте их как обычно (одно из преимуществ этого подхода - вы можете видеть и разрешать конфликты).
Вариант 2 - сбросить исходную ветку, чтобы она соответствовала тайнику (ограниченные изменения с момента тайника)
Если вы просто спрятали, сохранив некоторые поэтапные изменения, затем зафиксировали, и все, что вам нужно, это получить дополнительные изменения, которые не были поставлены при хранении, вы можете сделать следующее. Он вернется к исходной ветке и индексу без изменения вашей рабочей копии. Конечным результатом будут дополнительные изменения в вашей рабочей копии.
Задний план
Тайники - это ветки / теги лайков (не патчи)
PS Заманчиво думать о тайнике как о патче (точно так же, как заманчиво думать о фиксации как о патче), но на самом деле тайник - это фиксация против HEAD, когда он был создан. Когда вы применяете / pop, вы делаете что-то похожее на выбор вишни в текущей ветке. Имейте в виду, что ветки и теги на самом деле являются просто ссылками на коммиты, поэтому во многих случаях тайники, ветки и теги - это просто разные способы указания на коммит (и его историю).
Иногда требуется, даже если вы не внесли изменений в рабочий каталог
PPS, вам может понадобиться этот метод после того, как вы просто использовали stash с --patch и / или --include-untracked. Даже без изменения рабочих каталогов эти параметры могут иногда создавать тайник, который вы не можете просто применить обратно. Должен признаться, не совсем понимаю почему. См. Http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html для обсуждения.
источник
git stash show -p
там помогает сделать stash -> * patch *.Решение: вам нужно удалить файл, о котором идет речь, затем снова попытаться спрятать pop / apply, и он должен пройти. Не удаляйте другие файлы, только те, которые указаны в ошибке.
Проблема: Git иногда отстой. При запуске
git stash -u
он включает неотслеживаемые файлы (круто!), Но он не удаляет эти неотслеживаемые файлы и не знает, как применить спрятанные неотслеживаемые файлы поверх остатков (не круто!), Что действительно делает эту-u
опцию довольно бесполезной.источник
git stash -u
git stash show
. Этот ответ заставил лампочку загореться.Чтобы вместо этого применить различия кода в тайнике в качестве патча, используйте следующую команду:
источник
git stash show --patch
не содержит неотслеживаемых файлов.Это случалось со мной много раз, я прячу неотслеживаемые файлы с
git stash -u
которые в конечном итоге добавляются в репо, и я больше не могу применять спрятанные изменения.Мне не удалось найти способ принудительно
git stash pop/apply
заменить файлы, поэтому я сначала удаляю локальные копии неотслеживаемых файлов, которые были спрятаны ( будьте осторожны, так как это удалит все изменения, которые не были зафиксированы ), а затем применяю спрятанные изменения :Наконец, я использую
git status
,git diff
и другие инструменты для проверки и добавить обратно часть из удаленных файлов , если есть что - то отсутствует.Если у вас есть незафиксированные изменения, которые вы хотите сохранить, вы можете сначала создать временную фиксацию:
Используйте любые инструменты, которые вам подходят, чтобы объединить ранее зафиксированные изменения обратно в локальные файлы и удалить фиктивную фиксацию:
источник
Моя аналогичная заблокированная операция всплывающего окна была вызвана тем, что оставшиеся проигнорированы файлы (см. Файл .gitignore). Статус Git показал, что я отслеживаю и не отслеживаю, но мои действия не очищали игнорируемые файлы.
Детали: я использовал
git stash save -a
, проверил мастер, чтобы скомпилировать и увидеть исходное поведение, затем попытался вернуть все обратно, чтобы продолжить редактирование. Когда я проверил свою ветку и попытался открыть, мои проигнорированные файлы все еще были там до сохранения тайника. Это связано с тем, что проверка мастера затрагивает только зафиксированные файлы - она не стирает игнорируемые файлы. Таким образом, pop не удалось, по сути говоря, что он не хочет восстанавливать мои спрятанные игнорируемые файлы поверх файлов, которые все еще были там. К сожалению, я не смог найти способ начать с ними сеанс слияния.В конечном итоге я
git clean -f -d -x
удалял игнорируемые файлы. Интересно, что из моих ~ 30, 4 файла остались после очистки (похоронены в подкаталогах). Мне нужно выяснить, к какой категории они относятся, и что их пришлось удалить вручную.Тогда мой поп удался.
источник
Попробуй это:
git checkout stash -.
источник
Другое решение:
источник
С Git 2.14.x / 2.15 (Q3 2017), qwertzguy «s решение с 2014 года не нужно будет больше.
До третьего квартала 2017 года вам нужно было удалить соответствующий файл, а затем снова попытаться сохранить pop / apply.
В следующем выпуске Git вам не придется этого делать.
См. Commit bbffd87 (11 августа 2017 г.) Николас Мори-Шейсемартин (
nmorey
) .(Объединено Junio C Hamano -
gitster
- в коммите 0ca2f32 , 23 августа 2017 г.)источник
Самый безопасный способ спрятать
git stash -u
Это сохранит все, включая неустановленные изменения
git stash drop
после того, как вы закончите работу над ним, чтобы удалить свой "безопасный" тайник.
источник