章節 9 改變,而不僅是檔案

學習目標

大部分的版本控制系統是針對檔案作記錄。 您加入一個檔案到版本控制然後系統追蹤這個檔案的變化。

比起檔案本身,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"

目錄