我有一个文件foo.py
。我对工作目录进行了一些更改,但不 暂存 或提交还有任何更改。我知道我可以使用git checkout foo.py
来摆脱这些变化。我还读到了使用git reset --hard HEAD
,它基本上重置了你的工作目录,暂存区和提交历史记录以匹配最新的提交。
在我的情况下,我的更改仍在工作目录中,是否有理由更喜欢使用one?
答案 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和人类明确表示,这意味着"提取文件master
"。
每个文件都有三个活动副本:
HEAD
中的一个; git status
命令查看所有三个,首先比较HEAD
- vs-index-这给Git提供了#34;要提交的更改列表" - 然后是index-vs - 工作树第二。第二个给Git列出了#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)
答案 2 :(得分:0)
在你的限制下,没有区别。如果有分阶段的变化,那么有:
reset
可以恢复分阶段的更改。
checkout
没有...