git reset file 和 git checkout file 的区别是什么?

17
为什么Git允许我重置文件?我原本以为理解了reset的意思,就是移动了HEAD...显然我错了。
所以git reset sha file似乎与git checkout sha file相同,但例外是我在索引和工作目录中看到了file
这对我来说毫无道理。请有人能够解释一下区别吗?

2个回答

12

总结: git reset COMMIT FILE 仅更改索引,git checkout COMMIT FILE 将更改索引和工作树。

git reset 有非常重要的标志 --soft--hard--mixed (以及 --keep--merge)

http://git-scm.com/docs/git-reset

--mixed 是默认值,当你执行 git reset sha file 时,你正在执行 mixed 重置,其中:

--mixed

重置索引但不重置工作树(即保留更改的文件但未标记为提交)并报告未更新的内容。这是默认操作。

正如上面所说的,此处的重置不会触及您的工作树,只有索引中的版本被重置为sha中的版本。

另一方面,git checkout

在给出路径或 --patch 选项时,git checkout 不会切换分支。它会从索引文件或命名的 (通常是提交的) 中更新工作树中的指定路径。

因此,当您执行git checkout时,您将失去文件中的更改,并用sha中存在的任何内容替换它,但是当您执行混合重置时,只有索引会被重置,您的工作目录仍将保留更改,以后您可以根据需要再次暂存。


谢谢你的回答。git reset --soft COMMIT filegit checkout COMMIT file 是一样的吗? - manish ma

9
git checkout

撤销对文件的更改。

git reset

将文件从暂存区中移除,但保留更改内容。


那么在任何路径上执行 git reset,都会将其从暂存区中移除,如果它是一个 SHA,则将 HEAD 移动到该变更集?那么为什么有时候 git 建议使用 git rm --cached 来取消暂存呢? - Senthess
1
我的经验是,在git中有不止一种做事情的方式,这可能不是一件好事。 - Pablo Fernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接