【簡(jiǎn)介】 
版本控制系統(tǒng)(VCS, Version Control System) 可以分為集中式(CVCS, Centralized Version Control System, 如 CVS, Subversion)和分布式(DVCS, Distributed Version Control System,如 Git 等)版本控制系統(tǒng)。
傳統(tǒng)的集中式版本控制系統(tǒng),本地只保存代碼庫(kù)的一個(gè)版本拷貝。 所有歷史版本都保存在服務(wù)器。GIT 與之最大的不同是,本地不僅保存一個(gè)快照,而且保存著整個(gè)代碼庫(kù)(repository)。因此它可以“離線”工作。 
在 Window 上安裝: http://code.google.com/p/msysgit
GIT 起源于 LINUX 開發(fā)。Linux 開發(fā)早期(1992-2002)沒(méi)有使用版本控制工具,直到 2002 年開始使用一個(gè)非開源的工具 BitKeeper。一開始這個(gè)工具還給 Linux 免費(fèi)使用,后來(lái)想收費(fèi)了,充滿自由精神 Linux 成員們肯定不會(huì)屈服于這個(gè)要挾,一怒之下開發(fā)了一個(gè)自由的版本控制工具。2005 年,GIT 誕生 。
 
參考:官網(wǎng):http://git-scm.com/
     手冊(cè):http://www.kernel.org/pub/software/scm/git/docs/
     參考:http://gitref.org/
     ProGit: http://progit.org/book/
【GIT 基礎(chǔ)】
 
GIT 使用 SHA-1 哈希碼(40個(gè)字符)來(lái)標(biāo)識(shí)提交,同時(shí)保證本次提交后整體(一個(gè)快照)的完整性。 
文件狀態(tài):
文件狀態(tài)分為:未跟蹤 (untracked) 和已跟蹤 (tracked),已跟蹤又分為三種狀態(tài): 已暫存(staged),已修改(modified),已提交(committed)
一般過(guò)程如下:
1) 新建文件,該文件狀態(tài)為“未跟蹤”,位于工作區(qū);
2) 用 git add a.txt  加入該文件,狀態(tài)變?yōu)橐迅櫟?#8220;已暫存”,位于暫存區(qū);
3) 用 git commit a.txt -m "ha"  提交該文件,狀態(tài)變?yōu)?#8220;已提交”,位于代碼庫(kù)(repository )
或者,如果存在修改的情況,增加如下2.1和2.2兩個(gè)步驟:
 
