将每个文件重置为 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
.
的影响
假设 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 andbar.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
.