Pro Git翻譯——第一章、第二章


前言:翻譯自《Pro Git》。正在學習Git,於是打算翻譯這篇文檔。一方面鍛煉自己英文文檔閱讀能力,翻譯成中文也可以方面別人。正所謂贈人玫瑰,手有余香。鑒於本人水平有限,當然是不可能達到信、達、雅的水准。不過在翻譯過程中,我會盡量保證遵循原文,有些不好直譯的部分我會根據理解意譯,對於有些實在不知道用中文怎么去表述但是不影響所講述內容的英文,我可能會直接忽略掉。此外,對於沒有把握的專有名詞,我會給出翻譯的同時保留原文。

 

1. 簡介

此處省略若干字……

2. 起步

這一章的內容主要關於如何開始使用Git。我們首先要講一些關於版本控制工具的背景,然后講解如何在你的系統上讓Git運行起來,最后講講使用之前需要做的一些設置。在本章的末尾,你會明白為什么Git會流行起來,而你為什么應該用它。

2.1 關於版本控制

什么是版本控制,為什么你需要關注它?版本控制是能記錄一個或者一組文件隨着時間推移所發生的變化並且方便日后回憶起某個特定版本的系統。舉例來說,在這本書中,你會使用軟件源代碼作為被版本管理控制的文件,然而實際上,你可以對幾乎電腦上任何類型的文件進行版本控制。

如果你是一個圖形或者web設計師,你希望能夠保存一張圖片或者一個布局的每個版本,那么使用一個版本控制系統(Version Control System)則是很明智的選擇。版本控制系統允許你將文件恢復到之前的狀態,恢復整個項目至之前的狀態,比較隨着時間推移發生的變化,看看是誰最后修改了什么東西導致出問題的,誰在何時報告了一個缺陷等等。使用版本控制系統還意味着如果你把東西弄亂了或者弄丟了你可以輕松的恢復他們。而完成這一切只需要很小的開銷。

2.1.1本地版本控制系統

許多人進行版本控制的方法就是將文件拷貝到另外一個目錄(或者如果他夠聰明的話,拷貝到一個帶有時間戳的目錄),這種方法很常見,因為他實現簡單,但是這種方式也是非常容易出錯的。你很容易忘了當前正在那個目錄從而不小心寫入錯誤的文件或者干脆將不想拷貝的文件拷貝進去了。

要對付這個問題,程序員們在很久以前就開發出了具有一個小型數據庫的本地版本控制系統來保存文件的所有變化來進行版本控制,見圖1-1。

clip_image001

一個叫做rcs的系統調用是這類VCS工具中非常受歡迎的一個。這個系統調用至今仍然分布在許多的計算機中。甚至在非常受歡迎的MacOS X操作系統中,只要你裝了開發者工具,就包含了這個命令。這個工具的基本思路就是跟蹤一個版本與另一個版本之間補丁集(patch set,也就是文件之間的不同),並且在硬盤上以特殊的形式記錄下來;然后,它可以根據一個個不定重新看到每個版本文件的內容。

2.1.2 集中式版本控制系統

接下來碰到的問題就是需要和別的系統上的開發人員協作。為了解決這個問題,人們開發出了集中式版本控制系統(Centralized Version Control Systems,CVCSs)。這些版本控制系統,例如CVS、SVN和Perforce有一台包含了所有具有版本號的文件的服務器,和若干個從中央簽出(check out)文件的客戶端。這種模式在很長一段時間成為了版本控制的標准,如圖1-2。

clip_image002

這種模式有許多優點,尤其是相比本地版本控制管理來說。例如,每個人一定程度上知道這個項目中別人在干些什么事情。管理員可以細粒度地控制每個人能干什么,而管理一個CVCS比和每個客戶端的本地數據庫打交道要簡單多了。

盡管如此,這種模式也有一些知名的缺點。最明顯的一個就是中央服務器的故障。如果中央服務器宕機一小時,那么這段時間誰也不能和別人協同工作,也沒辦法保存他們正在處理的文件的版本信息。如果中央服務器的硬盤發生損壞,而這時候並沒有保存合適的備份,那么你慘了,出了少數客戶端上可能保存的幾個項目快照(Snapshots),其他所有的東西都丟了——這個項目所有的歷史都不復存在了。本地版本控制系統同樣有這個問題——任何時候你將整個項目的歷史保留在一個地方,那么你就會有丟失所有東西的風險。

2.1.3 分布式版本控制系統

