之前在公司使用過SVN(無甚感覺)和ClearCase(把人噁心死的東西)兩種版本控制工具,都不滿意。後來想自己寫點東西玩,就發現了這個在國內人氣還不怎麼高的Git,這個由Linus實現的靈活小巧的VCS。對它的印象差不多可以這麼說:“我被萌到了”。
通過採用不同型別的工作流,Git可以適用於各種大小規模的專案。這裡介紹一下針對最簡單的集中式工作流的配置方式,適合個人和小型團隊使用。
注:本文只是一個快速流程,要詳細瞭解Git使用方法的話,強烈推薦閱讀《Pro Git》這本書(見本文末尾的參考)。流程中需要一臺伺服器或VPS(越來越感受到VPS這東西對程式設計師真有用啊)。
安裝Git
Git是跨平臺的,在Linux/Mac/Windows上都可以使用,它的分散式特性也使得個人可以在多種平臺下方便地進行開發。
Linux
作為桌面系統用的Linux大多是Debian系的,安裝很方便,執行下面命令即可:
$ sudo apt-get install git-core
Mac OS X
如果安裝了Xcode 4的,裡面就已經包含了Git。也可以從這裡單獨安裝:
http://code.google.com/p/git-osx-installer/downloads/list?can=3
Windows
window平臺可以安裝msysgit:
http://code.google.com/p/msysgit/downloads/list?can=3
喜歡圖形介面的可以再加上TortoiseGit:
http://code.google.com/p/tortoisegit/downloads/list
初次配置
執行下面兩條命令來配置使用者資訊,他們會用於Git提交時的簽名:
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@example.com
建立本地Git倉庫
在你的專案目錄下執行:
$ git init
這會在你的專案目錄下建立一個.git目錄,儲存所有Git所需的資源。
然後我們該往專案中新增檔案了。不過在這之前,最好先建立一個名為.gitignore的檔案,來把一些不需要的檔案或資料夾排除掉。比如在Mac下有時會在當前目錄下產生一個.DS_Store的檔案,這對我們的專案是無用的,我們就可以把它排除掉,而一些文字編輯器會使用以~結尾的備份檔案,也要排除掉:
.DS_Store *~
《Pro Git》的2.2節對此規則有更詳細的介紹。
然後我們就可以進行文件的新增了,如果是按照上面把忽略規則設定好了的話,可以簡單地執行:
$ git add .
這會把忽略規則以外的所有檔案都新增進來,也可以這樣:
$ git add *.c
來新增部分檔案。Git還可能會忽略.gitignore檔案,需要手工新增:
$ git add .gitignore
新增好檔案後,就進行第一次提交:
$ git commit -m 'initial project version'
Git要求所有地提交都要包含說明文字,-m後面地即為說明,這是一種快捷地做法,也可以只用git commit,然後在切換到的介面中編輯說明文字。
建立伺服器端
Git是分散式的版本管理軟體,不需要伺服器端也可以使用,但若要進行多人/多裝置協同開發,還是要架設一個伺服器端。
首先把剛才建好的本地倉庫匯出為裸倉庫,在專案的上級目錄執行:
$ git clone --bare my_project my_project.git
這會新建一個my_project.git資料夾,差不多和專案目錄.git資料夾中的內容一樣。
使用scp命令(或其他方式)把它上傳到你的伺服器上:
$ scp -r my_project.git user@git.example.com:/var/git
伺服器上存放的目錄可以是任意位置,目錄的訪問許可權其實就和通過Git訪問的許可權相同(使用ssh協議來訪問程式碼),比如你的專案是私人的,就可以放在你的home目錄中。
上傳之後本地的my_project.git就可以刪掉了。
如果你的伺服器端還沒有安裝git的話,這時是無法通過Git獲取程式碼的,很簡單,還是通過
$ sudo apt-get install git-core
命令,在伺服器端安裝Git。
現在就可以在本地通過Git來獲取這個專案了:
$ git clone user@git.example.com:/var/git/my_project.git
這會在當前目錄下建立一個my_project資料夾,裡面包含專案原始碼和git倉庫。也可以在上面的命令後再新增一個引數,來制定這個資料夾的位置和名稱。
本地倉庫和伺服器端的關聯
我們通過git clone命令抓下來的專案會自動和抓取的伺服器端關聯好,這樣如果你確保前面新增到庫中的檔案沒有遺漏,就可以把它刪掉,再新clone下來的專案目錄下進行開發(這樣最簡單最懶)。
也可以手工為原專案建立關聯,在最初的專案目錄中執行:
$ git remote add origin user@git.example.com:/var/git/my_project.git
這條命令就是把剛才做好的伺服器端倉庫新增為遠端倉庫,名字叫origin。
這時已經可以通過git fetch origin和git push origin master命令來抓取和推送程式碼了,但這樣會比較麻煩(git fetch不會自動將遠端分支合併到當前工作的分支)。
為了之後的使用方便,要設定本地的master分支跟蹤遠端倉庫的master分支:
$ git checkout --track origin/master
$ git checkout --set-upstream master origin/master
這條命令即讓本地master分支跟蹤遠端倉庫origin中的master分支。
設定好更總後如果我們需要從遠端倉庫抓取資料,只需要執行
$ git pull
即可。而本地資料變動後,要提交到遠端倉庫,則執行:
$ git push
使用git部署網站
以前寫好了網頁就用ftp工具上傳到伺服器上,這樣子沒有版本控制的釋出行為可能會導致很多問題。既然現在我們用git來管理專案,那也可以用它來釋出網站。
假設剛才我們的my_project是為sojingle.net做的網站,要放在伺服器的/var/www/sojingle.net/htdocs/www目錄下,則可以在伺服器端執行
$ git clone user@git.example.com:/var/git/my_project.git /var/www/sojingle.net/htdocs/www
如果網站和git伺服器在同一個主機的話,也可以使用本地檔案協議來抓取:
$ git clone /var/git/my_project.git /var/www/sojingle.net/htdocs/www
不止是網站,有些軟體也是通過這種方式來發布。比如Homebrew和RVM,在更新本地軟體時,就是利用git來更新。
新建develop分支
Git除了分散式這一大特性外,還大大強化了分支的使用。我們日常的開發工作一般不在master分支上進行,而是最好建立一個develop分支:
$ git checkout -b develop
開發時,最好基於develop分支再新建一個特性分支,比如我們要為網站新增一個新功能“標籤支援”,就為其新建一個分支tag_support,新功能開發完成之後,將其合併到develop分支上:
$ git checkout develop $ git merge tag_support
這就將新功能的程式碼合併到了開發主分支上,合併過程沒有衝突的話,就可以刪掉這個分支:
$ git branch -d tag_support
當做好了一組新功能,決定要發版本了,就用可以把develop分支合併到master分支上,git push推送到遠端倉庫。在伺服器端的www目錄中,再來執行git pull,即可把網站更新到最新版本。
推薦及參考
《Pro Git》http://progit.org/book/zh/
這本書的作者是GitHub的員工,寫得非常棒,大量的配圖把Git的分支管理講得非常清楚。而且非紙質書是免費的,已經有了中文版翻譯,可以直接線上閱讀。
《Git開發管理之道》http://blog.leezhong.com/translate/2010/10/30/a-successful-git-branch.html
這篇文章主要講的是軟體開發中的分支管理模型,很值得一讀。