【问题标题】:Difference between git reset --hard <filename> and git checkout -- <filename>git reset --hard <filename> 和 git checkout -- <filename> 的区别
【发布时间】:2015-11-20 11:03:46
【问题描述】:

据我了解, git reset --hard 将在索引和工作目录中更新为 HEAD 指向的内容?

Git checkout -- 将在工作目录中更新到 INDEX 中的文件状态是什么?

所以如果是未暂存的,那么他们会做同样的事情(将工作目录中的文件更改为其在 HEAD/INDEX 中的状态 [与该文件的状态相同])?但是如果它是分阶段的,那么 git reset --hard 会像上面那样做,但是 Git checkout -- 什么都不做?

【问题讨论】:

  • 您可能想澄清您的问题,或者添加一个示例。按照公式,不是很清楚。
  • 最大的区别是一个有效,另一个无效。你不能 reset --hard 路径:git reset --hard &lt;filename&gt; 产生 fatal: Cannot do hard reset with paths.
  • 是的,这是一个非常重要的区别。我应该检查一下。

标签: git git-checkout git-reset


【解决方案1】:

git reset --hard 需要 revision/commit,而不是 pathspec

重置索引和工作树。自commit 以来对工作树中跟踪文件的任何更改都将被丢弃。 [强调我的]

如果没有给出修订,则默认为HEAD(当前提交)

相比之下,git checkout,当被称为git checkout [tree-ish] -- pathspec... 时,会使用从给定树中引用的 blob 的内容覆盖工作目录中指定路径和索引中的文件。如果没有提供树,即git checkout -- pathspec...,则工作目录中的文件将被索引中存储的当前内容覆盖

覆盖与路径规范匹配的文件的内容。当tree-ish(通常是提交)没有给出时,用索引中的内容覆盖工作树。当给出 tree-ish 时,用 tree-ish 的内容覆盖 索引和工作树。 [强调我的]

要模仿reset --hard 的行为(无需修订),您可以使用git checkout HEAD -- pathspec...

Git 2.25 引入了git restore。要使用新命令获得相同的行为,您可以使用 git restore --staged --worktree -- pathspec...(或 git restore -SW -- pathspec...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2017-12-10
    • 2011-09-06
    • 2011-07-04
    • 2020-04-07
    • 2015-08-26
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多