這正是分布式版本控制系統(Distributed Version Control Systems, DVCSs)涉足的領域。在一個DVCS系統中(例如Git、Mercurial、Bazaar和Darcs),客戶端不是僅僅簽出文件的最近快照,而是保存整個工廠的鏡像。因此,如果某個服務器掛了,這些系統通過它協作,任何一個客戶端工廠都可以拷給服務器用來恢復。任何一次簽出實際上是所有數據的一個備份,如圖1-3:

clip_image003

此外,這種系統可以很好的同時和多個遠程工廠打交道。因此,你可以在一個項目內同時和不同團體以不同的方式協作。這樣允許你設置不同類型的工作流程,而這在傳統的集中式版本控制系統中是不可能的。

2.2 Git簡史

同許多偉大的事物一樣,Git誕生於一個創造性的毀滅和巨大的爭議中(原文:Git began with a bit of creative destruction and fiery controversy)。Linux內核是一個超大規模的開源軟件項目。對於Linux內核維護的大部分時間(1991-2002),軟件的修改變更都是通過不定和歸檔文件傳遞的。2002年,Linux內核項目開始使用一個叫做BitKeeper的專有的分布式版本控制系統。

2005年,Linux內核開發社區與BitKeeper的研發公司之間鬧僵了,而這個工具的免費使用權被收回了。這提醒了Linux研發社區(尤其是Linux的創始人Linus Torvalds)利用在使用BitKeeper過程中的體會開發屬於自己的工具。這個新系統的一些目標如下:

  • 快速
  • 設計簡單
  • 對於非線性開發(數以千計的並行分支)的強大支持
  • 完全分布式
  • 能夠高效處理像Linux內核這樣的超大項目(速度和數據量)

自從2005年誕生以來,Git逐漸演進變得易於使用同時還保持了這些最初的優點。對於大的項目來說,它快速高效,並且對於非線性開發來說有着超乎想象的分支系統(見第三章)。

2.3 Git基礎

那么,什么是Git呢?這是一個需要搞清楚的重要問題,因為如果你明白什么是Git以及它的基本工作原理,那么高效的使用Git才可能比較簡單。當你學習Git的時候,你最好吧腦子里你知道的關於其他VCS系統,例如SVN、Perforce的所有東西都清除掉。這樣的話有助於避免在使用這個工具是產生困惑。Git存儲與看待信息的方式與其他系統有很大的不同,盡管用戶界面是類似的。明白這些概念可以防止你在使用Git的時候出現困惑。

2.3.1 快照(Snapshots),不是差別(Differences)

Git和SVN以及其他的版本控制系統最大的一個區別是Git看待其數據的方式。概念上來說,其他的版本控制系統將信息存儲為一本基於文件變化的列表。這些系統將它們保管的信息看作是一些列文件以及每個文件隨着時間推移的變化。如圖1-4所示。

clip_image005

Git並不是這樣存儲與看待它的數據的。相反,Git更多的把它的數據看成於一個小型文件系統的一組快照。每一次你提交或者在Git中保存你的項目的狀態,它首先做一個當前你的所有文件的快照,然后存儲對這個快照的引用。為了保證效率,如果文件沒有發生變化,Git不會再次保存文件——而是僅僅鏈接到之前那個已經存儲過的文件。如圖1-5所示。

clip_image007

這是Git和幾乎所有其他的VCS之間的一個重要的區別。這使得Git幾乎重新考慮了所有其他VSC系統的所有方面的設計。這使得Git相比於一個單純的VCS系統,更像是一個帶有一系列功能極其強大的工具構建於其上的小型文件系統。我們將會在講到第三章Git分支的時候體會到以這種方式看待數據所帶來的好處。

2.3.2 幾乎所有的操作都在本地

大部分Git的操作都只需要本地的文件和資源來進行——一般來說不需要從網絡上其他計算機獲取任何信息。如果你習慣於那些每個操作幾乎都有網絡延遲的集中式版本控制系統,那么Git的這方面特點會讓你覺得它具有上帝的力量。由於項目完整的歷史都保存在本地,因此幾乎所有的操作都會立刻完成。

例如,要瀏覽整個項目的歷史,Git不需要去遠程服務器獲取歷史然后展現給你——它只需要從本地數據庫中直接讀取。這意味着你幾乎即刻就能看到項目歷史。如果你想看一個文件當前的版本和一個月前版本的變化,Git可以查找一個月前的這個文件並且做一個本地的差別計算,而不需要讓遠程服務器做或者pull到本地然后做本地差別計算。

