Как вернуть папку в конкретную фиксацию, создав патч

Здесь моя история для папки "somefolder"

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Я хочу вернуть некоторую папку обратно в "Исправленные ошибки в некоторой папке".

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

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

Ответ 1

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

git checkout e095 -- somefolder

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

git diff 89cd..e095 -- somefolder

Ответ 2

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

git reset e095 -- somefolder

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

git checkout -- somefolder

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

git clean -fd somefolder