git reset --hard HEAD vs git checkout <file>

时间:2017-10-17 23:50:02

标签: python git

我有一个文件foo.py。我对工作目录进行了一些更改,但 暂存 或提交还有任何更改。我知道我可以使用git checkout foo.py来摆脱这些变化。我还读到了使用git reset --hard HEAD,它基本上重置了你的工作目录,暂存区和提交历史记录以匹配最新的提交。

在我的情况下,我的更改仍在工作目录中,是否有理由更喜欢使用one?

3 个答案:

答案 0 :(得分:5)

  

是否有理由更喜欢使用其他在我的情况,我的更改仍在工作目录中?

不,因为他们会完成同样的事情。

  

是否有理由更喜欢[git checkout -- path/to/file]优先于[git reset --hard]使用[一般但不是我的具体情况]?

是:这只会影响一个文件。如果您的习惯是git reset --hard撤消对一个文件的更改,并且您也有其他文件的工作树和/或分阶段更改,那么您可能是git reset --hard如果没有手工重建这些变化,那就不幸了。

请注意,还有第三个结构:git checkout HEAD path/to/file。这与没有HEAD--而不是 1 )的那个之间的区别在于 HEAD意味着首先将永久不可更改的提交文件的版本复制到index / staging-area,然后复制到工作树。具有--的那个意味着将索引/临时区域中的文件版本复制到工作树中。

1 使用--的原因是为了确保Git永远不会将文件名与其他任何内容混淆,例如分支名称。例如,假设您将文件命名为master,只是为了顽固。那么git checkout master是什么意思呢?是应该签出分支master,还是提取文件master--中的git checkout -- master向Git和人类明确表示,这意味着&#34;提取文件master&#34;。

摘要,或者要记住的事项

每个文件都有三个活动副本:

  • HEAD中的一个;
  • index / staging-area中的一个;
  • 工作树中的一个。

git status命令查看所有三个,首先比较HEAD - vs-index-这给Git提供了#34;要提交的更改列表&#34; - 然后是index-vs - 工作树第二。第二个给Git列出了#34;未进行提交的变更&#34;。

git add命令从工作树复制到索引中。

git checkout命令从HEAD复制到索引,然后复制工作树,或者只从索引复制到工作树。所以它有点复杂,有多种操作模式:

  • git checkout -- path/to/file:从索引到工作树的副本。 HEAD中的内容与此无关。 --通常是可选的,除非文件名看起来像分支名称(例如,名为master的文件)或选项(例如,名为-f的文件)。

  • git checkout HEAD -- path/to/file:从HEAD提交到索引,再到工作树的副本。 HEAD中的内容会覆盖索引中的内容,然后覆盖工作树中的内容。 --通常是可选的,除非文件名看起来像一个选项(例如,-f)。

    明智地使用--始终是一种好习惯。

git reset命令很复杂(它有许多操作模式)。

(这并不是说git checkout很简单:它也有很多操作模式,可能太多了。但我认为git reset至少有点糟糕。)< / p>

答案 1 :(得分:2)

也许这可以帮助您:

git data transport commands git reset --hard

来源: https://www.patrickzahnd.ch

答案 2 :(得分:0)

在你的限制下,没有区别。如果有分阶段的变化,那么有:

reset可以恢复分阶段的更改。

checkout没有...