鍍金池/ 教程/ Java/ 起步
起步
Git 分支
自定義 Git
Git 基礎(chǔ)
Git 工具
Git 與其他系統(tǒng)
服務(wù)器上的 Git
Git 內(nèi)部原理
分布式 Git

起步

本章介紹開始使用 Git 前的相關(guān)知識。我們會先了解一些版本控制工具的歷史背景,然后試著讓 Git 在你的系統(tǒng)上跑起來,直到最后配置好,可以正常開始開發(fā)工作。讀完本章,你就會明白為什么 Git 會如此流行,為什么你應(yīng)該立即開始使用它。

關(guān)于版本控制

什么是版本控制?我為什么要關(guān)心它呢?版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。在本書所展示的例子中,我們僅對保存著軟件源代碼的文本文件作版本控制管理,但實(shí)際上,你可以對任何類型的文件進(jìn)行版本控制。

如果你是位圖形或網(wǎng)頁設(shè)計(jì)師,可能會需要保存某一幅圖片或頁面布局文件的所有修訂版本(這或許是你非常渴望擁有的功能)。采用版本控制系統(tǒng)(VCS)是個(gè)明智的選擇。有了它你就可以將某個(gè)文件回溯到之前的狀態(tài),甚至將整個(gè)項(xiàng)目都回退到過去某個(gè)時(shí)間點(diǎn)的狀態(tài)。你可以比較文件的變化細(xì)節(jié),查出最后是誰修改了哪個(gè)地方,從而找出導(dǎo)致怪異問題出現(xiàn)的原因,又是誰在何時(shí)報(bào)告了某個(gè)功能缺陷等等。使用版本控制系統(tǒng)通常還意味著,就算你亂來一氣把整個(gè)項(xiàng)目中的文件改的改刪的刪,你也照樣可以輕松恢復(fù)到原先的樣子。但額外增加的工作量卻微乎其微。

本地版本控制系統(tǒng)

許多人習(xí)慣用復(fù)制整個(gè)項(xiàng)目目錄的方式來保存不同的版本,或許還會改名加上備份時(shí)間以示區(qū)別。這么做唯一的好處就是簡單。不過壞處也不少:有時(shí)候會混淆所在的工作目錄,一旦弄錯(cuò)文件丟了數(shù)據(jù)就沒法撤銷恢復(fù)。

為了解決這個(gè)問題,人們很久以前就開發(fā)了許多種本地版本控制系統(tǒng),大多都是采用某種簡單的數(shù)據(jù)庫來記錄文件的歷次更新差異(見圖 1-1)。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0101-tn.png" alt="" />

圖 1-1. 本地版本控制系統(tǒng)

其中最流行的一種叫做 rcs,現(xiàn)今許多計(jì)算機(jī)系統(tǒng)上都還看得到它的蹤影。甚至在流行的 Mac OS X 系統(tǒng)上安裝了開發(fā)者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件補(bǔ)?。╬atch)。文件補(bǔ)丁是一種特定格式的文本文件,記錄著對應(yīng)文件修訂前后的內(nèi)容變化。所以,根據(jù)每次修訂后的補(bǔ)丁,rcs 可以通過不斷打補(bǔ)丁,計(jì)算出各個(gè)版本的文件內(nèi)容。

集中化的版本控制系統(tǒng)

接下來人們又遇到一個(gè)問題,如何讓在不同系統(tǒng)上的開發(fā)者協(xié)同工作?于是,集中化的版本控制系統(tǒng)( Centralized Version Control Systems,簡稱 CVCS )應(yīng)運(yùn)而生。這類系統(tǒng),諸如 CVS,Subversion 以及 Perforce 等,都有一個(gè)單一的集中管理的服務(wù)器,保存所有文件的修訂版本,而協(xié)同工作的人們都通過客戶端連到這臺服務(wù)器,取出最新的文件或者提交更新。多年以來,這已成為版本控制系統(tǒng)的標(biāo)準(zhǔn)做法(見圖 1-2)。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0102-tn.png" alt="" />

圖 1-2. 集中化的版本控制系統(tǒng)

這種做法帶來了許多好處,特別是相較于老式的本地 VCS 來說?,F(xiàn)在,每個(gè)人都可以在一定程度上看到項(xiàng)目中的其他人正在做些什么。而管理員也可以輕松掌控每個(gè)開發(fā)者的權(quán)限,并且管理一個(gè) CVCS 要遠(yuǎn)比在各個(gè)客戶端上維護(hù)本地?cái)?shù)據(jù)庫來得輕松容易。

