1、關于版本控制
版本控制系統:版本控制是一種記錄一個或若幹檔案内容變化,以便将來查閱特定版本修訂情況的系統。但實際上,你可以對任何類型的檔案進行版本控制。
1.1 本地版本控制系統
許多人習慣用複制整個項目目錄的方式來儲存不同的版本,或許還會改名加上備份時間以示差別。這麼做唯一的好處就是簡單,但是特别容易犯錯。有時候會混淆所在的工作目錄,一不小心會寫錯檔案或者覆寫意想外的檔案。

1.2 集中化的版本控制系統
集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS):有一個單一的集中管理的伺服器,儲存所有檔案的修訂版本,而協同工作的人們都通過用戶端連到這台伺服器,取出最新的檔案或者送出更新。
這種做法帶來了許多好處,特别是相較于老式的本地 VCS 來說。現在,每個人都可以在一定程度上看到項目中的其他人正在做些什麼。而管理者也可以輕松掌控每個開發者的權限,并且管理一個 CVCS 要遠比在各個用戶端上維護本地資料庫來得輕松容易。
事分兩面,有好有壞。這麼做最顯而易見的缺點是中央伺服器的單點故障。如果當機一小時,那麼在這一小時内,誰都無法送出更新,也就無法協同工作。如果中心資料庫所在的磁盤發生損壞,又沒有做恰當備份,毫無疑問你将丢失所有資料——包括項目的整個變更曆史,隻剩下人們在各自機器上保留的單獨快照。本地版本控制系統也存在類似問題,隻要整個項目的曆史記錄被儲存在單一位置,就有丢失所有曆史更新記錄的風險。
1.3 分布式版本控制系統
分布式版本控制系統(Distributed Version Control System,簡稱 DVCS):用戶端并不隻提取最新版本的檔案快照,而是把代碼倉庫完整地鏡像下來。這麼一來,任何一處協同工作用的伺服器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢複。因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。
2、Git簡史
Linux 核心開源項目有着為數衆廣的參與者。絕大多數的 Linux 核心維護工作都花在了送出更新檔和儲存歸檔的繁瑣事務上(1991-2002年間)。到 2002 年,整個項目組開始啟用一個專有的分布式版本控制系統 BitKeeper來管理和維護代碼。
到了 2005 年,開發 BitKeeper 的商業公司同 Linux 核心開源社群的合作關系結束,他們收回了 Linux 核心社群免費使用 BitKeeper 的權力。這就迫使 Linux 開源社群(特别是 Linux 的締造者 Linux Torvalds)基于使用BitKcheper 時的經驗教訓,開發出自己的版本系統。他們對新的系統制訂了若幹目标:
• 速度
• 簡單的設計
• 對非線性開發模式的強力支援(允許成千上萬個并行開發的分支)
• 完全分布式
• 有能力高效管理類似 Linux 核心一樣的超大規模項目(速度和資料量)
自誕生于 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留着初期設定的目标。它的速度飛快,極其适合管理大項目,有着令人難以置信的非線性分支管理系統(參見 Git 分支)。
3、Git基礎
3.1 與其他版本控制系統的差别
直接記錄快照,而非差異比較
Git 和其它版本控制系統(包括 Subversion 和近似工具)的主要差别在于 Git 對待資料的方法。概念上來區分,其它大部分系統以檔案變更清單的方式存儲資訊。這類系統(CVS、Subversion、Perforce、Bazaar 等等)将它們儲存的資訊看作是一組基本檔案和每個檔案随時間逐漸累積的差異。
Git 不按照以上方式對待或儲存資料。反之,Git 更像是把資料看作是對小型檔案系統的一組快照。每次你送出更新,或在 Git 中儲存項目狀态時,它主要對當時的全部檔案制作一個快照并儲存這個快照的索引。為了高效,如果檔案沒有修改,Git 不再重新存儲該檔案,而是隻保留一個連結指向之前存儲的檔案。Git 對待資料更像是一個 快照流。
Git 更像是一個小型的檔案系統,提供了許多以此為基礎建構的超強工具,而不隻是一個簡單的 VCS。
3.2 操作方式上的差别
近乎所有操作都是本地執行
在 Git 中的絕大多數操作都隻需要通路本地檔案和資源,一般不需要來自網絡上其它計算機的資訊。
3.3 完整性
Git 保證完整性
Git 中所有資料在存儲前都計算校驗和,然後以校驗和來引用。
Git 用以計算校驗和的機制叫做 SHA-1 散列(hash,哈希)。這是一個由 40 個十六進制字元(0-9 和 a-f)組成字元串,基于 Git 中檔案的内容或目錄結構計算出來。SHA-1 哈希看起來是這樣:24b9da6552252987aa493b52f8696cd6d3b00373
實際上,Git 資料庫中儲存的資訊都是以檔案内容的哈希值來索引,而不是檔案名。
3.4 Git 一般隻添加資料
執行的 Git 操作,幾乎隻往 Git 資料庫中增加資料。很難讓 Git 執行任何不可逆操作,或者讓它以任何方式清除資料。同别的 VCS 一樣,未送出更新時有可能丢失或弄亂修改的内容;但是一旦你送出快照到 Git 中,就難以再丢失資料,特别是如果你定期的推送資料庫到其它倉庫的話。
3.5 三種狀态
Git 有三種狀态,你的檔案可能處于其中之一:已送出(committed)、已修改(modified)和已暫存(staged)。
已送出表示資料已經安全的儲存在本地資料庫中。
已修改表示修改了檔案,但還沒儲存到資料庫中。
已暫存表示對一個已修改檔案的目前版本做了标記,使之包含在下次送出的快照中。
由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域。
Git 倉庫目錄是 Git 用來儲存項目的中繼資料和對象資料庫的地方。這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裡的資料。
工作目錄是對項目的某個版本獨立提取出來的内容。這些從 Git 倉庫的壓縮資料庫中提取出來的檔案,放在磁盤上供你使用或修改。
暫存區域是一個檔案,儲存了下次将送出的檔案清單資訊,一般在 Git 倉庫目錄中。有時候也被稱作`‘索引’',不過一般說法還是叫暫存區域。
基本的 Git 工作流程如下:
1. 在工作目錄中修改檔案。
2. 暫存檔案,将檔案的快照放入暫存區域。
3. 送出更新,找到暫存區域的檔案,将快照永久性存儲到 Git 倉庫目錄。
如果 Git 目錄中儲存着的特定版本檔案,就屬于已送出狀态。如果作了修改并已放入暫存區域,就屬于已暫存狀态。如果自上次取出後,作了修改但還沒有放到暫存區域,就是已修改狀态。
(如何根據檔案狀态實施後續操作,以及怎樣跳過暫存直接送出)
4、指令行
Git 有多種使用方式。你可以使用原生的指令行模式,也可以使用 GUI 模式,我們将使用指令行模式。這是因為首先,隻有在指令行模式下你才能執行 Git 的 所有 指令,而大多數的 GUI 軟體隻實作了 Git 所有功能的一個子集以降低操作難度。
如果你學會了在指令行下如何操作,那麼你在操作 GUI軟體時應該也不會遇到什麼困難,但是,反之則不成立。此外,由于每個人的想法與側重點不同,不同的人常常會安裝不同的 GUI 軟體,但 所有人一定會有指令行工具。
5、安裝Git
5.1 在 Linux 上安裝
如果你想在 Linux 上用二進制安裝程式來安裝 Git,可以使用發行版包含的基礎軟體包管理工具來安裝。
如果以Fedora 上為例,你可以使用 yum: # sudo yum install git
如果你在基于 Debian 的發行版上,請嘗試用 apt-get: # sudo apt-get install git
5.2 在 Mac 上安裝
最簡單的方法是安裝 Xcode Command Line Tools。Mavericks (10.9) 或更高版本的系統中,在 Terminal 裡嘗試首次運作 git 指令即可。如果沒有安裝過指令行開發者工具,将會提示你安裝。
如果你想安裝更新的版本,可以使用二進制安裝程式。官方維護的 OSX Git 安裝程式可以在 Git 官方網站下載下傳,網址為 http://git-scm.com/download/mac。
也可以将它作為 GitHub for Mac 的一部分來安裝。它們的圖形化 Git 工具有一個安裝指令行工具的選項。你可以從 GitHub for Mac 網站下載下傳該工具,網址為 http://mac.github.com。
5.3 在 Windows 上安裝
在 Windows 上安裝 Git 也有幾種安裝方法。官方版本可以在 Git 官方網站下載下傳。打開 http://git-scm.com/download/win,下載下傳會自動開始。要注意這是一個名為 Git for Windows的項目(也叫做
msysGit),和 Git 是分别獨立的項目;更多資訊請通路 http://msysgit.github.io/。
另一個簡單的方法是安裝 GitHub for Windows。該安裝程式包含圖形化和指令行版本的 Git。它也能支援Powershell,提供了穩定的憑證緩存和健全的 CRLF 設定。稍後我們會對這方面有更多了解,現在隻要一句話就夠了,這些都是你所需要的。你可以在 GitHub for Windows 網站下載下傳,網址為 http://windows.github.com。
5.4 從源代碼安裝
想從源碼安裝 Git,需要安裝 Git 依賴的庫:curl、zlib、openssl、expat,還有libiconv。
如果你的系統上有 yum (如 Fedora)或者 apt-get(如基于 Debian 的系統),可以使用以下指令之一來安裝最小化的依賴包來編譯和安裝 Git 的二進制版:
# sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
為了能夠添加更多格式的文檔(如 doc, html, info),你需要安裝以下的依賴包:
# sudo yum install asciidoc xmlto docbook2x
# sudo apt-get install asciidoc xmlto docbook2x
當你安裝好所有的必要依賴,你可以繼續從幾個地方來取得最新釋出版本的 tar 包。
你可以從 Kernel.org 網站擷取,網址為 https://www.kernel.org/pub/software/scm/git,或從 GitHub 網站上的鏡像來獲得,網址為https://github.com/git/git/releases。
通常在 GitHub 上的是最新版本,但 kernel.org 上包含有檔案下載下傳簽名,如果你想驗證下載下傳正确性的話會用到。
接着,編譯并安裝:
# tar -zxf git-2.0.0.tar.gz
# cd git-2.0.0
# make configure
# ./configure --prefix=/usr
# make all doc info
# sudo make install install-doc install-html install-info
完成後,你可以使用 Git 來擷取 Git 的更新:
# git clone git://git.kernel.org/pub/scm/git/git.git
6、初次運作 Git 前的配置
6.1 配置檔案
定制你的 Git 環境,每台計算機上隻需要配置一次,程式更新時會保留配置資訊。你可以在任何時候再次通過運作指令來修改它們。
Git 自帶一個 git config 的工具來幫助設定控制 Git 外觀和行為的配置變量。這些變量存儲在三個不同的位置:
1. /etc/gitconfig 檔案: 包含系統上每一個使用者及他們倉庫的通用配置。 如果使用帶有 --system 選項的git config 時,它會從此檔案讀寫配置變量。
2. ~/.gitconfig 或 ~/.config/git/config 檔案:隻針對目前使用者。 可以傳遞 --global 選項讓 Git讀寫此檔案。
3. 目前使用倉庫的 Git 目錄中的 config 檔案(就是 .git/config):針對該倉庫。
每一個級别覆寫上一級别的配置,是以 .git/config 的配置變量會覆寫 /etc/gitconfig 中的配置變量。
在 Windows 系統中,Git 會查找 $HOME 目錄下(一般情況下是 C:\Users\$USER)的 .gitconfig 檔案。
Git 同樣也會尋找 /etc/gitconfig 檔案,但隻限于 MSys 的根目錄下,即安裝 Git 時所選的目标位置。
6.2 使用者資訊
安裝完 Git 應該做的第一件事就是設定你的使用者名稱與郵件位址。這樣做很重要,因為每一個 Git 的送出都會使用這些資訊,并且它會寫入到你的每一次送出中,不可更改:
# git config --global user.name "John Doe"
# git config --global user.email [email protected]
再次強調,如果使用了 --global 選項,那麼該指令隻需要運作一次,因為之後無論你在該系統上做任何事情, Git 都會使用那些資訊。
當你想針對特定項目使用不同的使用者名稱與郵件位址時,可以在那個項目目錄下運作沒有 --global 選項的指令來配置。
很多 GUI 工具都會在第一次運作時幫助你配置這些資訊。
6.3 文本編輯器
配置預設文本編輯器:當 Git 需要你輸入資訊時會調用它。如果未配置,Git 會使用作業系統預設的文本編輯器,通常是 Vim。如果你想使用不同的文本編輯器,例如 Emacs,
可以這樣做:# git config --global core.editor emacs
6.4 檢查配置資訊
如果想要檢查你的配置,可以使用 git config --list 指令來列出所有 Git 當時能找到的配置。
可能會看到重複的變量名,因為 Git 會從不同的檔案中讀取同一個配置(例如:/etc/gitconfig 與~/.gitconfig)。這種情況下,Git 會使用它找到的每一個變量的最後一個配置。
你可以通過輸入 git config <key>: 來檢查 Git 的某一項配置
6.5 擷取幫助
若你使用 Git 時需要擷取幫助,有三種方法可以找到 Git 指令的使用手冊:
# git help <verb>
# git <verb> --help
# man git-<verb>
例如,要想獲得 config 指令的手冊,執行
# git help config