有人可以澄清这些条款的含义吗?跟踪文件是否已在某些时候添加到舞台中的文件?是"索引"与"阶段相同"?是否跟踪了所有分阶段文件,但反过来不一定正确(即,曾经暂存和提交的文件,但不是当前要提交的阶段的一部分)?我如何知道跟踪哪些文件?我如何知道哪些文件被暂存?
答案 0 :(得分:2)
这里要考虑三件事:当前提交(不同地称为HEAD
或@
),索引和工作树< / em>的
索引也称为临时区域和缓存。这些代表了它的各种功能,因为索引不仅仅包含建议的下一次提交的内容。它作为缓存的用途大多是不可见的:你只需使用Git,并且使Git快速运行的缓存技巧都是在引擎盖下完成的,无需人工干预。所以你只需要&#34;缓存&#34;要记住某些命令使用--cached
,例如git diff --cached
和git rm --cached
。其中一些具有其他名称(git diff --staged
),而另一些则不具备。
Git在使用这些术语的地方并不是很一致,所以你必须简单地记住它们。一个问题似乎是对于许多用户而言,&#34;索引&#34;是神秘的。这可能是因为你不能直接看到它,除了使用git ls-files
(这不是一个用户友好的命令:它用于编程,而不是每天使用)。
请注意,工作树(也称为工作树,有时是工作目录或工作目录)与工作树完全不同指数。您可以非常轻松地查看和修改工作树中的文件。
我曾经想过&#34;跟踪&#34;更复杂,但事实证明跟踪字面上意味着在索引中。当且仅当git ls-files
显示它将在下次提交时才跟踪文件。
您无法轻松查看索引中的文件 - 但您可以使用git add
轻松地从工作树复制到索引中:
git add path/to/file.txt
将文件从工作树复制到索引中。如果它尚未存在于索引中(未被跟踪),则它现在位于索引中(被跟踪)。
因此:
跟踪文件是否在某些时候已添加到舞台上的文件?
没有!跟踪文件是目前索引中的文件。过去,任何承诺或过去的任何时刻发生的事情都无关紧要。如果索引现在中存在某个路径path/to/file.txt
,则会跟踪该文件。如果没有,则不会跟踪它(并且可能也忽略)。
如果path/to/file.txt
现在在索引中,并且您将其取出,则不再跟踪该文件。它可能存在也可能不存在于任何现有提交中,它可能会也可能不会存在于工作树中。
是&#34;索引&#34;与&#34;阶段&#34;?
相同
是的,或多或少。各种文档和人们对此并不十分一致。
是否跟踪了所有暂存文件,但反过来不一定正确(即曾经暂存和提交的文件,但不是当前要提交的阶段的一部分)?
这个问题没有多大意义,因为&#34;临时区域&#34; 是索引。我认为 staged 没有完美定义的含义,但我会这样定义。如果符合以下情况,暂存文件
@
/ HEAD中,而是在索引中,或@
/ HEAD 和索引中,两者不同。等效地,您可以说&#34;当某个路径被称为 staged 时,这意味着如果我现在进行新的提交,那么该提交的新文件版本将与当前提交的版本不同。&#34;请注意,如果您没有以任何方式触及文件,那么它在工作树中的索引和中的当前提交和中,但是所有三个版本匹配,该文件仍将被提交。它只是没有&#34;上演&#34;也没有&#34;修改&#34;。
我如何知道跟踪哪些文件?
虽然git ls-files
可以告诉您,通常的方法是间接:您运行git status
。
我如何知道哪些文件已上演?
假设上面的定义,你必须要求Git diff
当前提交(HEAD / @
)和索引。他们之间的不同之处是&#34;上演&#34;。运行git status
将为您执行此差异,并报告此类文件的名称(不显示详细的差异)。
要获取详细的差异,您可以运行git diff --cached
,将HEAD
与索引进行比较。这也有名称git diff --staged
(这是一个更好的名字 - 但也许只是令人讨厌,--staged
不能作为git rm
的选项!)。
因为每个文件都有三个副本,所以你需要两个差异才能看到发生了什么:
git diff --cached
git diff
正在运行git status
为您运行这些git diff
的 ,并对其进行汇总。您可以使用git status --short
获得更短的摘要,您可以在其中看到以下内容:
M a.txt
M b.txt
MM c.txt
第一列是比较HEAD
与索引的结果:空白表示两个匹配,M
表示HEAD
和index
不同。第二列是比较索引与工作树的结果:空白表示两个匹配,M
表示它们不同。连续两个M
表示 c.txt
的所有三个版本都不同。你无法直接在索引中看到那个,但你可以git diff
它!
答案 1 :(得分:0)
通过展示而不是描述可能会很清楚。
请注意@torek 的回答中的信息是正确的。
回忆一下,index、stage 和 cache 在 git 中都是同义词。
## No new files
$ git status
On branch master
nothing to commit, working tree clean
# So git shows no files or changes
## New file that is not tracked
$ touch foo
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
foo
nothing added to commit but untracked files present (use "git add" to track)
# So git realises there is a new file, but it is not tracking it
## Tracked but not staged
$ git add --intent-to-add foo # shorthand equivalent flag is -N
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
new file: foo
no changes added to commit (use "git add" and/or "git commit -a")
# Now git is tracking the file, but no changes are staged for commit yet
## Tracked and staged
$ git add foo
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: foo
# Now the file is still tracked and the change is staged
希望您能从中看出未跟踪、已跟踪和已上演的区别