事分兩面,有好有壞。這么做最顯而易見的缺點(diǎn)是中央服務(wù)器的單點(diǎn)故障。如果宕機(jī)一小時(shí),那么在這一小時(shí)內(nèi),誰都無法提交更新,也就無法協(xié)同工作。要是中央服務(wù)器的磁盤發(fā)生故障,碰巧沒做備份,或者備份不夠及時(shí),就會有丟失數(shù)據(jù)的風(fēng)險(xiǎn)。最壞的情況是徹底丟失整個(gè)項(xiàng)目的所有歷史更改記錄,而被客戶端偶然提取出來的保存在本地的某些快照數(shù)據(jù)就成了恢復(fù)數(shù)據(jù)的希望。但這樣的話依然是個(gè)問題,你不能保證所有的數(shù)據(jù)都已經(jīng)有人事先完整提取出來過。本地版本控制系統(tǒng)也存在類似問題,只要整個(gè)項(xiàng)目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風(fēng)險(xiǎn)。

分布式版本控制系統(tǒng)

于是分布式版本控制系統(tǒng)( Distributed Version Control System,簡稱 DVCS )面世了。在這類系統(tǒng)中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個(gè)鏡像出來的本地倉庫恢復(fù)。因?yàn)槊恳淮蔚奶崛〔僮?,?shí)際上都是一次對代碼倉庫的完整備份(見圖 1-3)。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0103-tn.png" alt="" />

圖 1-3. 分布式版本控制系統(tǒng)

更進(jìn)一步,許多這類系統(tǒng)都可以指定和若干不同的遠(yuǎn)端代碼倉庫進(jìn)行交互。籍此,你就可以在同一個(gè)項(xiàng)目中,分別和不同工作小組的人相互協(xié)作。你可以根據(jù)需要設(shè)定不同的協(xié)作流程,比如層次模型式的工作流,而這在以前的集中式系統(tǒng)中是無法實(shí)現(xiàn)的。

Git 簡史

同生活中的許多偉大事件一樣,Git 誕生于一個(gè)極富紛爭大舉創(chuàng)新的年代。Linux 內(nèi)核開源項(xiàng)目有著為數(shù)眾廣的參與者。絕大多數(shù)的 Linux 內(nèi)核維護(hù)工作都花在了提交補(bǔ)丁和保存歸檔的繁瑣事務(wù)上(1991-2002年間)。到 2002 年,整個(gè)項(xiàng)目組開始啟用分布式版本控制系統(tǒng) BitKeeper 來管理和維護(hù)代碼。

到了 2005 年,開發(fā) BitKeeper 的商業(yè)公司同 Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束,他們收回了免費(fèi)使用 BitKeeper 的權(quán)力。這就迫使 Linux 開源社區(qū)(特別是 Linux 的締造者 Linus Torvalds )不得不吸取教訓(xùn),只有開發(fā)一套屬于自己的版本控制系統(tǒng)才不至于重蹈覆轍。他們對新的系統(tǒng)制訂了若干目標(biāo):

  • 速度
  • 簡單的設(shè)計(jì)
  • 對非線性開發(fā)模式的強(qiáng)力支持(允許上千個(gè)并行開發(fā)的分支)
  • 完全分布式
  • 有能力高效管理類似 Linux 內(nèi)核一樣的超大規(guī)模項(xiàng)目(速度和數(shù)據(jù)量)

自誕生于 2005 年以來,Git 日臻成熟完善,在高度易用的同時(shí),仍然保留著初期設(shè)定的目標(biāo)。它的速度飛快,極其適合管理大項(xiàng)目,它還有著令人難以置信的非線性分支管理系統(tǒng)(見第三章),可以應(yīng)付各種復(fù)雜的項(xiàng)目開發(fā)需求。

Git 基礎(chǔ)

