Git revert未恢复先前的状态

Git revert未恢复先前的状态,git,git-revert,Git,Git Revert,所以很久以前,我在我的项目中添加了一个包含一组文件的文件夹abc,并使用修订版xyz进行了提交。 在多次提交之后,有人用git rm-r abc擦除了文件夹。 在这之后,也有很多的承诺 现在我需要取回文件夹abc。我知道 git revert xyz 在此之后,我可以找到文件夹xyz,但不是提交xyz中添加的所有文件都存在 我做错了什么?我不想重置,因为我想保留提交xyz和当前之间的历史记录。git revert xyz不会将代码恢复到修订时的状态xyz-它会创建一个新的提交,以撤消在xyz中

所以很久以前,我在我的项目中添加了一个包含一组文件的文件夹abc,并使用修订版xyz进行了提交。 在多次提交之后,有人用git rm-r abc擦除了文件夹。 在这之后,也有很多的承诺

现在我需要取回文件夹abc。我知道

git revert xyz
在此之后,我可以找到文件夹xyz,但不是提交xyz中添加的所有文件都存在


我做错了什么?我不想重置,因为我想保留提交xyz和当前之间的历史记录。

git revert xyz
不会将代码恢复到修订时的状态
xyz
-它会创建一个新的提交,以撤消在
xyz
中执行的任何操作。您可以尝试
git cherry pick--no commit xyz
,它将重放在
xyz
中所做的更改(如果您省略
--no commit
,它将自动成为一个新的commit,但可能您不希望在
xyz
中完成的所有操作)。

您真正想要的是:

git checkout xyz -- abc
这意味着“在path
abc
中获取内容的版本,就像在commit
xyz
中一样”。这样,您将使文件夹恢复到您提交的状态,但您不会接触任何其他可能已被修改的文件

(如果要显式指定提交,则不需要使用
--
,除非提交的名称恰好也是项目中的文件名。例如,如果要从
master
指向的提交中签出名为
HEAD
的文件的版本,则需要执行
git checkout master--HEAD。)
[只需节省时间,不要将分支和标记命名为与文件相同的名称。]


你不想要git revert xyz,因为这是为了创建一个可以反转其他提交的提交,而你显然不想在一开始就反转你添加的文件。

谢谢!git checkout xyz--abc做了我想要的事情。谢谢你的澄清,我认为git revert xyz会在revisio之前还原所有的修改n xyz.@jjei-如果您真的想这样做(从xyz开始还原所有内容),那么您想要的命令是
git checkout xyz-。
(在存储库的顶层时)(或者,如果您不想擦除所有历史记录,您可以使用
git reset--hard xyz
,但这是一个潜在的危险命令。)