天天看點

Git教程1——Git起步

關于版本控制

版本控制是一種記錄一個或若幹檔案内容變化,以便将來查閱特定版本修訂情況的系統。 在例子中,我們對檔案作版本控制,但實際上,你可以對任何類型的檔案進行版本控制。

如果你是位圖形或網頁設計師,可能會需要儲存某一幅圖檔或頁面布局檔案的所有修訂版本(這或許是你非常渴望擁有的功能),采用版本控制系統(VCS)是個明智的選擇。 有了它你就可以将某個檔案回溯到之前的狀态,甚至将整個項目都回退到過去某個時間點的狀态,你可以比較檔案的變化細節,查出最後是誰修改了哪個地方,進而找出導緻怪異問題出現的原因,又是誰在何時報告了某個功能缺陷等等。 使用版本控制系統通常還意味着,就算你亂來一氣把整個項目中的檔案改的改删的删,你也照樣可以輕松恢複到原先的樣子, 但額外增加的工作量卻微乎其微。

SVN與Git最主要的差別

SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而工作的時候,用的都是自己的電腦,是以首先要從中央伺服器上得到最新的版本,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網路還可以,帶寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就郁悶了。

Git是目前世界上最先進的分布式版本控制系統,也就是它就沒有中央伺服器,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間隻需把各自的修改推送給對方,就可以互相看到對方的修改了。

Git 一般隻添加資料

你執行的 Git 操作,幾乎隻往 Git 資料庫中增加資料。 很難讓 Git 執行任何不可逆操作,或者讓它以任何方式清除資料。 同别的 VCS 一樣,未送出更新時有可能丢失或弄亂修改的内容;但是一旦你送出快照到 Git 中,就難以再丢失資料,特别是如果你定期的推送資料庫到其它倉庫的話。

這使得我們使用 Git 成為一個安心愉悅的過程,因為我們深知可以盡情做各種嘗試,而沒有把事情弄糟的危險。 更深度探讨 Git 如何儲存資料及恢複丢失資料的話題,請參考撤消操作。

三種狀态

好,請注意。 如果你希望後面的學習更順利,記住下面這些關于 Git 的概念。 Git 有三種狀态,你的檔案可能處于其中之一:已送出(committed)、已修改(modified)和已暫存(staged)。 已送出表示資料已經安全的儲存在本地資料庫中。 已修改表示修改了檔案,但還沒儲存到資料庫中。 已暫存表示對一個已修改檔案的目前版本做了标記,使之包含在下次送出的快照中。

由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域。

Git 倉庫目錄是 Git 用來儲存項目的中繼資料和對象資料庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裡的資料。

工作目錄是對項目的某個版本獨立提取出來的内容。 這些從 Git 倉庫的壓縮資料庫中提取出來的檔案,放在磁盤上供你使用或修改。

暫存區域是一個檔案,儲存了下次将送出的檔案清單資訊,一般在 Git 倉庫目錄中。 有時候也被稱作“索引”,不過一般說法還是叫暫存區域。

基本的 Git 工作流程如下:

1. 在工作目錄中修改檔案。

2. 暫存檔案,将檔案的快照放入暫存區域。

3. 送出更新,找到暫存區域的檔案,将快照永久性存儲到 Git 倉庫目錄。

如果 Git 目錄中儲存着的特定版本檔案,就屬于已送出狀态。 如果作了修改并已放入暫存區域,就屬于已暫存狀态。 如果自上次取出後,作了修改但還沒有放到暫存區域,就是已修改狀态。

指令行

Git 有多種使用方式, 你可以使用原生的指令行模式,也可以使用 GUI 模式,這些 GUI 軟體也能提供多種功能。 但我還是推薦使用指令行模式。 這是因為首先,隻有在指令行模式下你才能執行 Git 的所有指令,而大多數的 GUI 軟體隻實作了 Git 所有功能的一個子集以降低操作難度。 如果你學會了在指令行下如何操作,那麼你在操作 GUI 軟體時應該也不會遇到什麼困難,但是,反之則不成立。 此外,由于每個人的想法與側重點不同,不同的人常常會安裝不同的 GUI 軟體,但所有人一定會有指令行工具。假如你是 Mac

使用者,希望你懂得如何使用終端(Terminal);假如你是 Windows 使用者,希望你懂得如何使用指令視窗(Command Prompt)或 PowerShell。 如果你尚未掌握以上技能,建議你先停下來快速學習一下。

在 Linux 上安裝

如果你想在 Linux 上用二進制安裝程式來安裝 Git,可以使用發行版包含的基礎軟體包管理工具來安裝。Git 的工作需要調用 curl,zlib,openssl,expat,libiconv 等庫的代碼,是以需要先安裝這些依賴工具。

以 Fedora 為例,你可以使用 yum:

$ sudo yum install git

如果你在基于 Debian 的發行版上,請嘗試用 apt-get:

$ sudo apt-get install git

要了解更多選擇,Git 官方網站上有在各種 Unix 風格的系統上安裝步驟,網址為 http://git-scm.com/download/linux。

在 Mac 上安裝

在 Mac 上安裝 Git 有多種方式。 最簡單的方法是直接從AppStore安裝Xcode,Xcode內建了Git,不過預設沒有安裝,你需要運作Xcode,選擇菜單 “Xcode”->“Preferences”,在彈出視窗中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了。 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