那么,簡單地說,Git 究竟是怎樣的一個(gè)系統(tǒng)呢?請注意,接下來的內(nèi)容非常重要,若是理解了 Git 的思想和基本工作原理,用起來就會知其所以然,游刃有余。在開始學(xué)習(xí) Git 的時(shí)候,請不要嘗試把各種概念和其他版本控制系統(tǒng)(諸如 Subversion 和 Perforce 等)相比擬,否則容易混淆每個(gè)操作的實(shí)際意義。Git 在保存和處理各種信息的時(shí)候,雖然操作起來的命令形式非常相近,但它與其他版本控制系統(tǒng)的做法頗為不同。理解這些差異將有助于你準(zhǔn)確地使用 Git 提供的各種工具。

直接記錄快照,而非差異比較

Git 和其他版本控制系統(tǒng)的主要差別在于,Git 只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類系統(tǒng)(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內(nèi)容,請看圖 1-4。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0104-tn.png" alt="" />

圖 1-4. 其他系統(tǒng)在每個(gè)版本中記錄著各個(gè)文件的具體差異

Git 并不保存這些前后變化的差異數(shù)據(jù)。實(shí)際上,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中。每次提交更新時(shí),它會縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接。Git 的工作方式就像圖 1-5 所示。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0105-tn.png" alt="" />

圖 1-5. Git 保存每次更新時(shí)的文件快照

這是 Git 同其他系統(tǒng)的重要區(qū)別。它完全顛覆了傳統(tǒng)版本控制的套路,并對各個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式作了新的設(shè)計(jì)。Git 更像是個(gè)小型的文件系統(tǒng),但它同時(shí)還提供了許多以此為基礎(chǔ)的超強(qiáng)工具,而不只是一個(gè)簡單的 VCS。稍后在第三章討論 Git 分支管理的時(shí)候,我們會再看看這樣的設(shè)計(jì)究竟會帶來哪些好處。

近乎所有操作都是本地執(zhí)行

在 Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用連網(wǎng)。但如果用 CVCS 的話,差不多所有操作都需要連接網(wǎng)絡(luò)。因?yàn)?Git 在本地磁盤上就保存著所有當(dāng)前項(xiàng)目的歷史更新,所以處理起來速度飛快。

舉個(gè)例子,如果要瀏覽項(xiàng)目的歷史更新摘要,Git 不用跑到外面的服務(wù)器上去取數(shù)據(jù)回來,而直接從本地?cái)?shù)據(jù)庫讀取后展示給你看。所以任何時(shí)候你都可以馬上翻閱,無需等待。如果想要看當(dāng)前版本的文件和一個(gè)月前的版本之間有何差異,Git 會取出一個(gè)月前的快照和當(dāng)前文件作一次差異運(yùn)算,而不用請求遠(yuǎn)程服務(wù)器來做這件事,或是把老版本的文件拉到本地來作比較。

用 CVCS 的話,沒有網(wǎng)絡(luò)或者斷開 VPN 你就無法做任何事情。但用 Git 的話,就算你在飛機(jī)或者火車上,都可以非常愉快地頻繁提交更新,等到了有網(wǎng)絡(luò)的時(shí)候再上傳到遠(yuǎn)程倉庫。同樣,在回家的路上,不用連接 VPN 你也可以繼續(xù)工作。換作其他版本控制系統(tǒng),這么做幾乎不可能,抑或非常麻煩。比如 Perforce,如果不連到服務(wù)器,幾乎什么都做不了(譯注:默認(rèn)無法發(fā)出命令 p4 edit file 開始編輯文件,因?yàn)?Perforce 需要聯(lián)網(wǎng)通知系統(tǒng)聲明該文件正在被誰修訂。但實(shí)際上手工修改文件權(quán)限可以繞過這個(gè)限制,只是完成后還是無法提交更新。);如果是 Subversion 或 CVS,雖然可以編輯文件,但無法提交更新,因?yàn)閿?shù)據(jù)庫在網(wǎng)絡(luò)上。看上去好像這些都不是什么大問題,但實(shí)際體驗(yàn)過之后,你就會驚喜地發(fā)現(xiàn),這其實(shí)是會帶來很大不同的。

時(shí)刻保持?jǐn)?shù)據(jù)完整性

在保存到 Git 之前,所有數(shù)據(jù)都要進(jìn)行內(nèi)容的校驗(yàn)和(checksum)計(jì)算,并將此結(jié)果作為數(shù)據(jù)的唯一標(biāo)識和索引。換句話說,不可能在你修改了文件或目錄之后,Git 一無所知。這項(xiàng)特性作為 Git 的設(shè)計(jì)哲學(xué),建在整體架構(gòu)的最底層。所以如果文件在傳輸時(shí)變得不完整,或者磁盤損壞導(dǎo)致文件數(shù)據(jù)缺失,Git 都能立即察覺。

