2017-09-19 96 views
0

git reset --hard HEAD leaves untracked files behind为什么`git reset --hard HEAD〜X`将未跟踪的文件留在后面?

当我运行git reset --hard HEAD,它应该重置为你拉什么 原始版本,据我所知。 不幸的是,它将文件留在周围,因为git status显示一个 未跟踪文件的大列表。

你怎么告诉git“只要把它带回到最后拉什么,什么都没有,什么都不少”?

要摆脱这些文件,我必须运行git clean -df

有人可以请解释为什么它以这种方式工作,哪些文件将成为未跟踪?

+0

因为git非常非常小心,不会破坏它无法恢复的工作(工作它不知道任何事情)。由于这些文件是* untracked *,所以git不能回到它们的早期版本,因此让它们独立于结账,重置等日常操作。“将它带回最后的拉”是重点:你知道 - 作为一个阅读目录列表的人类 - 项目状态是什么,但git没有未跟踪的文件是_untracked_。 – msanford

+0

因此,在HEAD〜X提交中不存在的所有文件都将变为未跟踪? –

+0

不,在HEAD中跟踪但不在HEAD〜X中的文件也将被删除。 – poke

回答

3

更新每笔记的评论。

最后一个问题第一:

哪些文件会变得未经跟踪?

无。但未追踪的已经的文件应该保持未被追踪并且不受影响。这与大多数git命令(除了明确影响未跟踪文件的那些命令除外)的行为一致。

我说应该仍然未被跟踪,因为有一种情况即使不是这样:如果您重置的提交文件与当前未跟踪文件具有相同路径,则工作树版本不可逆转地被破坏。这是非常糟糕的行为,海事组织是一个错误,但它是。

可有人请解释为什么是这样工作的[?]

因为如果git的是隐式删除或修改未追踪文件,你就没有办法恢复的内容该文件看起来像前git搞砸了。如果你想在git的控制下使用这个文件,git会假设你已经添加了并且可能已经提交了。既然你没有(该文件未被跟踪),git通常不会混淆它,除非你清楚地告诉它它应该。

因此,回到原来的问题的前提是:

当我运行的git的复位 - 硬头,它应该重置为你拉什么是原始版本,按照我的理解

没有。文档很清楚,只有被跟踪的状态被恢复。

+0

*“但是已经未跟踪的文件将保持未跟踪状态,并且不会受到影响。”* - 只有* iff *它们在您重置的提交中也未被跟踪。 – poke

+0

@poke - 是的,不幸的是git会覆盖worktree的版本,在不寻常的情况下,你跟踪文件,删除它,但保留(或重新引入)工作树的副本。如果您意识到该文件不属于源代码管理,并且将其添加到'.gitignore'并将其从索引/后续提交中删除,则这很可能是一个问题。相对于文档,我将其解释为一个错误;错误将是一个更好的行为。 –

+0

谢谢你们两位 –

0

git reset --hard将只会替换所有当前跟踪的文件,其中包含您要重置的提交状态。这具有以下效果:

  • 所有正在跟踪的文件的挂起更改都将被删除。
  • 目标提交的跟踪文件的所有更改都将被删除。
  • 既不会被当前提交跟踪也不会被目标提交跟踪的文件将保持原样。

这意味着,通常忽略文件和新文件将被单独保留。

这种方式的工作方式与Git如何在跟踪/未跟踪的文件中运行一致。对于Git,未跟踪的文件是隐形的,它们永远不会被Git所触及。当你签出一个以前没有跟踪过(但存在)的文件的分支时,甚至是这样的:Git将拒绝这样做,因为未跟踪文件的状态将会丢失。

Git一般会尽量不要失去任何本地更改。通过说git reset --hard你基本上是在说“我知道这将消除你所知道的文件的所有未决更改,所以把它们扔掉”。但是这不包括对本地未跟踪文件的任何声明,所以这些将保持原样。

相关问题