有人可以澄清這些條款的含義嗎?跟蹤文件是否有任何文件在某個時刻被添加到舞臺上? 「指數」與「舞臺」相同嗎?是否跟蹤了所有分階段文件,但是反過來並不一定是真實的(即,曾經分階段提交過但不屬於當前階段的文件)?我如何知道哪些文件被跟蹤?我如何知道哪些文件正在上演?Git跟蹤,未跟蹤,上演,索引的含義?
回答
有三件事情需要考慮:當前提交(不同地稱作HEAD
或@
),該指數和工作樹。
該指數也被稱爲臨時區域和緩存。這些代表了它的各種功能,因爲索引不僅僅包含提出的下一個提交的內容。但是,它作爲緩存的使用大部分是看不見的:你只需要使用Git,而使Git走得更快的緩存技巧都是在隱藏的情況下完成的,無需人工干預。因此,您只需要「緩存」即可記住某些命令使用--cached
,例如git diff --cached
和git 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
意味着HEAD
和index
不同。第二列是比較索引與工作樹的結果:空白表示兩個匹配,M
表示它們不同。這兩個M
s連續的意思是c.txt
的所有三個版本都是不同的。你不能直接在索引中看到它,但你可以git diff
它!
感謝這個非常詳細的答案,非常有幫助 –
- 1. 將跟蹤的文件移動到未跟蹤的git
- 2. 跟蹤Git上的分支?
- 3. 什麼是GIT中的跟蹤文件和未跟蹤文件?
- 4. libspotify API:跟蹤索引
- 5. 如何跟蹤UICollectionView索引
- 6. Git在Windows上:爲什麼我突然有了跟蹤的未跟蹤目錄?
- 7. git add後未跟蹤的文件
- 8. 用git推動未跟蹤的內容
- 9. Git跟蹤未追蹤的文件,但未添加到提交
- 10. Git。更新未跟蹤文件
- 11. Git忽略未跟蹤文件
- 12. Git commit -a「未跟蹤文件」?
- 13. Git - 跟蹤分支上的信息
- 14. git clean只跟蹤文件
- 15. Git自動跟蹤目錄
- 16. Git沒有跟蹤文件
- 17. Git會跟蹤版本嗎?
- 18. 讓git master跟蹤/跟蹤另一個本地分支
- 19. 如何跟蹤Array.sliding中的索引
- 20. 開始跟蹤只跟蹤中繼的git-svn倉庫上的分支/標籤
- 21. 跟蹤
- 22. git diff相對於包含未跟蹤文件的工作樹
- 23. Python中,跟蹤未定義的變量
- 24. 跟蹤的文件被標記爲未跟蹤
- 25. OpenCV 3.0包含跟蹤器
- 26. git跟蹤和git staging的概念
- 27. GDB跟蹤:無當前跟蹤幀
- 28. 運動跟蹤與Blob跟蹤
- 29. Android系統跟蹤[跟蹤標記]
- 30. 用jQuery跟蹤點擊 - php跟蹤
已經有許多現有的文章可以回答你的問題,比如[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)來提供一些基本概念。 –