這意味着如果你斷網或者沒連接VPN也幾乎沒有什么你不能做的。如果你在飛機或者火車上並且想做點工作,你可以開心的提交修改然后等到有網的時候再上傳。如果你在家,然后VPN客戶端不能連接,你依然可以工作。而在其他的版本控制系統,這種情況要么不可能發生,要么很費勁。例如,在Perforce中,如果沒連接到服務器,你做不了什么東西;在CVS和SVN中,你可以編輯文件,但是不能提交到數據庫中(除非數據庫是離線的)。這一點乍一看似乎沒什么大不了,但是慢慢的你會被這個變化能帶來的好處shock到的。

2.3.3 Git具有完整性

Git中的所有東西在保存前都會進行校驗和計算然后接下來通過這個checksum來進行引用。這意味着不可能在Git不知道的情況下修改Git管理的任何一個文件或者目錄。這個功能在底層內置於Git中並且行程其設計哲學的一部分。如果文件在傳輸中數據丟失或者文件損壞了,Git立馬能檢測到。

Git使用SHA-1哈希算法來計算校驗和。這是一個40位的十六進制字符串,然后根據Git中的文件內容或者目錄結構進行計算。一個SHA-1哈希看起來像這樣:24b9da6552252987aa493b52f8696cd6d3b00373。

在Git中到處都是用了這種哈希值,以至於你到處都可以看到他們。事實上,Git存儲文件不是靠文件名,在其數據庫中可尋址的存儲其內容的hash值。

2.3.4 Git只添加數據

當你在Git中做操作,幾乎所有的操作都只會向數據庫中添加數據。所以所有的操作幾乎都是可以撤銷或者擦除的。類似任何一個VCS,你可以丟失或者弄亂那些還沒有提交的變化,但是一旦你提交一個快照到Git,就不會丟失,尤其是當你定期將你的數據庫push到另一個倉庫中去。

這使得使用Git成為一種享受,因為我們知道,我們可以隨便實驗,不用擔心把東西徹底弄糟。更加深入的了解Git如何存儲數據以及如何恢復看起來已經丟失的數據,詳見第九章內容。

2.3.5 三種狀態

注意啦。關於一點你需要特別注意,Git中的文件有三種主要的狀態:已提交(committed)、已修改(modified)、暫存狀態(staged)。提交狀態意味着數據已經安全的提交到數據庫中。修改狀態意味着你有修改文件,但是還沒有安全的提交到數據庫中。暫存狀態意味着你已經將一個已修改狀態的文件放入下一個要提交的快照中。

Git中的項目有三個主要部分:Git目錄、工作目錄和暫存區域。

clip_image009

Git目錄是Git為你的項目存放元數據和對象數據庫的地方。這是Git中最重要的部分,當你從別的電腦拷貝一個倉庫時拷貝的就是這部分東西。

工作目錄是項目某個版本的一個checkout。這些文件是從Git目錄中的壓縮了的數據庫中pull out出來然后存放在你的硬盤供你使用和修改的。

暫存區域是一個文件,它存放在Git目錄中用以記錄下一次需要提交的文件。暫存區域又有時被叫做是索引,但是現在它的標准叫法是暫存區域。

基本的Git工作流程如下:

1. 你在工作空間中修改文件

2. 暫存文件,將它們的快照放進暫存區

3. 提交——將暫存區文件的快照永久存儲進Git目錄。

如果某個文件的特定版本已經在Git中,那么它被視為已經提交。如果已經修改尚未提交,也未放入暫存區,視為已修改狀態。如果已經添加進暫存區,視為暫存狀態。

2.4 安裝Git

要開始使用Git,首先得安裝Git。你有幾種方式獲得Git;兩種主要的方式是從源代碼安裝以及選擇你的平台上的安裝包。

2.4.1 從源代碼安裝

如果可以的話,從源代碼安裝Git非常有用,因為這樣可以安裝最近的版本。Git的每個版本會包含有用的UI增強元素,如果你覺得從源碼編譯軟件是一件很舒服的事情,那么你就可以獲取最新的版本。

要安裝Git,你需要安裝以下的依賴包:curl、zlib、openssl、expat和libiconv。例如如果你的系統有yum或者apt-get,你就可以使用下面的命令安裝依賴包:

$ 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官方網站上最近的快照:

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

完成之后你可以通過Git獲得Git:

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

2.4.2 在Linux上安裝

