将每个文件重置为HEAD,除了舞台git中的文件

时间:2018-03-08 20:34:02

标签: git reset head stage

我们假设foo.c已上演且bar.c已被修改但未上演。有没有办法让每个非分段文件(在这种情况下是bar.c)重置回HEAD,而foo.c没有退出舞台?

我知道提交不会写出历史记录中的变化,我只是想避免提交,因为我正在构建一个脚本。

2 个答案:

答案 0 :(得分:2)

您已接受的

S. KUMAR's answer通常对您的意图是正确的。值得注意的是几个细节。

请注意,就git status而言,每个文件都有三个活动副本:

  • foo.c存在于HEAD(HEAD:foo.c),索引/登台区域(:0:foo.c)和工作树(foo.c)中。
  • bar.c存在于HEAD(HEAD:bar.c),索引/登台区域(:0:bar.c)和工作树(bar.c)中。

当你说:

  

我们假设foo.c已上演且bar.c已被修改但未上演......

意味着什么,无论如何,用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将文件的索引(aka staging-area)版本复制到 work-tree 。也就是说,对于匹配<path>的每个文件,请将:0:<path>复制到<path>

根据您的上述设置,这将覆盖foo.c :0:foo.cfoo.c不会更改bar.c。它还会覆盖:0:bar.c bar.cHEAD:bar.c会将:0:bar.c更改回HEAD:bar.c中的内容,因为git reset <path> 匹配(并且仍然匹配)HEAD

还值得一提的是:

:0:foo.c

告诉Git将文件的:0:bar.c版本复制到索引中。这就留下了工作树。您可以自行解决这对####-####-####-#### (16 chars) <element id="id">

的影响

答案 1 :(得分:1)

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

  

git checkout。