2012-03-01 66 views
3

如果在本地文件夾中的任何改變時git status期待到底會發生什麼?Git的技術和背後的邏輯「混帳地位」

據我瞭解,每個文件都是通過哈希碼(準確地說:sha1)「註冊」的,而git status「只是」試圖匹配到目前爲止註冊的哈希值與實時計算的值,如果存在一些不同的東西被認爲是地位的改變。我不太確定這是說實話,如果我錯了,我想糾正。無論如何一些問題出現:

  1. 哪裏可以找到哈希?回購特定的東西有很多哈希,但我到底在哪裏可以找到每個文件的註冊哈希?
  2. 如果運行下面的命令之一,這些哈希值會發生什麼:git addgit commit -amgit gc

回答

5

要理解這一點,你首先需要了解的對象的Git存儲,所有的人都認定通過SHA1哈希。他們是承諾,樹木和斑點。

提交包含提交消息,commiter,日期,父的SHA1s提交(S)和樹(加上一些附加信息)的SHA1。

樹代表一個目錄。它包含它包含的文件和目錄的名稱(和其他元數據)。對於每個文件,它還包含相應blob的SHA1,以及包含另一個樹的SHA1的每個子目錄。

斑點表示一個文件的內容,而無需名稱或任何其它元數據。

現在,git status比較三棵樹:

  1. 屬於當前提交(HEAD,通常是最新提交關於當前分支)的一個。
  2. 在臨時區域的一個。這是文件在你之後去的地方,並且在你實際提交之前用它來準備提交。
  3. 您的工作樹。這是目錄當前在磁盤上的顯示方式。

這就是爲什麼,如果你編輯一個文件(比如說,a.txt中),git add吧,多一些編輯,然後使用git status,你會得到這樣的輸出:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: a.txt 
# 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: a.txt 
# 

現在到您的實際問題:

哪裏可以找到哈希值?回購特定的東西有很多哈希,但我到底在哪裏可以找到每個文件的註冊哈希?

它們存儲在樹的對象。例如,要看到當前的樹對象提交(HEAD),使用git ls-tree HEAD

$ git ls-tree HEAD 
100644 blob 9c59e24b8393179a5d712de4f990178df5734d99 a.txt 

你可以看到,回購的根目錄下包含一個文件(blob)稱爲A.TXT與9c59e24b8393179a5d712de4f990178df5734d99的SHA1 。

您可以使用相同的命令查看這些子目錄中的子目錄和文件的SHA1,請參閱該命令的文檔以獲取詳細信息。

要計算磁盤上某個文件的SHA1,可以使用git hash-object

如果下面的命令之一運行

你應該記住,SHA1s是基於對象的內容與這些哈希值會發生什麼。而且每個對象都是完全不可變的,所以某個對象的SHA1永遠不會改變。但是許多操作可以創建新的對象,並且它們也可以例如更改爲某些分支指向的對象。

  • git add取樹中的分級區域,通過添加或更改根據該命令的參數的一些文件修改它並保存修改後的樹回臨時區域。
  • git commit獲取暫存區域中的樹並創建一個指向該樹的提交。新提交也具有當前日期,您作爲提交者並將當前提交作爲其父項。然後該命令將當前分支更改爲指向新提交。
  • git commit -a只是git add後跟git commit的快捷方式。
  • git gc查看它存儲的所有對象並刪除那些無法訪問的對象。可達對象是所有分支,標籤或當前提交的提示,也是遞歸引用的所有對象。最近使用的提交(以及它們引用的對象)也不會被刪除,因爲它們可通過reflog訪問。