1) 新建文件,該文件狀態(tài)為“未跟蹤”,位于工作區(qū);
2) 用 git add a.txt  加入該文件,狀態(tài)變?yōu)橐迅櫟?#8220;已暫存”,位于暫存區(qū);
2.1)編輯該文件并保存,狀態(tài)變?yōu)?#8220;已修改”,位于工作區(qū)。(注意,位于暫存區(qū)的文件獨(dú)立存在!)
2.2) 用 git add a.txt  加入該文件,狀態(tài)變?yōu)?#8220;已暫存”,位于暫存區(qū)。(注意,原暫存區(qū)的文件被覆蓋!)
3) 用 git commit a.txt -m "ha"  提交該文件,狀態(tài)變?yōu)?#8220;已提交”,位于代碼庫(kù)(repository )
考慮更廣泛的情況,狀態(tài)遷移圖如下所示: 
Git <wbr>使用 <wbr>- <wbr>1. <wbr>文件操作和歷史查看
注意:用 git status 查看目前所有文件的狀態(tài)。
GIT 配置:
三種配置范圍類型:
1)所有用戶 --system,   存在 /etc/gitconfig 文件中。(對(duì)windows來(lái)說(shuō),是 msysgit 的安裝目錄)
2)本用戶 --global,    存在 ~/.gitconfig  文件中。(對(duì)windows 來(lái)說(shuō),是 C:\Documents and Settings\$USER)
3)本項(xiàng)目               存在 .git/config 文件中。
注意:后面的重載前面的。例如:用--global設(shè)置,可以在所有項(xiàng)目中使用這個(gè)設(shè)置;如果有一個(gè)項(xiàng)目你想使用一個(gè)特別的設(shè)置,就可以使用不帶參數(shù)的 git config 重新設(shè)置,則它只作用于這個(gè)項(xiàng)目。如果用 git config --list 查看這些設(shè)置,可能會(huì)列出多個(gè),但最后那個(gè)起作用。
用戶信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
文本編輯器
$ git config --global core.editor emacs
查看配置信息
$ git config --list
或者只看一個(gè)信息:
$ git config <key>
【常用操作】 
(GIT 1.7.4 on  Windows)
獲取幫助:                       $ git help <verb>
初始化倉(cāng)庫(kù):                     $ git init
(說(shuō)明: 如果該目錄有文件,則都會(huì)處于“未跟蹤”狀態(tài)的。)
克隆倉(cāng)庫(kù):                       $ git clone git://github.com/schacon/grit.git
克隆倉(cāng)庫(kù),并換個(gè)名字:           $ git clone git://github.com/schacon/grit.git mygrit
跟蹤一個(gè)新文件:                 $ git add readme.txt
說(shuō)明: 
1) 跟蹤之后,該文件狀態(tài)是“已暫存”的。 (Changes to be committed:)
2)修改一個(gè)已暫存的文件,該文件會(huì)出現(xiàn)在兩個(gè)記錄區(qū)中。
3) 如果跟蹤錯(cuò)了,想把他刪除(不刪除工作區(qū)的),則用 git rm --cached readme.txt。狀態(tài)變成“未跟蹤”,如果該文件已經(jīng)修改了,則加  -f 參數(shù)強(qiáng)行刪除暫存區(qū)的文件(已修改的文件不被覆蓋)。
跟蹤一組新文件:                 $ git add *.txt
跟蹤一個(gè)目錄中的所有文件:       $ git add mydir
說(shuō)明:如果該目錄下有子目錄,則進(jìn)行遞歸操作。
修改之后,暫存一個(gè)文件:                           $ git add readme.txt
說(shuō)明:取消已暫存的文件(已暫存到已修改):         $ git reset HEAD readme.txt
忽略某些文件:                   在.gitignore 文件中加入下面兩行:    *.[oa]    *~
*.a       # 忽略所有 .a 結(jié)尾的文件
!lib.a    # 但 lib.a 除外
/TODO     # 僅僅忽略項(xiàng)目根目錄下的 TODO 文件,不包括 subdir/TODO
build/    # 忽略 build/ 目錄下的所有文件
doc/*.txt # 會(huì)忽略 doc/notes.txt 但不包括 doc/server/arch.txt
注意:.gitignore 文件放在工程的根目錄即可,但是要把它用 git add 加入跟蹤或者提交。
 
比較:
查看尚未暫存的更新:                   $ git diff
說(shuō)明:比較“已修改”和“已暫存(或已提交)”。
查看尚未提交的更新:                    $ git diff --cached
      或                               $ git diff --staged
說(shuō)明:比較“已暫存”和已提交。 
 
提交:
提交更新(只更新暫存中的):           $ git commit
提交更新(只更新暫存中的):           $ git commit -m "task12, added implementation for usr mrg."
直接提交更新(更新暫存中的和已修改的): $ git commit -a -m "task12, added implementation forg."
從文件中取注釋:                       $ git commit --file notefile
 
重新獲取:
拋棄已修改,用已提交覆蓋               $ git checkout A.java
說(shuō)明:此命令對(duì)已暫存文件沒(méi)作用。 
 
刪除文件:
從工作區(qū)可以直接刪除文件,這是運(yùn)行 git status, 顯示:
 
  Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
      deleted:    a
可以用 git rm 刪除 a。注意:如果 a 是已提交的文件,則還需要運(yùn)行 git commit 以確保在代碼庫(kù)中刪除。如果該文件尚未提交,則無(wú)需運(yùn)行g(shù)it commit。 
也可以直接使用 git rm 刪除文件,但如何文件處于“已修改” 則需要加 -f
移除已跟蹤文件,恢復(fù)到“未跟蹤”       $ git rm --cached A.java
說(shuō)明:如果文件已修改,則需 -f ,并且不覆蓋修改過(guò)的內(nèi)容。 
強(qiáng)行移除修改后文件(從暫存區(qū)和工作區(qū)中刪除):      $ git rm -f a.a 
移除目錄下的所有文件(遞歸):                    $ git rm log/\*.log
移除目錄下的所有文件(無(wú)遞歸):                  $ git rm log/*.log
 
改名(只改工作區(qū)和暫存區(qū)):                      $ git mv file1 file2
相當(dāng)于:                                          $ mv README.txt README
                                                  $ git rm README.txt
                                                  $ git add README
歷史查看 :
查看提交歷史(全部):                             $ git log
查看提交歷史,并顯示統(tǒng)計(jì)信息:                    $ git log --stat
查看提交歷史并查看差異:                          $ git log -p
查看最近2次提交歷史并查看差異:                   $ git log -p -2
查看最近2周內(nèi)提交歷史:                           $ git log --since=2.weeks
查看某個(gè)時(shí)刻之后的提交歷史:                      $ git log --since="2008-09-14"
查看某個(gè)時(shí)刻以前的提交歷史:                      $ git log --until="2008-09-14"
查看某個(gè)作者的提交歷史:                          $ git log --author="stupid"
其他:
-(n) 僅顯示最近的 n 條提交
--since, --after 僅顯示指定時(shí)間之后的提交。
--until, --before 僅顯示指定時(shí)間之前的提交。
--author 僅顯示指定作者相關(guān)的提交。
--committer 僅顯示指定提交者相關(guān)的提交。
例如:
$ git log --pretty="%h:%s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
 
查看提交歷史,并單行顯示:                        $ git log --pretty=oneline
查看提交歷史,并格式化顯示:                      $ git log --pretty=format:"%h - %an, %ar : %s"
例如:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
 
%H 提交對(duì)象(commit)的完整哈希字串
%h 提交對(duì)象的簡(jiǎn)短哈希字串
%T 樹對(duì)象(tree)的完整哈希字串
%t 樹對(duì)象的簡(jiǎn)短哈希字串
%P 父對(duì)象(parent)的完整哈希字串
%p 父對(duì)象的簡(jiǎn)短哈希字串
%an 作者(author)的名字
? 作者的電子郵件地址
? 作者修訂日期(可以用 -date= 選項(xiàng)定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
? 提交者的電子郵件地址
? 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說(shuō)明
 
查看提交歷史,并圖形化顯示:               $ git log --pretty=format:"%h %s" --graph
例如:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local
 
其它:
-p 按補(bǔ)丁格式顯示每個(gè)更新之間的差異。
--stat 顯示每次更新的文件修改統(tǒng)計(jì)信息。
--shortstat 只顯示 --stat 中最后的行數(shù)修改添加移除統(tǒng)計(jì)。
--name-only 僅在提交信息后顯示已修改的文件清單。
--name-status 顯示新增、修改、刪除的文件清單。
--abbrev-commit 僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符。
--relative-date 使用較短的相對(duì)時(shí)間顯示(比如,“2 weeks ago”)。
--graph 顯示 ASCII 圖形表示的分支合并歷史。
--pretty 使用其他格式顯示歷史提交信息。可用的選項(xiàng)包括 oneline,short,full,fuller 和 format(后跟指定格式)。
 
最重要的是,如果你覺(jué)著上面這些查看歷史的命令太難用,你可以使用圖形化工具:gitk,一切都清晰了。