簡體   English   中英

當我將文件添加到暫存區時,為什么Git會將文件存儲在存儲庫中?

[英]Why does Git store the file in the repository when I just add it to the staging area?

據我了解,當您使用git add文件時,它只是在將文件添加到存儲庫之前先git add文件,但是為什么在我提交文件之前可以看到它已添加到git存儲庫中呢?

例如,如果我創建一個新的git存儲庫並創建一個名為foo的新文件,並將內容“ hello world”添加到其中,然后git add foo ,我會在.git文件夾內的objects子目錄中看到一個新項。 我什至可以使用git cat-file -p命令在objects文件中查看新文件的內容。

到底添加了什么到.git/objects文件夾? 暫存文件在技術上有什么作用? 像在文件上運行git add之后git add執行哪些步驟? 如果我知道這些步驟,也許我會更好地理解。

暫存區是存儲庫的一部分。

我認為您正在將存儲庫的對象數據庫與歷史混淆。 只有提交是歷史記錄的一部分,但是Git句柄的所有對象都是對象數據庫的一部分。

想一想:Git不會駐留在內存中,那么它會在何處記錄暫存區的一部分而不是它的對象數據庫?

我什至可以使用git cat-file -p命令在對象文件中查看新文件的內容。

git diff --cached

到底添加了什么到.git/objects文件夾?

請參閱“ Git內部-Git對象

您可以在對象目錄中看到一個文件。 這就是Git最初存儲內容的方式-每個內容作為一個文件,以內容及其標題的SHA-1校驗和命名。 子目錄以SHA-1的前2個字符命名,文件名是其余38個字符。

為什么在提交之前可以看到它已添加到git存儲庫中?

不要忘了與git add -p--patch ),你可以添加部分( 帥哥之前提交的文件)。

索引的目標保持(在git add的上下文中)以准備下一次提交。
它反映了Linus Torvalds在2005年創建的Git的原始需求,該需求用於集成補丁 (起初只是一個合並管理器)

在文件上運行git add之后會發生什么步驟

雖然索引不包含任何文件內容,但.objects包含松散(未壓縮)的對象:

有關步驟,請參見對象存儲

  • Git構造一個以對象類型開頭的標頭,在這種情況下為blob。 然后,它添加一個空格,后跟內容的大小,最后是一個空字節
  • Git將標頭和原始內容連接在一起,然后計算該新內容的SHA-1校驗和。
  • Git使用zlib壓縮新內容,
  • 最后,Git將zlib壓縮的內容寫入磁盤上的對象。 Git確定要寫出的對象的路徑(SHA-1值的前兩個字符是子目錄名稱,后38個字符是該目錄中的文件名)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM