如何通过创建补丁将文件夹回退到特定的提交版本

127

这里是我针对文件夹“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之间创建一个仅适用于某个文件夹的差异/补丁,然后应用该补丁。如何操作?

2个回答

204

您可以使用git checkout命令将您的代码库更新到特定状态。

git checkout e095 -- somefolder

关于你提出的生成差异的问题,那也可以。只需生成差异以从当前状态返回到e095:

git diff 89cd..e095 -- somefolder

40
这并不会删除在该提交中添加的文件,请使用 git reset e095 -- some/folder 来代替。 - shime
9
从 Git 2.22 开始,你可以在使用 git checkout 命令时添加 --no-overlay 参数,使得被跟踪的但不在当前检出的提交中的文件会被删除。 - Mariusz Pawelski

85

您可以使用 git reset 来重置索引,这也将包括删除在更近的提交中添加的文件(git checkout 独立使用不会执行此操作):

您可以使用 git reset 来重置索引,并删除最近提交中添加的文件(git checkout 单独使用不会删除文件):

git reset e095 -- somefolder

不过,git reset 不会更新工作副本,--hard 选项也无法用于文件夹。因此,使用 git checkout 将工作副本与索引相同:

git checkout -- somefolder

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

git clean -fd somefolder

当目录包含新文件时,这个答案对我有效。 - Yahoho
3
如果你真的想要一个干净的仓库快照,那么这个答案会更好。 - data princess
确实好多了! - Alexis Pautrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接