所以很久以前,我在我的项目中添加了一个包含一组文件的文件夹 abc,并使用修订 xyz 进行了提交。在多次提交后,有人使用 git rm -r abc 删除了该文件夹。在此之后,也有很多提交。
现在我需要取回文件夹 abc。我愿意
git revert xyz
在此之后,我可以找到文件夹 xyz,但并非所有在提交 xyz 中添加的文件都存在。
我究竟做错了什么?我不想重置,因为我想保留提交 xyz 和现在之间的历史记录。
所以很久以前,我在我的项目中添加了一个包含一组文件的文件夹 abc,并使用修订 xyz 进行了提交。在多次提交后,有人使用 git rm -r abc 删除了该文件夹。在此之后,也有很多提交。
现在我需要取回文件夹 abc。我愿意
git revert xyz
在此之后,我可以找到文件夹 xyz,但并非所有在提交 xyz 中添加的文件都存在。
我究竟做错了什么?我不想重置,因为我想保留提交 xyz 和现在之间的历史记录。
你真正想要的是:
git checkout xyz -- abc
这就是说“让我得到 path 的东西的版本abc
,就像它在提交中一样xyz
”。这样,您的文件夹将恢复到您提交的状态,但您不会触及任何其他可能已被修改的文件。
(--
如果您明确指定提交,则不需要,除非提交的名称恰好也是您项目中的文件名。例如,如果您尝试检查HEAD
从指向的提交master
,你需要做git checkout master -- HEAD
。[只是节省自己的时间,不要命名你的分支和标记与你的文件相同的东西。])
您不想要,因为那是为了创建与其他提交相反的提交,而且您git revert xyz
显然不想在一开始就反转添加文件。
git revert xyz
不会将您的代码恢复到它在修订时的状态xyz
- 它会创建一个新的提交来撤消在xyz
. 您可以尝试git cherry-pick --no-commit xyz
,这将重播在 中完成的更改xyz
(如果您省略--no-commit
,它将自动成为新的提交,但也许您不希望在 中完成的所有内容xyz
)。