我们假设foo.c
已上演且bar.c
已被修改但未上演。有没有办法让每个非分段文件(在这种情况下是bar.c
)重置回HEAD,而foo.c
没有退出舞台?
我知道提交不会写出历史记录中的变化,我只是想避免提交,因为我正在构建一个脚本。
答案 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.c
,foo.c
不会更改bar.c
。它还会覆盖:0:bar.c
bar.c
,HEAD: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。