Как вернуть папку к определенному коммиту, создав патч

97

Вот моя история для папки somefolder

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Я хочу вернуть какую-то папку обратно к фиксации «Ошибки, исправленные в какой-то папке».

Поскольку вторая фиксация включала изменения вне какой-либо папки, я не хочу отменять эту фиксацию.

Я думаю, что самым безопасным способом было бы создать разницу / патч между фиксацией e095 и 89cd, которая применяется только к какой-то папке, а затем применить этот патч. Как я могу это сделать?

Hitfactory
источник

Ответы:

156

Вы можете использовать git checkout, чтобы обновить репозиторий до определенного состояния.

git checkout e095 -- somefolder

Что касается вашего вопроса о создании разницы, это тоже сработает. Просто сгенерируйте разницу, чтобы вернуться из текущего состояния в e095:

git diff 89cd..e095 -- somefolder
Jamessan
источник
30
это не удаляет файлы, которые были добавлены в этот коммит, используйте git reset e095 -- some/folderвместо этого
shime
3
Из git 2.22 вы можете использовать --no-overlayдля, git checkoutчтобы отслеживаемые файлы, которые не находятся в фиксации, из которой вы извлекаете, будут удалены.
Mariusz Pawelski
54

Вы можете использовать git resetдля сброса индекса, который также будет включать удаление файлов, которые были добавлены в более поздние коммиты (сам git checkoutпо себе этого не делает):

git reset e095 -- somefolder

Однако git resetне обновляет рабочую копию, и --hardопция не работает с папками. Итак, используйте, git checkoutчтобы рабочая копия была такой же, как индекс:

git checkout -- somefolder

а затем, если вы также хотите удалить любые добавленные файлы, вам также необходимо сделать:

git clean -fd somefolder
Мэтью Бакетт
источник
этот ответ работает для меня, когда каталог включает новые файлы.
Yahoho
2
Этот ответ намного лучше, если вам действительно нужен чистый снимок репозитория на тот момент.
данные принцесса
Действительно, намного лучше!
Alexis Pautrot