Git跟踪,未跟踪,上演,索引意义?

时间:2017-07-24 23:08:00

标签: git github definition

有人可以澄清这些条款的含义吗?跟踪文件是否已在某些时候添加到舞台中的文件?是"索引"与"阶段相同"?是否跟踪了所有分阶段文件,但反过来不一定正确(即,曾经暂存和提交的文件,但不是当前要提交的阶段的一部分)?我如何知道跟踪哪些文件?我如何知道哪些文件被暂存?

2 个答案:

答案 0 :(得分:2)

这里要考虑三件事:当前提交(不同地称为HEAD@),索引工作树< / em>的

索引也称为临时区域缓存。这些代表了它的各种功能,因为索引不仅仅包含建议的下一次提交的内容。它作为缓存的用途大多是不可见的:你只需使用Git,并且使Git快速运行的缓存技巧都是在引擎盖下完成的,无需人工干预。所以你只需要&#34;缓存&#34;要记住某些命令使用--cached,例如git diff --cachedgit 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的选项!)。

因为每个文件都有三个副本,所以你需要两个差异才能看到发生了什么:

  • 比较HEAD与指数:git diff --cached
  • 比较索引与工作树:git diff

正在运行git status为您运行这些git diff ,并对其进行汇总。您可以使用git status --short获得更短的摘要,您可以在其中看到以下内容:

 M a.txt
M  b.txt
MM c.txt

第一列是比较HEAD与索引的结果:空白表示两个匹配,M表示HEADindex不同。第二列是比较索引与工作树的结果:空白表示两个匹配,M表示它们不同。连续两个M表示 c.txt的所有三个版本都不同。你无法直接在索引中看到那个,但你可以git diff它!

答案 1 :(得分:0)

通过展示而不是描述可能会很清楚。

请注意@torek 的回答中的信息是正确的。

回忆一下,indexstagecache 在 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

希望您能从中看出未跟踪、已跟踪和已上演的区别