来自git reset --hard HEAD leaves untracked files behind:
当我运行
nil
时,它应该重置为a 根据我的理解,你所拉的原始版本。 不幸的是,它会留下文件,因为git reset --hard HEAD
显示了一个 未跟踪文件的大清单。你如何告诉git"只需将它恢复到最后一次拉动中的内容,仅此而已,#34;
要删除这些文件,我必须运行git status
。
有人可以解释为什么以这种方式工作以及哪些文件将无法跟踪?
答案 0 :(得分:6)
更新评论中的每个笔记。
最后一个问题:
哪些文件将被取消跟踪?
无。但已经未跟踪的文件应保持未跟踪且不受影响。这与大多数git命令的行为一致(除了那些明确影响未跟踪文件的命令)。
我说 应该保持未跟踪,因为有一种情况甚至不成立:如果你重置的提交有一个同样的文件path作为当前未跟踪的文件,然后工作树版本不可逆转地被破坏。这是非常不合理的行为,IMO是一个错误,但它确实存在。
有人可以解释为什么它会这样运作[?]
因为如果git隐式删除或修改未跟踪的文件,你就无法在git搞乱它之前恢复那个文件的样子。如果你想在git的控制下使用该文件,git假设你已经添加并且可能已经提交了它。由于你没有(文件没有跟踪),git通常不会搞砸它,除非你清楚地告诉它应该。
回到原始问题的前提:
当我运行git reset - hard HEAD时,它应该重置为你所提取的原始版本,正如我所理解的那样
不。文档很清楚,只有被跟踪的状态才会被恢复。
答案 1 :(得分:0)
git reset --hard
只会将所有当前跟踪的文件替换为您要重置的提交状态。这具有以下效果:
这意味着通常会忽略文件和新文件。
这种方式的工作方式与Git对跟踪/未跟踪文件的操作方式一致。对于Git来说,未跟踪的文件是不可见的,Git永远不会触及它们。当你检查出一个以前没有跟踪(但已经存在)跟踪文件的分支时,情况就是如此:Git将拒绝这样做,因为未跟踪文件的状态将会丢失。
一般来说,Git会非常努力地避免失去任何局部变化。通过说git reset --hard
你基本上是在说“我知道这将消除你所知道的文件的所有未决更改,所以扔掉它们”。但这并不包括对本地未跟踪文件的任何声明,因此这些文件将按原样保留。