有三個地方,一個文件可以是 - 樹,索引和工作副本。當你只是添加一個文件到一個文件夾,你將它添加到工作副本。
當您執行類似git add file
的操作時,將其添加到索引中。當你提交它時,你也將它添加到樹中。
它可能會幫助你瞭解在git的復位三個比較常見的標誌:
git的復位[ - <mode>
] [<commit>
]
這種形式重置當前分支頭<commit>
和可能的 更新索引(將其重置爲<commit>
的樹)和 工作樹取決於<mode>
,它必須是 其中之一翼:
--soft
不觸及索引文件,也沒有在所有的工作樹(但重置 頭部<commit>
,就像所有的模式做)。這會讓您的所有 更改文件「更改爲提交」,因爲git狀態會將其置入。
--mixed
重置索引而不是工作樹(即更改的文件 被保留,但不標記爲提交)和報告一直沒有什麼 更新。這是默認操作。
--hard
重置索引和工作樹。丟棄對 工作樹中自<commit>
以來跟蹤文件的任何更改。
現在,當你做這樣的事情git reset HEAD
- 什麼你實際上做的是git reset HEAD --mixed
,它會「重置」索引你開始之前添加的文件/添加修改,該指數是狀態(通過git add
) 在這種情況下,工作副本和索引(或分段)是同步的,但是您在重置後使HEAD和索引同步。
git rm
另一方面從工作目錄和索引中刪除一個文件,當您提交時,文件也從樹中刪除。然而,git rm --cached
僅從索引中刪除文件並將其保留在工作副本中。這與git add file
完全相反在這種情況下,您使索引與HEAD和工作不同,其中HEAD具有之前承諾的文件版本,工作副本具有las修改,如果有任何或內容來自文件的HEAD,並從索引中刪除了該文件。現在提交會同步索引和樹,文件將被刪除。
我注意到'git rm --cached'後'git diff'命令不顯示任何diff,但'git diff --cached'顯示diff,就好像它仍然被緩存。然而'git status'顯示文件是'Untracked'。似乎有點不一致。 – haridsv 2011-11-06 19:15:01
沒關係......我應該使用'git reset --mixed'。我對'git rm --cached'與'git add''相反的說法有點困惑。從字面上看,這是不正確的,可能會造成損害。在我的例子中,我使用'git add'向暫存區添加了一個修改過的文件,並希望「添加」的反義詞不是該文件的初始添加。 + Greg Hewgill的回答幫助我獲得了更清晰的畫面。 – haridsv 2011-11-06 19:19:56
我發現使用工作副本,樹和工作樹有點混亂。工作樹是工作副本還是樹? – Nealv 2013-09-23 09:00:15