为什么git不能通过path进行硬/软重置?
$ git reset -- <file_path>
可以通过path重置。
但是, $ git reset (--hard|--soft) <file_path>
会报告如下的错误:
Cannot do hard|soft reset with paths.
因为没有意义(其他命令已经提供了这个function),并且减less了偶然错误操作的可能性。
一个path的“硬重置”就是用git checkout HEAD -- <path>
(检出文件的现有版本)完成的。
一个path的软重置没有意义。
path的混合重置是git reset -- <path>
所做的。
你可以使用git checkout HEAD <path>
来完成你正在做的事情。
也就是说,提供的错误信息对我来说没有任何意义(因为git reset
在子目录上工作得很好),我没有看到为什么git reset --hard
不应该完全按照你的要求去做。
问题已经得到解答 ,我将解释为什么部分。
那么, git reset会做什么? 根据指定的参数,它可以做两件事:
-
如果指定了一个path,它将使用提交中的文件(默认为HEAD)replace索引中的匹配文件。 这个动作根本不影响工作树,通常用作git add的反义词。
-
如果不指定path,则将当前分支头移动到指定的提交,并且可以将索引和工作树重置为提交的状态。 这个额外的行为是由模式参数控制的:
– 软 :不要触摸索引和工作树。
– 混合 (默认):重置索引而不是工作树。
–hard :重置索引和工作树。
还有其他选项,请参阅完整列表和一些使用案例的文档。当你不指定提交时,它默认为HEAD,所以
git reset --soft
将不会执行任何操作,因为它是将头移到HEAD(到当前状态)的命令。 另一方面,由于其副作用 ,git reset --hard
是有意义的,它表示将头移到HEAD 并将索引和工作树重置为HEAD。我想现在应该清楚为什么这个操作不是针对特定文件的本质 – 它首先打算移动分支头,重新设置工作树,索引是次要function。
git reset –soft HEAD〜1 filename取消提交,但更改保留在本地。 文件名可以是 – 对于所有提交的文件