Git 使用 SHA-1 算法計(jì)算數(shù)據(jù)的校驗(yàn)和,通過對文件的內(nèi)容或目錄的結(jié)構(gòu)計(jì)算出一個(gè) SHA-1 哈希值,作為指紋字符串。該字串由 40 個(gè)十六進(jìn)制字符(0-9 及 a-f)組成,看起來就像是:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 的工作完全依賴于這類指紋字串,所以你會經(jīng)??吹竭@樣的哈希值。實(shí)際上,所有保存在 Git 數(shù)據(jù)庫中的東西都是用此哈希值來作索引的,而不是靠文件名。

多數(shù)操作僅添加數(shù)據(jù)

常用的 Git 操作大多僅僅是把數(shù)據(jù)添加到數(shù)據(jù)庫。因?yàn)槿魏我环N不可逆的操作,比如刪除數(shù)據(jù),都會使回退或重現(xiàn)歷史版本變得困難重重。在別的 VCS 中,若還未提交更新,就有可能丟失或者混淆一些修改的內(nèi)容,但在 Git 里,一旦提交快照之后就完全不用擔(dān)心丟失數(shù)據(jù),特別是養(yǎng)成定期推送到其他倉庫的習(xí)慣的話。

這種高可靠性令我們的開發(fā)工作安心不少,盡管去做各種試驗(yàn)性的嘗試好了,再怎樣也不會弄丟數(shù)據(jù)。至于 Git 內(nèi)部究竟是如何保存和恢復(fù)數(shù)據(jù)的,我們會在第九章討論 Git 內(nèi)部原理時(shí)再作詳述。

文件的三種狀態(tài)

好,現(xiàn)在請注意,接下來要講的概念非常重要。對于任何一個(gè)文件,在 Git 內(nèi)都只有三種狀態(tài):已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了;已修改表示修改了某個(gè)文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中。

由此我們看到 Git 管理項(xiàng)目時(shí),文件流轉(zhuǎn)的三個(gè)工作區(qū)域:Git 的工作目錄,暫存區(qū)域,以及本地倉庫。

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0106-tn.png" alt="" />

圖 1-6. 工作目錄,暫存區(qū)域,以及本地倉庫

每個(gè)項(xiàng)目都有一個(gè) Git 目錄(譯注:如果 git clone 出來的話,就是其中 .git 的目錄;如果 git clone --bare 的話,新建的目錄本身就是 Git 目錄。),它是 Git 用來保存元數(shù)據(jù)和對象數(shù)據(jù)庫的地方。該目錄非常重要,每次克隆鏡像倉庫的時(shí)候,實(shí)際拷貝的就是這個(gè)目錄里面的數(shù)據(jù)。

從項(xiàng)目中取出某個(gè)版本的所有文件和目錄,用以開始后續(xù)工作的叫做工作目錄。這些文件實(shí)際上都是從 Git 目錄中的壓縮對象數(shù)據(jù)庫中提取出來的,接下來就可以在工作目錄中對這些文件進(jìn)行編輯。

所謂的暫存區(qū)域只不過是個(gè)簡單的文件,一般都放在 Git 目錄中。有時(shí)候人們會把這個(gè)文件叫做索引文件,不過標(biāo)準(zhǔn)說法還是叫暫存區(qū)域。

基本的 Git 工作流程如下:

  1. 在工作目錄中修改某些文件。
  2. 對修改后的文件進(jìn)行快照,然后保存到暫存區(qū)域。
  3. 提交更新,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲到 Git 目錄中。

所以,我們可以從文件所處的位置來判斷狀態(tài):如果是 Git 目錄中保存著的特定版本文件,就屬于已提交狀態(tài);如果作了修改并已放入暫存區(qū)域,就屬于已暫存狀態(tài);如果自上次取出后,作了修改但還沒有放到暫存區(qū)域,就是已修改狀態(tài)。到第二章的時(shí)候,我們會進(jìn)一步了解其中細(xì)節(jié),并學(xué)會如何根據(jù)文件狀態(tài)實(shí)施后續(xù)操作,以及怎樣跳過暫存直接提交。

安裝 Git

