1.獲取倉庫
有兩種取得Git項目倉庫的方法:
第一種是在現有項目或目錄下導入所有文件到Git中;
第二種是從一個服務器克隆一個現有的Git倉庫。
1.1 在現有項目中初始化倉庫
如果你打算使用Git來對夏安有的項目進行管理,你只需要進入該項目目錄并輸入:
$ git init
該命令將創(chuàng)建一個名為.git的子目錄,這個字目錄含有你初始化的Git倉庫中所有的必須文件,這些文件是Git倉庫的骨干。但是,在這個時候,我們僅僅是做了一個初始化的操作,你的項目里的文件還沒有被跟蹤。
如果你是在一個已經存在文件的文件夾(而不是空文件夾)中初始化Git倉庫來進行版本控制的話,你應該開始跟蹤這些文件并提交。你可通過git add命令來實現對指定文件的跟蹤,然后執(zhí)行git commit提交:
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
1.2 科隆現有的倉庫
如果你想獲得一份已經存在了的Git倉庫的拷貝,比如說,你想為某個開源項目貢獻一份力,這時就要用到git clone命令。Git克隆的是該Git倉庫服務器上的幾乎所有數據,而不是僅僅復制完成你的工作所需要文件。當你執(zhí)行git clone命令的時候,默認配置下遠程Git倉庫中的每一個文件的每一個版本都將被拉取下來。事實上,如果你的服務器的磁盤壞掉了,你通??梢允褂萌魏我粋€克隆下來的用戶端來重建服務器上的倉庫。
克隆倉庫的命令格式是git clone [url]。比如,要克隆Git的鏈接庫libgit2,可以用下面的命令:
$ git clone https://github.com/libgit2/libgit2
這會在當前目錄下床看一個名為“l(fā)ibgit2”的目錄,并在這個目錄下初始化一個.git文件夾,從遠程倉庫拉取下所有數據放入.git文件夾,然后從中讀取最新版本的文件的拷貝。如果你進入到這個新建的gitlib2文件夾,你會發(fā)現所有的項目文件已經在里面了,準備就緒等待后續(xù)的開發(fā)和使用。如果你想在克隆遠程倉庫的時候,自定義本地倉庫的名字,你可以使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit
這將執(zhí)行與上一個命令相同的作用,不過在本地創(chuàng)建的倉庫名字變?yōu)?code>mylibgit。
Git支持多種數據傳輸協議。上面的例子使用的是https://協議,不過你也可以使用git://協議或者食用SSH傳輸協議,比如user@server:path/to/repo.git。
2. 記錄每次更新到倉庫
現在我們手上有了一個真實項目的Git倉庫,并從這個倉庫中取出了序哦呦文件的工作拷貝。接下來,對這些文件做些修改,在完成了一個階段的目標之后,調本次更新到倉庫。
請記住,你工作目錄下的每一個文件都不外乎兩種狀態(tài):已跟蹤或未跟蹤。已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態(tài)可能處于未修改,已修改或已放入暫存區(qū)。工作目錄中除已跟蹤文件以外的所有其它文件都屬于為跟蹤文件,它們既不存在于上次快照的記錄中,也沒有放入暫存區(qū)。初次克隆某個倉庫的時候,工作目錄中的所有文件都屬于已跟蹤文件,并處于未修改狀態(tài)。
編輯過某些文件之后,由于自上次提交后你對他們做了修改,Git將它們標記為修改文件。我們逐步將這些修改過的文件放入暫存區(qū),然后提交所哦呦暫存了的修改,如此反復。所以使用Git時文件的生命周期如下:

2.1 檢查當前文件狀態(tài)
要查看那些文件處于什么狀態(tài),可以用git status命令。如果在克隆倉庫后立即使用此命令,會看到類似這樣的輸出:
$ git status
On branch master
nothing to commit, working directory clean
這說明你現在的工作目錄相當干凈。換句話說,所有已跟蹤文件在上次提交后都未被更改過。 此外,上面的信息還表明,當前目錄下沒有出現任何處于未跟蹤狀態(tài)的新文件,否則 Git 會在這里列出來。 最后,該命令還顯示了當前所在分支,并告訴你這個分支同遠程服務器上對應的分支沒有偏離。 現在,分支名是 “master”,這是默認的分支名。
現在,讓我們在項目下創(chuàng)建一個新的 README 文件。 如果之前并不存在這個文件,使用 git status 命令,你將看到一個新的未跟蹤文件:
$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
在狀態(tài)報告中可以看到新建的 README 文件出現在Untracked files下面。 未跟蹤的文件意味著 Git 在之前的快照(提交)中沒有這些文件;Git 不會自動將之納入跟蹤范圍,除非你明明白白地告訴它“我需要跟蹤該文件”, 這樣的處理讓你不必擔心將生成的二進制文件或其它不想被跟蹤的文件包含進來。 不過現在的例子中,我們確實想要跟蹤管理 README 這個文件。
2.2 跟蹤新文件
使用命令git add開始跟蹤一個文件。 所以,要跟蹤 README 文件,運行:
$ git add README
此時再運行git status命令,會看到 README 文件已被跟蹤,并處于暫存狀態(tài):
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要在Changes to be committed這行下面的,就說明是已暫存狀態(tài)。 如果此時提交,那么該文件此時此刻的版本將被留存在歷史記錄中。 你可能會想起之前我們使用git init后就運行了git add (files) 命令,開始跟蹤當前目錄下的文件。git add命令使用文件或目錄的路徑作為參數;如果參數是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件。
2.3 暫存已修改文件
現在我們來修改一個已被跟蹤的文件。 如果你修改了一個名為 CONTRIBUTING.md 的已被跟蹤的文件,然后運行 git status 命令,會看到下面內容:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
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: CONTRIBUTING.md
文件CONTRIBUTING.md出現在Changes not staged for commit這行下面,說明已跟蹤文件的內容發(fā)生了變化,但還沒有放到暫存區(qū)。 要暫存這次更新,需要運行git add命令。 這是個多功能命令:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時把有沖突的文件標記為已解決狀態(tài)等。 將這個命令理解為“添加內容到下一次提交中”而不是“將一個文件添加到項目中”要更加合適。 現在讓我們運行git add將"CONTRIBUTING.md"放到暫存區(qū),然后再看看git status的輸出:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
現在兩個文件都已暫存,下次提交時就會一并記錄到倉庫。 假設此時,你想要在CONTRIBUTING.md里再加條注釋,重新編輯存盤后,準備好提交。 不過且慢,再運行git status看看:
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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: CONTRIBUTING.md
現在CONTRIBUTING.md文件同時出現在暫存區(qū)和非暫存區(qū)。 這怎么可能呢? 好吧,實際上 Git 只不過暫存了你運行git add命令時的版本, 如果你現在提交,CONTRIBUTING.md 的版本是你最后一次運行git add命令時的那個版本,而不是你運行git commit時,在工作目錄中的當前版本。 所以,運行了git add之后又作了修訂的文件,需要重新運行 git add 把最新版本重新暫存起來:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
2.4 狀態(tài)簡覽
git status命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用git status -s命令或git status --short命令,你將得到一種更為緊湊的格式輸出。 運行git status -s,狀態(tài)報告輸出如下:
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt