例如,我對分支中的一些檔案進行了更改。然后我使用git add.
然后我還有其他額外的變化。我再次使用git add.
是否可以命名每個階段?謝謝你。
uj5u.com熱心網友回復:
最簡潔的答案是不。
很長的答案是肯定的,但甚至不要嘗試這樣做,你只會讓自己發瘋。
要理解為什么,讓我們看看“暫存區”是如何作業的。
Git 是關于提交的
總的來說,Git 是關于提交的。盡管提交存盤檔案,但這與檔案無關;這與分支無關,盡管我們將提交組織成我們稱之為分支的東西,并且我們使用分支名稱(我們也稱其為“分支”,盡管它們完全不同——請參閱Haddock 的眼睛了解更多關于事物、名稱之間的混淆, 和名字) ...我在哪里?啊,是的,我們使用分支名稱來查找提交,因為每個提交的真實名稱是唯一的,但是又大又丑,看起來很隨機,對人類來說太難使用哈希 ID或物件 ID (OID) .
所以每個 Git 提交都有編號,有一個唯一的編號,表示為一個大而丑陋的十六進制字串。Git 將每個提交——加上一堆支持物件,這些物件也獲得 OID——存盤在一個“所有 Git 物件”的大資料庫中。使用 OID(哈希 ID)作為鍵,Git 幾乎可以立即在這個鍵值存盤中查找物件,這很棒,除了一些問題:
- 資料庫中存盤的任何內容都無法更改。
- 提交存盤每個檔案的完整快照(在所有時間都被凍結)。這些檔案在提交之間(甚至內部)進行重復資料洗掉以節省空間,這是完全可以做到的,因為它們一直被凍結。
- 每個提交還存盤一些元資料,對于這個特定的答案,我們將忽略這些元資料。
因此,每次提交就像每個檔案的永久存檔(tar 或 zip 或其他)。但是這些檔案以一種特殊的、只讀的、僅限 Git 的、壓縮的和去重復的形式存盤。只有Git可以讀取它們,而您計算機上的任何內容,甚至 Git 本身都無法覆寫它們。1
這意味著您實際上無法使用已提交的檔案! 這可能會讓你想知道它們有什么好處。
不過,這個問題的解決方案很簡單:當您使用git switch或git checkout選擇提交時,Git會讀取檔案的凍結副本(Git可以這樣做,即使沒有其他方法也可以)并使用它來撰寫檔案的 可用版本。這些可用版本作為普通的日常檔案進入您的作業樹。如果這就是 Git 所做的一切,那么事情會非常簡單,而且您一開始就不會問這個問題,但這并不是 Git 所做的全部。
1如果某些東西確實設法覆寫了一個,結果是 Git 資料庫損壞:您不能再提取使用該覆寫檔案的任何提交。所以 Git 不會那樣做;Git 試圖阻止其他程式這樣做;并且首先不應該嘗試其他任何事情。
Git 的索引 AKA 暫存區
棘手的一點是,當 Git 提取提交時,以便您可以使用它——或者只是為了閱讀它,或者稍后構建一個新的提交——Git 會將所有凍結的檔案從深度凍結中復制到 Git 所謂的索引中或集結區。(Git 給這個東西起了第三個名字,叫它cache,雖然現在這個名字沒有多大用處:它主要顯示為標志名,比如.)git rm --cached
從技術上講,暫存區域中的內容是檔案的name 和 mode,以及對凍結、重復資料洗掉副本的參考。然而,你可以把它想象成它擁有一個可重寫版本的凍結副本,因為 Git 是如何使用它的:當你運行時git add,Git:
- 讀取檔案的作業樹副本;
- 將其壓縮成凍結形式,但還沒有完全凍結;2
- 檢查是否重復;和
- 使用凍結的表格更新索引,或者重新使用現有的副本,或者不重新使用,視情況而定。
如果您為此時不在索引中的檔案添加新名稱,Git 會將新名稱和凍結格式的內容添加到索引中。使用git rmorgit rm --cached也會根據需要洗掉名稱和參考。
所以結果是,當您第一次簽出某個提交時,索引會保存該提交的完整副本3。運行git add時,索引副本會更新。實際上,索引始終包含您提議的下一次提交。
當您實際運行git commit以進行新的提交時,Git 會獲取凍結格式的索引內容并將其真正凍結為真正的提交。該新提交獲得一個新的唯一哈希 ID,并且 Git 更新當前分支名稱以將新提交記住為最新提交(Git 安排新提交的元資料以記住先前的分支提示提交哈希 ID)。
現在,關于索引的事情是這樣的:只有一個索引。4 所以沒有辦法說“這是X點的索引”,然后,“這是Y點的索引”:只有一個索引,git add當你讓Y點存在時覆寫了X點索引.
所有這一切的最終結果是,因為只有一個索引,所以只有一個 staging ara。沒有辦法命名它,因為它是索引。
2從技術上講,如有必要,Git會立即將凍結格式的blob 物件添加到物件資料庫中。但是,如果它永遠不會被使用,它最終會被丟棄。所以就好像它從來沒有被添加到這里,這就是為什么它比“凍結”更“泥濘”。
3由于索引中的內容是重復資料洗掉的,并且提交出來的檔案肯定已經在資料庫中,所以這個副本不占用空間。索引條目本身確實占用了一點空間——每個檔案大約 100 位元組的粗略順序——但檔案內容都是預先去重的。
4這在技術上是錯誤的,原因有兩個:
- 最重要的是,每棵作業樹都有一個獨特的索引。使用
git worktree add你可以創建一個新的作業樹,并附帶一個新的索引。 - 對于 Git 自己的內部目的,可以創建和填充臨時索引。這樣做非常棘手,但在使用or
git commit時需要這樣做。實際上,對于,Git 需要創建兩個臨時索引檔案。匯出使用臨時索引檔案而不是索引的能力:您可以使用腳本自己完成。但是如果你這樣做了,你必須非常小心,因為索引——這個特定作業樹的區別索引——必須與當前提交和作業樹保持正確的關系。如果不仔細維護關系,接下來會提交錯誤的檔案。git commit --onlygit commit --includegit commit --onlygit commit
因此,雖然可以有多個索引檔案處于活動狀態,但您不想長時間(例如幾秒鐘)執行此操作。當git commit命令創建其臨時索引副本時,它們只會持續到提交本身完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/467723.html
標籤:混帐