是時(shí)候動手嘗試下 Git 了,不過得先安裝好它。有許多種安裝方式,主要分為兩種,一種是通過編譯源代碼來安裝;另一種是使用為特定平臺預(yù)編譯好的安裝包。

從源代碼安裝

若是條件允許,從源代碼安裝有很多好處,至少可以安裝最新的版本。Git 的每個(gè)版本都在不斷嘗試改進(jìn)用戶體驗(yàn),所以能通過源代碼自己編譯安裝最新版本就再好不過了。有些 Linux 版本自帶的安裝包更新起來并不及時(shí),所以除非你在用最新的 distro 或者 backports,那么從源代碼安裝其實(shí)該算是最佳選擇。

Git 的工作需要調(diào)用 curl,zlib,openssl,expat,libiconv 等庫的代碼,所以需要先安裝這些依賴工具。在有 yum 的系統(tǒng)上(比如 Fedora)或者有 apt-get 的系統(tǒng)上(比如 Debian 體系),可以用下面的命令安裝:

$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

之后,從下面的 Git 官方站點(diǎn)下載最新版本源代碼:

http://git-scm.com/download

然后編譯并安裝:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

現(xiàn)在已經(jīng)可以用 git 命令了,用 git 把 Git 項(xiàng)目倉庫克隆到本地,以便日后隨時(shí)更新:

$ git clone git://git.kernel.org/pub/scm/git/git.git

在 Linux 上安裝

如果要在 Linux 上安裝預(yù)編譯好的 Git 二進(jìn)制安裝包,可以直接用系統(tǒng)提供的包管理工具。在 Fedora 上用 yum 安裝:

$ yum install git-core

在 Ubuntu 這類 Debian 體系的系統(tǒng)上,可以用 apt-get 安裝:

$ apt-get install git

在 Mac 上安裝

在 Mac 上安裝 Git 有兩種方式。最容易的當(dāng)屬使用圖形化的 Git 安裝工具,界面如圖 1-7,下載地址在:

http://sourceforge.net/projects/git-osx-installer/

http://wiki.jikexueyuan.com/project/pro-git/images/18333fig0107-tn.png" alt="" />

圖 1-7. Git OS X 安裝工具

