git - 为什么 `git reset --hard HEAD~X` 会留下未跟踪的文件?

标签 git git-reset

来自 git reset --hard HEAD leaves untracked files behind :

When I run git reset --hard HEAD, it's supposed to reset to a pristine version of what you pulled, as I understand it. Unfortunately, it leaves files lying around, as a git status shows a big list of untracked files.

How do you tell git "Just bring it back to EXACTLY what was in the last pull, nothing more, nothing less"?

要删除这些文件,我必须运行 git clean -df

有人可以解释为什么它以这种方式工作以及哪些文件将变得无法跟踪吗?

最佳答案

根据评论中的注释更新

最后一个问题在先:

which files will become untracked?

没有。但是已经未跟踪的文件应该保持未跟踪状态并且不会受到影响。这与大多数 git 命令的行为一致(除了那些明确影响未跟踪文件的命令)。

不过,我说应该保持未跟踪状态,因为有一种情况甚至不是这样:如果您要重置的提交在与当前未跟踪文件相同的路径下有一个文件,然后工作树版本被不可逆转地破坏。这是非常不符合 git 的行为,IMO 是一个错误,但它确实存在。

Can somebody please explain why it works this way[?]

因为如果 git 隐式删除或修改未跟踪的文件,您将无法恢复该文件在 git 搞砸之前的样子。如果您希望该文件在 git 的控制下,git 会假定您已经添加并可能提交了它。因为你没有(文件未被跟踪),git 通常不会弄乱它,除非你清楚地告诉它应该这样做。

那么回到最初问题的前提:

When I run git reset --hard HEAD, it's supposed to reset to a pristine version of what you pulled, as I understand it

没有。文档清楚地表明只有跟踪状态被还原。

关于git - 为什么 `git reset --hard HEAD~X` 会留下未跟踪的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300977/

相关文章:

git - 什么是 `git restore` 命令, `git restore` 和 `git reset` 之间有什么区别?

git - git checkout -B 是否执行重置?

git - 在重置之前将 git 重置撤消至未提交状态?

git - 撤消推送到文件的更改

混帐: "Corrupt loose object"

git - 重置而不丢失已经提交的文件

Git - 获取当前工作副本版本

git - 大量git历史记录重写后如何同步本地历史记录?

git - 如何使用 Github Desktop 从远程存储库提取更改而不推送本地更改

git - 在 AWS CodeBuild 中为 https git clone 设置凭证