如何通过创建补丁将文件夹还原为特定的提交


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之间创建仅应用于某些文件夹的差异/补丁,然后应用该补丁。我怎样才能做到这一点?

Answers:


155

您可以使用git checkout将存储库更新为特定状态。

git checkout e095 -- somefolder

至于您关于生成差异的问题,那也可以。只需生成差异即可从当前状态返回到e095

git diff 89cd..e095 -- somefolder

30
这不会删除在该提交中添加的文件,请git reset e095 -- some/folder改用
shime

2
从git 2.22开始,您可以使用--no-overlaygit checkout以便删除那些不在签出中的跟踪文件。
Mariusz Pawelski

53

您可以使用git reset来重置索引,该索引还将包括删除在较新的提交中添加的文件(仅凭git checkout它自己不会这样做):

git reset e095 -- somefolder

但是git reset不会更新工作副本,并且该--hard选项不适用于文件夹。因此,使用git checkout来使工作副本与索引相同:

git checkout -- somefolder

然后,如果您还想删除添加的任何文件,则还需要执行以下操作:

git clean -fd somefolder

当目录包含新文件时,此答案对我有用。
Yahoho

2
如果您当时确实想要存储库的完整快照,那么此答案会更好。
数据公主

确实好得多!
Alexis Pautrot,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.