章節 9 改變,而不僅是檔案
學習目標
- 了解 git 是紀錄內容狀態的改變,而不只是儲存檔案。
大部分的版本控制系統是針對檔案作記錄。 您加入一個檔案到版本控制然後系統追蹤這個檔案的變化。
比起檔案本身,git 關注的是檔案內容的變更。當您執行 git add file ,您不只是讓 git 把檔案加入檔案庫,而是讓 git 記錄當下檔案所有的狀態,這意思是包含每一次送交的註解,變更了哪些內容,然後送交到檔案庫。
現在讓我們試著透過實際操作來理解上面這段話。看看這有哪些不同。
第一次編輯: 使用預設值 01
編輯 “Hello, World” 程式使用預設值,當命令列沒有值傳回時使用預設"World"
檔案: hello.rb
name = ARGV.first || "World" puts "Hello, #{name}!"
加入暫存區 02
現在,將變更加入暫存區,或稱之為追蹤變更。
執行:
git add hello.rb
第二次編輯: 加入註解 03
加入一行註解到 “Hello, World” 檔案中
檔案: hello.rb
# Default is "World" name = ARGV.first || "World" puts "Hello, #{name}!"
檢視目前狀態 04
執行:
git status
您將會看到 …
輸出:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.rb # # 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: hello.rb #
注意到 hello.rb
列出了兩種不同的狀態。 第一次加入預設值然後加入暫存區(追蹤狀態)。 第二次編輯加入註解然後沒有追蹤狀態。 如果你現在送交會發現有註解的版本並沒有存到檔案庫。
接著再試試...
執行送交 05
送交已加入暫存的改變,或者說送交已經追蹤的狀態(第一次編輯的狀態), 然後再用 git status 檢視一次狀態。
執行:
git commit -m "Added a default value" git status
您將會看到 …
輸出:
$ git commit -m "Added a default value" [master 1b754e9] Added a default value 1 files changed, 3 insertions(+), 1 deletions(-) $ git status # On branch master # 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: hello.rb # no changes added to commit (use "git add" and/or "git commit -a")
回應的訊息告訴我們hello.rb
還有一些沒有被追蹤的變更, 但這些變更並沒有被加入暫存區。
追蹤第二次編輯06
現在將第二次編輯所變更的內容加到暫存區,然後再執行一次 git status 檢視狀態。
執行:
git add . git status
注意: 我們使用所在目錄的路徑(‘.’)來加入。 這可以快速將目前目錄,子目錄所有有變更的檔案加入到暫存區(Staging Area)。但是因為這一招會將所久的東西都加到暫存區,所以在執行之前最好檢查一下狀態以確保加入正確該加入的檔案。
您將會看到 …
輸出:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.rb #
現在第二次編輯的修改都被存到暫存區了
送交第二次編輯 07
執行:
git commit -m "Added a comment"