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

起步

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

關(guān)于版本控制

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

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

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

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

為了解決這個(gè)問(wèn)題,人們很久以前就開(kāi)發(fā)了許多種本地版本控制系統(tǒng),大多都是采用某種簡(jiǎn)單的數(shù)據(jù)庫(kù)來(lái)記錄文件的歷次更新差異(見(jiàn)圖 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)上安裝了開(kāi)發(fā)者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件補(bǔ)丁(patch)。文件補(bǔ)丁是一種特定格式的文本文件,記錄著對(duì)應(yīng)文件修訂前后的內(nèi)容變化。所以,根據(jù)每次修訂后的補(bǔ)丁,rcs 可以通過(guò)不斷打補(bǔ)丁,計(jì)算出各個(gè)版本的文件內(nèi)容。

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

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

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

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

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

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

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

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

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

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

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

Git 簡(jiǎn)史

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

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

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

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

Git 基礎(chǔ)

那么,簡(jiǎn)單地說(shuō),Git 究竟是怎樣的一個(gè)系統(tǒng)呢?請(qǐng)注意,接下來(lái)的內(nèi)容非常重要,若是理解了 Git 的思想和基本工作原理,用起來(lái)就會(huì)知其所以然,游刃有余。在開(kāi)始學(xué)習(xí) Git 的時(shí)候,請(qǐng)不要嘗試把各種概念和其他版本控制系統(tǒng)(諸如 Subversion 和 Perforce 等)相比擬,否則容易混淆每個(gè)操作的實(shí)際意義。Git 在保存和處理各種信息的時(shí)候,雖然操作起來(lái)的命令形式非常相近,但它與其他版本控制系統(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)容,請(qǐng)看圖 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í),它會(huì)縱覽一遍所有文件的指紋信息并對(duì)文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒(méi)有變化,Git 不會(huì)再次保存,而只對(duì)上次保存的快照作一鏈接。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)版本控制的套路,并對(duì)各個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式作了新的設(shè)計(jì)。Git 更像是個(gè)小型的文件系統(tǒng),但它同時(shí)還提供了許多以此為基礎(chǔ)的超強(qiáng)工具,而不只是一個(gè)簡(jiǎn)單的 VCS。稍后在第三章討論 Git 分支管理的時(shí)候,我們會(huì)再看看這樣的設(shè)計(jì)究竟會(huì)帶來(lái)哪些好處。

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

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

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

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

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

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

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

24b9da6552252987aa493b52f8696cd6d3b00373

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

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

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

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

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

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

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

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

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

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

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

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

基本的 Git 工作流程如下:

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

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

安裝 Git

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

從源代碼安裝

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

Git 的工作需要調(diào)用 curl,zlib,openssl,expat,libiconv 等庫(kù)的代碼,所以需要先安裝這些依賴工具。在有 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)目倉(cāng)庫(kù)克隆到本地,以便日后隨時(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 安裝工具

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

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

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

在 Windows 上安裝

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

http://msysgit.github.com/

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

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

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

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

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

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

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

用戶信息

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

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

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

文本編輯器

接下來(lái)要設(shè)置的是默認(rèn)使用的文本編輯器。Git 需要你輸入一些額外消息的時(shí)候,會(huì)自動(dòng)調(diào)用一個(gè)外部文本編輯器給你用。默認(rèn)會(huì)使用操作系統(tǒng)指定的默認(rèn)編輯器,一般可能會(huì)是 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)然,你也可以指定使用自己開(kāi)發(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í)候會(huì)看到重復(fù)的變量名,那就說(shuō)明它們來(lái)自不同的配置文件(比如 /etc/gitconfig~/.gitconfig),不過(guò)最終 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ú)需連網(wǎng)。 不過(guò),要是你覺(jué)得還不夠,可以到 Freenode IRC 服務(wù)器(irc.freenode.net)上的 #git#github 頻道尋求他人幫助。這兩個(gè)頻道上總有著上百號(hào)人,大多都有著豐富的 Git 知識(shí),并且樂(lè)于助人。

小結(jié)

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

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