如何通过创建修补程序将文件夹还原到特定提交

hit*_*ory 90 git

这是我的文件夹'somefolder'的历史

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder
Run Code Online (Sandbox Code Playgroud)

我想将一些文件夹还原为"在某个文件夹中修复的错误"提交.

由于第二次提交涉及到某些文件夹之外的更改,因此我不想还原此提交.

我想最安全的方法是在commit e095和89cd之间创建一个仅适用于某个文件夹的diff/patch,然后应用该补丁.我怎样才能做到这一点?

jam*_*san 140

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

git checkout e095 -- somefolder
Run Code Online (Sandbox Code Playgroud)

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

git diff 89cd..e095 -- somefolder
Run Code Online (Sandbox Code Playgroud)

  • 这不会删除在该提交中添加的文件,而是使用`git reset e095 - some/folder` (28认同)
  • 从 git 2.22 开始,您可以使用 [`--no-overlay`](https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt---no-overlay) 进行 `git checkout ` 以便删除您要检出的未提交的跟踪文件。 (3认同)

Mat*_*ett 42

您可以使用git reset重置索引,该索引还将包括删除在最近提交中添加的文件(git checkout在它自己不执行此操作时):

git reset e095 -- somefolder
Run Code Online (Sandbox Code Playgroud)

但是git reset,不更新工作副本,该--hard选项不适用于文件夹.然后使用git checkout使工作副本与索引相同:

git checkout -- somefolder
Run Code Online (Sandbox Code Playgroud)

然后,如果你还想删除任何添加的文件,你还需要todo:

git clean -fd somefolder
Run Code Online (Sandbox Code Playgroud)

  • 如果您当时真的想要一个干净的存储库快照,那么这个答案要好得多. (2认同)