How to restore a whole directory from history of git repository?

我想从我的 git 存储库的历史中(递归地)恢复一个完整的目录。

只有一个分支(主人)。

我知道包含错误的提交。

我是否可以使用父提交的 sha1散列来恢复目录的状态,就像包含错误之前那样?

我想过这样的事情:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

但是没有成功。

76985 次浏览

有两种简单的方法可以做到这一点:

如果包含错误的提交包含错误 只有,则使用 git revert来反转它的效果。

如果不是这样,最简单的方法是:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

If you simply do git checkout <SHA-ID> then it will temporarily move you to that sha-commit.

每个提交对象在那个时候保存整个磁盘结构,因此如果您在那里有文件并且需要将它们复制出来,您可以这样做。但是警告,您将不在任何分支中,因此必须在将文件复制到工作树并提交之前移回 master。

尝试在修订和路径之间添加“——”:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/

如果你想从前一次提交中恢复一个目录,你可以用 HEAD ~ 1代替提交散列,例如:

git checkout HEAD~1 -- path/to/the/folder/
git checkout -- path/to/folder/

对于现代 git (-s--source) :

git restore -s commit-sha-that-contains-dir relative/path/to/folder

man reference:

-s <tree>, --source=<tree>
Restore the working tree files with the content from the given tree. It is common to specify
the source tree by naming a commit, branch or tag associated with it.


If not specified, the contents are restored from HEAD if --staged is given, otherwise from the index.


As a special case, you may use "A...B" as a shortcut for the merge base of A and B if there
is exactly one merge base. You can leave out at most one of A and B, in which case it
defaults to HEAD.

可以执行 git checkout master -- path/to/the/folder-you-want-to-restore/以从 master分支恢复本地分支上的目录或文件。