按照git rm
文檔,這是它的行爲方式:如果我的登臺索引爲空,爲什麼`git rm`刪除不在那裏的文件?
從索引中刪除文件,或從工作樹和索引
如果我只是做了提交,我的指數清空,執行git rm some_file
將暫時刪除some_file
。我期望rm
不做任何事情。爲什麼它會刪除一個不存在的文件,並且存儲庫的最終效果是什麼?
按照git rm
文檔,這是它的行爲方式:如果我的登臺索引爲空,爲什麼`git rm`刪除不在那裏的文件?
從索引中刪除文件,或從工作樹和索引
如果我只是做了提交,我的指數清空,執行git rm some_file
將暫時刪除some_file
。我期望rm
不做任何事情。爲什麼它會刪除一個不存在的文件,並且存儲庫的最終效果是什麼?
這裏的訣竅是,提交後指數不是爲空。
實際上,它包含了在提交之前和提交期間的確切內容。
我不確定這個概念來自哪裏。確實,git commit
有一個拼寫爲--allow-empty
的標誌,這可能使得它看起來像索引在這一點上是空的,但它是誤導標誌的拼寫:它允許的是空的diff,而不是空的提交。
git add
確實給索引添加了新的東西,但是在已經存在的文件的情況下,新增的東西只是取代已存在的舊條目。 (也許git add
拼寫是什麼導致人們假設指數爲空,提交後?)
(另外一個稍微特殊一點是,git rm
還增加了一句:具體而言,記錄說,「這個路徑 - 名字在HEAD
提交中存在,應該不會在下一次提交中存在。「這是因爲索引扮演雙重角色:它不是只是」下一次提交什麼「,而且還有一個高速緩存你可以完全刪除索引文件,這會刪除所有東西,但不會安排任何刪除操作:在這種情況下,git只需重新構建HEAD
提交的索引。)
你說「我不確定這個概念來自哪裏」。我認爲這是來自這樣的陳述:「索引是你提出的下一個提交」(來自[這裏](https://git-scm.com/blog))。立即提交後,我沒有提出任何建議我的下一個提交,所以我希望該索引是空的。然而,這篇文章繼續解釋說:「Git使用最後檢出到工作目錄中的所有文件內容列表填充[索引],以及最初檢出時的樣子」 – dumbledad