将每个文件重置为 HEAD,阶段 git 中的文件除外

Reset every file to HEAD except those in stage git

假设 foo.c 已上演,bar.c 已修改但未上演。有没有办法让每个非暂存文件(在本例中为 bar.c)重置回 HEAD 而不会 foo.c 退出暂存?

我知道提交不会在历史记录中写入栏的更改我只是想避免提交,因为我正在构建脚本。

是的,您可以git签出项目文件夹中的每个文件。这不会影响任何暂存文件。

git checkout .

,您已接受,大体上符合您的意图。不过有几个细节值得注意。

请记住,就 git status 而言,每个文件有 三个 个活动副本:

  • foo.c 存在于 HEAD (HEAD:foo.c)、索引 / staging-area (:0:foo.c) 和 work-tree (foo.c).
  • bar.c 存在于 HEAD (HEAD:bar.c)、索引 / staging-area (:0:bar.c) 和 work-tree (bar.c).

当你说:

Let's say foo.c is staged and bar.c has been modified but is not staged ...

的意思 无论如何在 Git 术语中是:

  • HEAD:foo.c != :0:foo.c,但是 :0:foo.c == foo.c
  • HEAD:bar.c == :0:bar.c,但是 :0:bar.c != bar.c

请注意,任何一个文件的所有三个副本都可能彼此不同,例如使用 git add -p 就很正常。如果您 运行 git add -p bar.c 并选择了一些(但不是全部)补丁大佬,您最终会进入这种状态。

当您 运行 git status、Git 首先比较 HEAD-vs-index 并报告任何不同之处,因为 为提交。然后它会比较 index-vs-work-tree 并报告任何不同之处,因为 未为提交准备的更改 (并且可能还会报告未跟踪的文件)。


运行:

git checkout <path>

告诉 Git 将文件的 index(又名 staging-area)版本复制到 work-tree。也就是说,对于每个匹配 <path> 的文件,将 :0:<path> 复制到 <path>.

鉴于您上面的设置,这将覆盖 :0:foo.c 中的 foo.c,从而使 foo.c 保持不变。它还从 :0:bar.c 覆盖 bar.c,这将 bar.c 改回 HEAD:bar.c 中的内容,因为 :0:bar.c 匹配(并且仍然匹配)HEAD:bar.c .


另外值得一提的是运行ning:

git reset <path>

告诉 Git 将文件的 HEAD 版本复制到索引。这使 work-tree 单独存在。您可以自己计算出这对 :0:foo.c:0:bar.c.

的影响