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

时间:2017-09-19 12:51:30

标签: git git-reset

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

  

当我运行nil时,它应该重置为a   根据我的理解,你所拉的原始版本。   不幸的是,它会留下文件,因为git reset --hard HEAD显示了一个   未跟踪文件的大清单。

     

你如何告诉git"只需将它恢复到最后一次拉动中的内容,仅此而已,#34;

要删除这些文件,我必须运行git status

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

2 个答案:

答案 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你基本上是在说“我知道这将消除你所知道的文件的所有未决更改,所以扔掉它们”。但这并不包括对本地未跟踪文件的任何声明,因此这些文件将按原样保留。