2017-07-24 146 views
1

有人可以澄清這些條款的含義嗎?跟蹤文件是否有任何文件在某個時刻被添加到舞臺上? 「指數」與「舞臺」相同嗎?是否跟蹤了所有分階段文件,但是反過來並不一定是真實的(即,曾經分階段提交過但不屬於當前階段的文件)?我如何知道哪些文件被跟蹤?我如何知道哪些文件正在上演?Git跟蹤,未跟蹤,上演,索引的含義?

+0

已經有許多現有的文章可以回答你的問題,比如[this](https://stackoverflow.com/questions/7564841/concept-of-git-tracking-and-git-staging)和[this ](https://stackoverflow.com/questions/37142132/whats-the-difference-between-a-tracked-and-a-staged-file)。另外還有[git book](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository)來提供一些基本概念。 –

回答

2

有三件事情需要考慮:當前提交(不同地稱作HEAD@),該指數工作樹

該指數也被稱爲臨時區域緩存。這些代表了它的各種功能,因爲索引不僅僅包含提出的下一個提交的內容。但是,它作爲緩存的使用大部分是看不見的:你只需要使用Git,而使Git走得更快的緩存技巧都是在隱藏的情況下完成的,無需人工干預。因此,您只需要「緩存」即可記住某些命令使用--cached,例如git diff --cachedgit rm --cached。其中一些有其他名字(git diff --staged),有些則不。

Git對於使用這些術語的位置並不十分一致,所以您必須簡單地記住它們。一個問題似乎是,對於許多用戶來說,「索引」是神祕的。這可能是因爲你不能直接使用看到,除了使用git ls-files(這不是一個用戶友好的命令:它是爲了編程而不是日常使用)。

注意,工作樹(也稱爲工作樹有時工作目錄工作目錄)是從索引中完全分離。您可以輕鬆查看和修改工作樹中的文件。

我曾經以爲「跟蹤」是更復雜,但事實證明,跟蹤相當字面意思是在指數。當且僅當git ls-files表明它將在下一次提交中時纔跟蹤文件。

那麼容易,但你可以從工作樹複製,到索引,方便,使用git add你無法看到索引文件:

git add path/to/file.txt 

拷貝文件從工作樹成指數。如果它還沒有在索引中(沒有被跟蹤),它現在在索引中(被跟蹤)。


因此:

跟蹤文件有任何文件,在某些時候,被添加到舞臺上?

不!跟蹤的文件是索引中的文件。無論過去發生了什麼,在任何承諾中或過去的任何時候發生了什麼都沒有關係。如果某個路徑path/to/file.txt存在於索引中,則會跟蹤該文件。如果沒有,它不被跟蹤(並且可能也被忽略)。

如果path/to/file.txt現在位於索引中,並且您將其取出,則不再跟蹤該文件。它可能也可能不在任何現有的提交中,它可能或可能不在工作樹中。

「索引」是否與「舞臺」相同?

是的,或多或少。各種文檔和人員對此不太一致。

所有正在籌備的文件跟蹤,但反之則不一定是真實的(即,那些曾經上演,並承諾,但不是當前階段的一部分被提交的文件)?

這個問題沒有引起太大意義,因爲「臨時區域」 索引。我認爲上演沒有一個完美定義的意思,但我會這樣定義它。一個文件上演如果:

  • 它不是在@/HEAD,但是在索引中,或
  • 是在兩個@/HEAD 的索引,是在兩個不同的。

同樣地,你可以說,「當一些路徑被稱爲上演,這意味着,如果我提出一個新的,現在提交,新提交的該文件的版本會有所不同,從目前提交的版本。 「請注意,如果您還沒有觸及以任何方式文件,因此,它在最近提交在工作樹索引,但所有三個版本匹配,該文件仍然會得到承諾。這只是「上演」或「修改」。

如何知道哪些文件被跟蹤?

雖然git ls-files可以告訴你,找出通常的方法是間接:您運行git status

我怎麼知道哪些文件上演?

假設上面的定義,你必須要求Git diff當前提交(HEAD/@)和索引。他們之間的不同之處在於「上演」。運行git status將爲您做這個差異,並報告這些文件的名稱(不顯示詳細的差異)。

要得到詳細的差異,你可以運行git diff --cached,它比較HEAD和指數。這也有名稱git diff --staged(這是一個更好的名字 - 但也許只是爲了討厭,--staged不作爲git rm的選項!)。

因爲有3個每個文件的副本,需要的diff,看看是怎麼回事:

  • 比較HEAD VS指數:git diff --cached
  • 比較指數VS工作樹: git diff

運行git status運行這些都git diff -s給你,並總結它們。你可以得到一個更短的總結與git status --short,在那裏你會看到的東西,如:

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

第一列是比較HEAD VS指數的結果:一個空白意味着這兩個比賽,一個M意味着HEADindex不同。第二列是比較索引與工作樹的結果:空白表示兩個匹配,M表示它們不同。這兩個M s連續的意思是c.txt的所有三個版本都是不同的。你不能直接在索引中看到它,但你可以git diff它!

+0

感謝這個非常詳細的答案,非常有幫助 –