![](/img/trans.png)
[英]Does Git commit takes a snapshot of the whole repository or just of the staging area?
[英]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.