Заставить git stash перезаписать добавленные файлы

223

У меня есть несколько файлов, которые не были отслежены в Git. Я внес некоторые изменения и хотел их зафиксировать, но понял, что забыл сначала проверить неизмененные файлы. Поэтому я спрятал файлы, а затем добавил неизмененные версии.

Затем, когда я применяю тайник к хранилищу, у меня возникают конфликты из-за уже добавленных файлов.

Как я могу применить тайник и принудительно использовать версии в тайнике по сравнению с оригиналами в хранилище?

Спасибо

Стефан
источник
7
Уродливое решение, пока кто-нибудь не придумает лучшего: удалите новые файлы, используя git rmперед этим git stash apply.
Том
Разве это не потеряет историю? Причиной добавления неизмененных версий было сохранение истории.
Стефан
1
Нет, это не потеряет историю. Если вы удалите файл, добавите его обратно с небольшой модификацией, а затем подтвердите, он gitбудет рассматриваться как небольшая модификация.
Том

Ответы:

365

Используйте git checkoutвместо git stash apply:

$ git checkout stash -- .
$ git commit

Это восстановит все файлы в текущем каталоге до их сохраненной версии.


Если есть изменения в других файлах в рабочем каталоге, которые следует сохранить, вот менее жесткая альтернатива:

$ git merge --squash --strategy-option=theirs stash

Если в индексе есть изменения или слияние коснется файлов с локальными изменениями, git откажется от слияния. Отдельные файлы могут быть извлечены из тайника с помощью

$ git checkout stash -- <paths...>

или в интерактивном режиме с

$ git checkout -p stash
Том
источник
Ни один из них не работал в моем случае использования. Результаты и мое решение здесь: stackoverflow.com/a/26685296/496046 - это должно решить и вашу ситуацию, @AlexanderBird
tremby
2
git checkout stash -- .Эта команда буквально ничего не делала, когда я ее запускал.
Rotsiser Mho
3
@RotsiserMho Git не очень хорош в предоставлении подтверждающих сообщений. Вы уверены, что это ничего не сделало? Работал нормально для меня.
Синджай,
5
Я должен был работать git checkout stash -- .в самой верхней родительской папке, содержащей мои изменения, в противном случае он применял изменения только к папке, из которой я выполнил команду.
Лев
1
@Leo: Правильно, это потому, что .указывает текущий каталог (вы можете заменить его другим путем вместо смены каталога). Я обновил свой ответ, чтобы прояснить ситуацию.
Том
13

git stash show -p | git apply

а затем, git stash dropесли вы хотите сбросить спрятанные предметы.

Хасан ТБТ
источник
2
Примечание: вы должны быть в корне хранилища, чтобы это работало правильно, иначе вы получите это .
Руслан
@PengheGeng Как вы можете видеть, я ответил примерно за год до NetEmmanuel
Hasan TBT
@Ruslan Я получаю это, находясь в корне моего репо Le
Лев
6

Чтобы принудительно git stash popзапустить эту команду

git stash show -p | git apply && git stash drop
NetEmmanuel
источник
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Длинная версия:

Вы получаете эту ошибку из-за незафиксированных изменений, которые вы хотите перезаписать. Отмените эти изменения с помощью git checkout HEAD. Вы можете отменить изменения в конкретном файле с помощью git checkout HEAD path/to/file. После устранения причины конфликта вы можете подать заявку как обычно.

User12547645
источник