Git 签出双破折号和硬重置之间有什么区别

Git 签出双破折号和硬重置之间有什么区别,git,github,Git,Github,我试图从本地存储库中删除更改。我原以为是git reset硬头造成的,但没用。只有git签出--.有帮助。它们之间的区别是什么?要确切说明这两个命令对您的更改应用不同的原因/方式,我们需要更多信息。(我所见过的每一个问题都会通过显示相关的输入和输出得到极大的改进。在这种情况下,git status在每个命令之前和之后显示了什么?) 但是好的,这些命令有何不同 当您说git reset--hard HEAD时,您告诉git您希望将当前签出的分支移动到当前签出的提交(该提交不起任何作用),然后您希望

我试图从本地存储库中删除更改。我原以为是git reset硬头造成的,但没用。只有
git签出--.
有帮助。它们之间的区别是什么?

要确切说明这两个命令对您的更改应用不同的原因/方式,我们需要更多信息。(我所见过的每一个问题都会通过显示相关的输入和输出得到极大的改进。在这种情况下,
git status
在每个命令之前和之后显示了什么?)

但是好的,这些命令有何不同

当您说
git reset--hard HEAD
时,您告诉git您希望将当前签出的分支移动到当前签出的提交(该提交不起任何作用),然后您希望更新索引和工作树以反映该提交(放弃对跟踪文件的任何最近更改)。虽然新的未跟踪文件没有更改,但任何其他更改都应该被清除——当我测试时,就是这样

当您说
git checkout--.
时,您是说应该通过从索引中复制
下的每个文件(或
的子目录)来更新工作树。这将撤消对所有跟踪文件所做的未老化更改,但仍不会触及未跟踪的文件。如果有任何更改,则此操作撤消的更改少于指定的
reset
命令,因为它不会从提交历史更新索引。同样,我的测试也符合这种记录的行为

正如我所说,没有更多的信息,我无法推测为什么你们的观察结果会有所不同。但这就是命令之间的区别。

git checkout--.
告诉git进入当前索引内容,并且对于索引中的每个文件,只要该文件位于当前目录或其下,就将该文件的版本复制到工作树中。(如果您位于存储库的顶部,则这是索引中的每个文件。)

git reset--hard HEAD
告诉git进入当前(
HEAD
)提交,将提交中的每个文件复制到索引中,并在从提交到索引的过程中,也将文件复制到工作树中。1在许多情况下,甚至是在大多数情况下,这将做同样的事情。在某些情况下,它不会这样做:这取决于当前索引内容与
标题的匹配程度

让我们举个例子。例如,假设您首先签出名为
branch
的某个分支的提示提交:

$ git clone -b branch ssh://git@github.com/path/to/some/repo.git
[the usual clone output happens here]
$ cd repo
然后您修改了一个文件(已经存在),并对结果运行了
git add

$ echo all-new-contents > README.md
$ git add README.md
$ echo also all new > COPYING
然后您修改了第二个文件(该文件也已经存在),但没有对结果运行
git add

$ echo all-new-contents > README.md
$ git add README.md
$ echo also all new > COPYING
此时的状态是
README.md
已修改,新版本在索引中,并且
file.txt
已修改,但更改不在索引中:

$ git status --short
 M COPYING
M  README.md
注意两个
M
s的位置

使用git签出--.
,我们将从索引复制到工作树。这将撤消我们对
复制所做的更改,因为索引版本与
HEAD
版本匹配,但不会撤消我们对
README.md
所做的更改,因为索引版本与工作树版本匹配:

$ git checkout -- .
$ git status --short
M  README.md
如果我们现在使用
git reset--hard HEAD
,它将
README.md
从提交复制到索引(这样索引现在再次匹配
HEAD
),并在此过程中将文件复制到工作树中正常的、可编辑的形式(这样工作树再次匹配索引):

请注意,这与您描述的效果相反:
git reset--hard
使事情与提交匹配(正如人们所期望的),而
git checkout--.
没有(正如人们所期望的,现在人们已经知道了关于git的index2的一切)


1在索引重置步骤之前执行了
git reset
的第一步,但由于参数是
HEAD
,因此第一步没有效果,因此我在本说明中省略了它

2至少,人们现在应该意识到,我们不能忽视索引的存在。:-)说真的,这里有很多需要知道的,您可以经常忽略其中的一些内容,但记住索引不仅存在,而且您必须了解它才能使用Git,这一点非常重要