另一種是通過 MacPorts (http://www.macports.org) 安裝。如果已經(jīng)裝好了 MacPorts,用下面的命令安裝 Git:

$ sudo port install git-core +svn +doc +bash_completion +gitweb

這種方式就不需要再自己安裝依賴庫了,Macports 會幫你搞定這些麻煩事。一般上面列出的安裝選項(xiàng)已經(jīng)夠用,要是你想用 Git 連接 Subversion 的代碼倉庫,還可以加上 +svn 選項(xiàng),具體將在第八章作介紹。(譯注:還有一種是使用 homebrew(https://github.com/mxcl/homebrew):brew install git。)

在 Windows 上安裝

在 Windows 上安裝 Git 同樣輕松,有個(gè)叫做 msysGit 的項(xiàng)目提供了安裝包,可以到 GitHub 的頁面上下載 exe 安裝文件并運(yùn)行:

http://msysgit.github.com/

完成安裝之后,就可以使用命令行的 git 工具(已經(jīng)自帶了 ssh 客戶端)了,另外還有一個(gè)圖形界面的 Git 項(xiàng)目管理工具。

給 Windows 用戶的敬告:你應(yīng)該在 msysGit 提供的 Unix 風(fēng)格的 shell 來運(yùn)行 Git。在 Unix 風(fēng)格的 shell 中,可以使用本書中提及的復(fù)雜多行的命令。對于那些需要在 Windows 命令行中使用 Git 的用戶,必須注意:在參數(shù)中間有空格的時(shí)候,必須使用雙引號將參數(shù)括起來(在 Linux 中是單引號);另外,如果揚(yáng)抑符(^)作為參數(shù)的結(jié)尾,并且作為這一行的最后一個(gè)字符,則這個(gè)參數(shù)也需要用雙引號括起來。因?yàn)閾P(yáng)抑符在 Windows 命令行中表示續(xù)行(譯注:即下一行為這一行命令的繼續(xù))。

初次運(yùn)行 Git 前的配置

一般在新的系統(tǒng)上,我們都需要先配置下自己的 Git 工作環(huán)境。配置工作只需一次,以后升級時(shí)還會沿用現(xiàn)在的配置。當(dāng)然,如果需要,你隨時(shí)可以用相同的命令修改已有的配置。

Git 提供了一個(gè)叫做 git config 的工具(譯注:實(shí)際是 git-config 命令,只不過可以通過 git 加一個(gè)名字來呼叫此命令。),專門用來配置或讀取相應(yīng)的工作環(huán)境變量。而正是由這些環(huán)境變量,決定了 Git 在各個(gè)環(huán)節(jié)的具體工作方式和行為。這些變量可以存放在以下三個(gè)不同的地方:

  • /etc/gitconfig 文件:系統(tǒng)中對所有用戶都普遍適用的配置。若使用 git config 時(shí)用 --system 選項(xiàng),讀寫的就是這個(gè)文件。
  • ~/.gitconfig 文件:用戶目錄下的配置文件只適用于該用戶。若使用 git config 時(shí)用 --global 選項(xiàng),讀寫的就是這個(gè)文件。
  • 當(dāng)前項(xiàng)目的 Git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當(dāng)前項(xiàng)目有效。每一個(gè)級別的配置都會覆蓋上層的相同配置,所以 .git/config 里的配置會覆蓋 /etc/gitconfig 中的同名變量。

在 Windows 系統(tǒng)上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,一般都是 C:\Documents and Settings\$USER。此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當(dāng)初 Git 裝在什么目錄,就以此作為根目錄來定位。

用戶信息

第一個(gè)要配置的是你個(gè)人的用戶名稱和電子郵件地址。這兩條配置很重要,每次 Git 提交時(shí)都會引用這兩條信息,說明是誰提交了更新,所以會隨更新內(nèi)容一起被永久納入歷史記錄:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

如果用了 --global 選項(xiàng),那么更改的配置文件就是位于你用戶主目錄下的那個(gè),以后你所有的項(xiàng)目都會默認(rèn)使用這里配置的用戶信息。如果要在某個(gè)特定的項(xiàng)目中使用其他名字或者電郵,只要去掉 --global 選項(xiàng)重新配置即可,新的設(shè)定保存在當(dāng)前項(xiàng)目的 .git/config 文件里。

文本編輯器

接下來要設(shè)置的是默認(rèn)使用的文本編輯器。Git 需要你輸入一些額外消息的時(shí)候,會自動調(diào)用一個(gè)外部文本編輯器給你用。默認(rèn)會使用操作系統(tǒng)指定的默認(rèn)編輯器,一般可能會是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的話,可以重新設(shè)置:

$ git config --global core.editor emacs

差異分析工具

還有一個(gè)比較常用的是,在解決合并沖突時(shí)使用哪種差異分析工具。比如要改用 vimdiff 的話:

$ git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的輸出信息。當(dāng)然,你也可以指定使用自己開發(fā)的工具,具體怎么做可以參閱第七章。

查看配置信息

要檢查已有的配置信息,可以使用 git config --list 命令:

$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

有時(shí)候會看到重復(fù)的變量名,那就說明它們來自不同的配置文件(比如 /etc/gitconfig~/.gitconfig),不過最終 Git 實(shí)際采用的是最后一個(gè)。

也可以直接查閱某個(gè)環(huán)境變量的設(shè)定,只要把特定的名字跟在后面即可,像這樣:

$ git config user.name
Scott Chacon

獲取幫助

想了解 Git 的各式工具該怎么用,可以閱讀它們的使用幫助,方法有三:

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

比如,要學(xué)習(xí) config 命令可以怎么用,運(yùn)行:

$ git help config

我們隨時(shí)都可以瀏覽這些幫助信息而無需連網(wǎng)。 不過,要是你覺得還不夠,可以到 Freenode IRC 服務(wù)器(irc.freenode.net)上的 #git#github 頻道尋求他人幫助。這兩個(gè)頻道上總有著上百號人,大多都有著豐富的 Git 知識,并且樂于助人。

小結(jié)

至此,你該對 Git 有了點(diǎn)基本認(rèn)識,包括它和以前你使用的 CVCS 之間的差別?,F(xiàn)在,在你的系統(tǒng)上應(yīng)該已經(jīng)裝好了 Git,設(shè)置了自己的名字和電郵。接下來讓我們繼續(xù)學(xué)習(xí) Git 的基礎(chǔ)知識。

上一篇:Git 基礎(chǔ)下一篇:分布式 Git