如果你要在Linux通過二進制包安裝Git,你可以使用你的系統發行版自帶的基本的包管理工具安裝,如果你在Fedora,你可以使用yum:

$ yum install git-core

如果你在一個基於Debian的發行版,例如Ubuntu,試試apt-get:

$ apt-get install git-core

2.4.3 在Mac上安裝

在Mac上有兩種簡單地方式安裝Git。最簡單的是使用圖形Git安裝器,可以從Google Code的頁面下載,見圖1-7:

http://code.google.com/p/git-osx-installer

clip_image011

另一個主流的方式是使用MacPorts(http://www.macports.org)。如果你安裝了MacPorts,你可以這樣安裝Git:

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

你不需要添加所有的附加包,如果你需要使用Git處理SVN倉庫,那么你需要加上+svn包。

2.4.4 在Windows上安裝

在Windows上安裝Git非常簡單,msysGit項目有一個簡單地安裝過程,只需要下載安裝文件並運行就好了:

http://code.google.com/p/msysgit

安裝完之后,包含命令行版本和標准GUI。

2.5 初次使用Git的設置

既然你已經安裝了Git,你可能想對自己的Git環境做一些個性化設置。這些事情你只需要做一次,及時更新這些設置依然會保留。當然你也可以隨后通過命令再次改變這些設置。

Git有一個叫做git config的工具,他可以讓你獲取並且設置配置變量來設置Git看起來怎樣,怎么操作。這些變量可以在三個地方存儲:

  • /etc/gitconfig文件:包含適用於系統中每個用戶以及他們所有的倉庫的變量值。如果你傳--system選項給git config,那么Git會從這個文件讀寫。
  • ~/.gitconfig文件:只對當前用戶生效。如果你傳遞--global給git config,那么Git會從這個文件中讀寫。
  • 在任意一個你所工作的倉庫的Git目錄下面的配置文件(.git/config):只對當前這個倉庫生效。沒一個級別的配置會覆蓋上一級別的配置。

在Windows中。Git回去$HOME中去找配置文件(C:\Documents and

Settings\$USER),它還會去查找/etc/gitconfig。

2.5.1 你的身份

設置Git的第一件事就是需要設置你的名字和email,這一點很重要,因為每次提交,Git都需要使用這些信息。這些信息不可變的傳遞進commit的信息里:

$ git config --global user.name "John Doe"

$ git config --global user.email johndoe@example.com

再說一遍,如果你傳遞--global選項,那么這件事情你只需要做一次就可以了,當你在這個系統上做任何事情Git都會自動的去使用這些信息。如果你需要對特定的項目用另一個姓名或者email去覆蓋之前的設置,你可以運行上面的命令不加--global選項。

2.5.2 你的編輯器

既然身份信息已經確立下來了,接下來你可以配置當需要輸入信息時,Git默認使用的文本編輯器了。默認情況下,Git會使用你的系統的默認編輯器,一般來說是Vi或者Vim。如果你想使用其他的編輯器,例如Emacs,你可以這樣:

$ git config --global core.editor emacs

2.5.3 你的Diff工具

另外一個有用的選項你可能需要配置的是默認的diff工具用來解析合並的沖突,假設你想使用vimdiff,你可以:

$ git config --global merge.tool vimdiff

Git支持kdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、和opendiff。你也可以設置一個自定義的工具,詳見第七章相關內容。

2.5.4 檢查你的設置

如果你需要檢查一下你的設置,可以使用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

...

你可能會看到一些重復的key這是因為Git會從不同的文件中去讀取key值。在這個例子中,Git使用每個key的最后一個值。

你還可以通過git config {key}來查看特定key的值。

$ git config user.name

Scott Chacon

2.6 獲取幫助

如果你在使用Git的時候需要幫助,有三種方法可以查看任何Git命令的幫助文檔:

$ git help <verb>

$ git <verb> --help

$ man git-<verb>

你可以運行下面的命令來獲得config命令的manpage:

$ git help config

這些命令非常好,因為即使離線狀態你也可以使用它們。如果本書和這些manpage還不夠用來解決你的問題,你可以試試Freenode IRC服務器上的#git或者#github頻道。這些頻道里面有很多熟悉Git的人,他們往往會願意幫助你。

2.7 小結

你需要對Git是什么以及為什么Git與其他一些你正在使用的集中式版本控制系統不同有一些基本的了解。你現在應該已經有了一個Git版本並且已經設置了你的個人信息,是時候學點Git基礎了。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM