【簡介】
版本控制系統(VCS, Version Control System) 可以分為集中式(CVCS, Centralized Version Control System, 如 CVS, Subversion)和分布式(DVCS, Distributed Version Control System,如 Git 等)版本控制系統。
傳統的集中式版本控制系統,本地只保存代碼庫的一個版本拷貝。 所有歷史版本都保存在服務器。GIT 與之最大的不同是,本地不僅保存一個快照,而且保存著整個代碼庫(repository)。因此它可以“離線”工作。
在 Window 上安裝: http://code.google.com/p/msysgit
GIT 起源于 LINUX 開發。Linux 開發早期(1992-2002)沒有使用版本控制工具,直到 2002 年開始使用一個非開源的工具 BitKeeper。一開始這個工具還給 Linux 免費使用,后來想收費了,充滿自由精神 Linux 成員們肯定不會屈服于這個要挾,一怒之下開發了一個自由的版本控制工具。2005 年,GIT 誕生 。
參考:官網:http://git-scm.com/
手冊:http://www.kernel.org/pub/software/scm/git/docs/
參考:http://gitref.org/
ProGit: http://progit.org/book/
【GIT 基礎】
GIT 使用 SHA-1 哈希碼(40個字符)來標識提交,同時保證本次提交后整體(一個快照)的完整性。
文件狀態:
文件狀態分為:未跟蹤 (untracked) 和已跟蹤 (tracked),已跟蹤又分為三種狀態: 已暫存(staged),已修改(modified),已提交(committed)
一般過程如下:
1) 新建文件,該文件狀態為“未跟蹤”,位于工作區;
2) 用 git add a.txt 加入該文件,狀態變為已跟蹤的“已暫存”,位于暫存區;
3) 用 git commit a.txt -m "ha" 提交該文件,狀態變為“已提交”,位于代碼庫(repository )
或者,如果存在修改的情況,增加如下2.1和2.2兩個步驟:
1) 新建文件,該文件狀態為“未跟蹤”,位于工作區;
2) 用 git add a.txt 加入該文件,狀態變為已跟蹤的“已暫存”,位于暫存區;
2.1)編輯該文件并保存,狀態變為“已修改”,位于工作區。(注意,位于暫存區的文件獨立存在!)
2.2) 用 git add a.txt 加入該文件,狀態變為“已暫存”,位于暫存區。(注意,原暫存區的文件被覆蓋!)
3) 用 git commit a.txt -m "ha" 提交該文件,狀態變為“已提交”,位于代碼庫(repository )
考慮更廣泛的情況,狀態遷移圖如下所示:
Git <wbr>使用 <wbr>- <wbr>1. <wbr>文件操作和歷史查看
注意:用 git status 查看目前所有文件的狀態。
GIT 配置:
三種配置范圍類型:
1)所有用戶 --system, 存在 /etc/gitconfig 文件中。(對windows來說,是 msysgit 的安裝目錄)
2)本用戶 --global, 存在 ~/.gitconfig 文件中。(對windows 來說,是 C:\Documents and Settings\$USER)
3)本項目 存在 .git/config 文件中。
注意:后面的重載前面的。例如:用--global設置,可以在所有項目中使用這個設置;如果有一個項目你想使用一個特別的設置,就可以使用不帶參數的 git config 重新設置,則它只作用于這個項目。如果用 git config --list 查看這些設置,可能會列出多個,但最后那個起作用。
用戶信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
文本編輯器
$ git config --global core.editor emacs
查看配置信息
$ git config --list
或者只看一個信息:
$ git config <key>
【常用操作】
(GIT 1.7.4 on Windows)
獲取幫助: $ git help <verb>
初始化倉庫: $ git init
(說明: 如果該目錄有文件,則都會處于“未跟蹤”狀態的。)
克隆倉庫: $ git clone git://github.com/schacon/grit.git
克隆倉庫,并換個名字: $ git clone git://github.com/schacon/grit.git mygrit
跟蹤一個新文件: $ git add readme.txt
說明:
1) 跟蹤之后,該文件狀態是“已暫存”的。 (Changes to be committed:)
2)修改一個已暫存的文件,該文件會出現在兩個記錄區中。
3) 如果跟蹤錯了,想把他刪除(不刪除工作區的),則用 git rm --cached readme.txt。狀態變成“未跟蹤”,如果該文件已經修改了,則加 -f 參數強行刪除暫存區的文件(已修改的文件不被覆蓋)。
跟蹤一組新文件: $ git add *.txt
跟蹤一個目錄中的所有文件: $ git add mydir
說明:如果該目錄下有子目錄,則進行遞歸操作。
修改之后,暫存一個文件: $ git add readme.txt
說明:取消已暫存的文件(已暫存到已修改): $ git reset HEAD readme.txt
忽略某些文件: 在.gitignore 文件中加入下面兩行: *.[oa] *~
*.a # 忽略所有 .a 結尾的文件
!lib.a # 但 lib.a 除外
/TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目錄下的所有文件
doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
注意:.gitignore 文件放在工程的根目錄即可,但是要把它用 git add 加入跟蹤或者提交。
比較:
查看尚未暫存的更新: $ git diff
說明:比較“已修改”和“已暫存(或已提交)”。
查看尚未提交的更新: $ git diff --cached
或 $ git diff --staged
說明:比較“已暫存”和已提交。
提交:
提交更新(只更新暫存中的): $ 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
說明:此命令對已暫存文件沒作用。
刪除文件:
從工作區可以直接刪除文件,這是運行 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 是已提交的文件,則還需要運行 git commit 以確保在代碼庫中刪除。如果該文件尚未提交,則無需運行git commit。
也可以直接使用 git rm 刪除文件,但如何文件處于“已修改” 則需要加 -f
移除已跟蹤文件,恢復到“未跟蹤” $ git rm --cached A.java
說明:如果文件已修改,則需 -f ,并且不覆蓋修改過的內容。
強行移除修改后文件(從暫存區和工作區中刪除): $ git rm -f a.a
移除目錄下的所有文件(遞歸): $ git rm log/\*.log
移除目錄下的所有文件(無遞歸): $ git rm log/*.log
改名(只改工作區和暫存區): $ git mv file1 file2
相當于: $ mv README.txt README
$ git rm README.txt
$ git add README
歷史查看 :
查看提交歷史(全部): $ git log
查看提交歷史,并顯示統計信息: $ git log --stat
查看提交歷史并查看差異: $ git log -p
查看最近2次提交歷史并查看差異: $ git log -p -2
查看最近2周內提交歷史: $ git log --since=2.weeks
查看某個時刻之后的提交歷史: $ git log --since="2008-09-14"
查看某個時刻以前的提交歷史: $ git log --until="2008-09-14"
查看某個作者的提交歷史: $ git log --author="stupid"
其他:
-(n) 僅顯示最近的 n 條提交
--since, --after 僅顯示指定時間之后的提交。
--until, --before 僅顯示指定時間之前的提交。
--author 僅顯示指定作者相關的提交。
--committer 僅顯示指定提交者相關的提交。
例如:
$ 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 提交對象(commit)的完整哈希字串
%h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串
%t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串
%p 父對象的簡短哈希字串
%an 作者(author)的名字
? 作者的電子郵件地址
? 作者修訂日期(可以用 -date= 選項定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
? 提交者的電子郵件地址
? 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說明
查看提交歷史,并圖形化顯示: $ 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 按補丁格式顯示每個更新之間的差異。
--stat 顯示每次更新的文件修改統計信息。
--shortstat 只顯示 --stat 中最后的行數修改添加移除統計。
--name-only 僅在提交信息后顯示已修改的文件清單。
--name-status 顯示新增、修改、刪除的文件清單。
--abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符。
--relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。
--graph 顯示 ASCII 圖形表示的分支合并歷史。
--pretty 使用其他格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(后跟指定格式)。
最重要的是,如果你覺著上面這些查看歷史的命令太難用,你可以使用圖形化工具:gitk,一切都清晰了。