在windows上安裝Git

雖然windows開發環境不适合開發,但無奈上了賊船,我們就一條道走到黑吧,在 Windows 上安裝 Git 也有幾種安裝方法。git的安裝包,直接上官網(

https://git-scm.com/download/ )下載下傳即可。要注意這是一個名為 Git for Windows的項目(也叫做 msysGit),和 Git 是分别獨立的項目;更多資訊請通路 http://msysgit.github.io/ 另一個簡單的方法是安裝 GitHub for Windows。 該安裝程式包含圖形化和指令行版本的 Git。 它也能支援 Powershell,提供了穩定的憑證緩存和健全的 CRLF 設定。 稍後我們會對這方面有更多了解,現在隻要一句話就夠了,這些都是你所需要的。 你可以在 GitHub for Windows 網站下載下傳,網址為 http://windows.github.com

從源代碼安裝

有人覺得從源碼安裝 Git 更實用,因為你能得到最新的版本。 二進制安裝程式傾向于有一些滞後,當然近幾年 Git 已經成熟,這個差異不再顯著。

如果你想從源碼安裝 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           

初次運作 Git 前的配置

現在已經在系統上安裝了 Git,但還需要做幾件事來定制你的 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 時所選的目标位置。

使用者資訊

當安裝完 Git 應該做的第一件事就是設定你的使用者名稱與郵件位址。這樣做的原因是因為每一個 Git 的送出都會使用這些資訊,并且它會寫入到你的每一次送出中,不可更改:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"           

因為Git是分布式版本控制系統,是以需要填寫使用者名和郵箱作為一個辨別。

注意:git config 指令的 --global 參數,如果使用了 --global 選項,那麼該指令隻需要運作一次,用了這個參數,表示你這台機器上所有的Git倉庫都會使用這個配置。當你想針對特定項目使用不同的使用者名稱與郵件位址時,可以在那個項目目錄下運作沒有 --global 選項的指令來配置。

檢查配置資訊

如果想要檢查你的配置,可以使用 git config --list 指令來列出所有 Git 當時能找到的配置。

$ git config --list           

你可能會看到重複的變量名,因為 Git 會從不同的檔案中讀取同一個配置(例如:/etc/gitconfig 與 ~/.gitconfig)。 這種情況下,Git 會使用它找到的每一個變量的最後一個配置。

你可以通過輸入 git config <key>: 來檢查 Git 的某一項配置

擷取幫助

若你使用 Git 時需要擷取幫助,有三種方法可以找到 Git 指令的使用手冊:

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

例如,要想獲得 config 指令的手冊,執行

$ git help config           

這些指令的好處就是你随時随地可以使用而無需聯網。 如果你覺得幫助手冊還不夠用,你可以嘗試在 Freenode IRC 伺服器( irc.freenode.net )的 #git 或 #github 頻道尋求幫助,這些頻道經常有上百人線上,他們都精通 Git 并且樂于助人。

Git 工作流程

Git 的工作流程一般包括下面幾個:

  • 克隆 Git 資源作為工作目錄。
  • 在克隆的資源上添加或修改檔案。
  • 如果其他人修改了,你可以更新資源。
  • 在送出前檢視修改。
  • 送出修改。
  • 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。

下圖展示了 Git 的工作流程:

工作區與暫存區

  • 工作區(Working Directory):就是你在電腦上看到的目錄,比如目錄下mygit裡的檔案(.git隐藏目錄版本庫除外)。或者以後需要再建立的目錄檔案等等都屬于工作區範疇。
  • 暫存區(Stage):工作區有一個隐藏目錄.git,這個不屬于工作區,這是版本庫。其中版本庫裡面存了很多東西,其中最重要的就是stage(暫存區),還有Git為我們自動建立了一個分支master,以及指向master的一個指針HEAD。

版本庫

版本庫又名倉庫,英文名repository,你可以簡單的了解為一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、删除,Git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在将來某個時刻還可以将檔案還原。

建立一個版本庫也非常簡單,有兩種取得 Git 項目倉庫的方法。 第一種是在現有項目或目錄下導入所有檔案到 Git 中; 第二種是從一個伺服器克隆一個現有的 Git 倉庫。

下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關系:

圖中左側為工作區,右側為版本庫。在版本庫中标記為 "index" 的區域是暫存區(stage, index),标記為 "master" 的是 master 分支所代表的目錄樹。

圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"遊标"。是以圖示的指令中出現 HEAD 的地方可以用 master 來替換。

圖中的 objects 辨別的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,裡面包含了建立的各種對象及内容。

當對工作區修改(或新增)的檔案執行 "git add" 指令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案内容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的檔案索引中。

當執行送出操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是送出時暫存區的目錄樹。

當執行 "git reset HEAD" 指令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

當執行 "git rm --cached <file>" 指令時,會直接從暫存區删除檔案,工作區則不做出改變。

當執行 "git checkout ." 或者 "git checkout -- <file>" 指令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未添加到暫存區的改動。

當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 指令時,會用 HEAD 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個指令也是極具危險性的,因為不但會清除工作區中未送出的改動,也會清除暫存區中未送出的改動。

參考:

https://git-scm.com/book/zh/v2 http://blog.jobbole.com/78960/ http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ http://zengrong.net/post/1746.htm http://www.bootcss.com/p/git-guide/ http://www.runoob.com/git/git-tutorial.html