2012-04-26 183 views
8

我想了解當將文件移動到「暫存」狀態時,Git實際存儲的內容。git暫存區如何存儲文件?

考慮以下順序:

一個新文件添加和提交到本地倉庫:

touch file.txt 
git add file.txt 
git commit 

我更改了文件:

echo text1 > file.txt 
git add file.txt 

然後我在提交之前再次編輯該文件:

echo text2 > file.txt 

一個Git狀態顯示:

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

我然後提交文件:

git commit file.txt 

如何是混帳能夠處理分期新的,第二次更新file.txt的而不告訴? 「狀態」輸出看起來好像它會嘗試檢查第一個修訂版本,但是在不檢查它們的情況下保留未執行的更改。

在這種情況下是否存在隱式階段?

回答

7

認爲Git是兩件事 - 提交(文件快照)和標籤(分支等)。

Git實際上創建一個提交時,當你git add,而不是當你git commit。因此,當您在更改的文件上執行git add時,它會使用這些更改創建一個提交,並將「分段」標籤分配給該特定提交。

當你執行git commit之前再次更改的文件,它現在已經在「上演承諾」(即一直沒有git commit它尚未執行),並已加入既不也不文件提交的新變化。這就是git status能夠向你展示兩者的方式。

當你git commit,它實際上是移動你當前的分支標籤到該特定的提交(並刪除「分段」標籤),所以提交不再標記爲「分級」,但「主」(或任何分支你目前在)。

+0

我在運行上述測試時觀察到的行爲是,它將文件的非分離內容(「text2」)提交到回購庫中。這個解釋是否正確?我認爲它會提交文件的「stage」版本(「text1」)。我通過做一個「git checkout file.txt」來確認這是什麼。 – 2012-04-26 07:23:52

+1

我剛做了一個測試,但沒有得到你的結果。 'git test''cd gittest''git init''echo text 1> test.txt''git add。''git commit -m'初始提交''echo text 2> test.txt''git add .' 'echo text 3> test.txt'此時,存在分階段更改(「文本2」)和未分離更改(「文本3」)。現在,'git checkout test.txt'和'cat test.txt'。我得到「文本2」。隨着階段性變化,本地更改被廢棄。 – redhotvengeance 2012-04-26 07:39:36

+0

我得到與您的測試序列相同的結果。但是,如果我在'echo text 3> test.txt'步驟之後執行'git commit'(類似於我在原始文章中的步驟),那麼當我觀察git隱式地分級「text 3」內容並將其提交給回購。爲了清楚起見,我在這裏做的序列是:'mkdir gittest''cd gittest''git init'' echo text 1> test.txt''git add。''git commit -m'初始提交'' echo文本2 > test.txt''git add .'' echo text 3> test.txt''git commit -m'new'' git checkout test.txt''cat test.txt',result a output of「text 3 」。 – 2012-04-26 07:52:30

4

git commit <somefiles>相當於git add <somefiles>其次是git commit。如果你只是做git commit,git會提交所有的分階段更改,但不會提交自上次上演有問題文件以來所做的修改。