Заставить 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

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.