2009年2月5日 星期四

使用Git與Github管理軟體開發專案

之前聽聞git這個版本控制時,看到有人介紹github這個服務。
https://github.com/

http://zh-tw.whygitisbetterthanx.com/#github

git是個分散式的版本控制軟體。大部分的版本控制軟體都需要一個伺服端,在commit的同時,提交到伺服器上面。git當然也可以集中管理,但是他另外多了分散管理的方式。簡單來說,billy開了一個專案,tom覺得這個專案有意思,他想玩玩看,他可以把整個repo(reoisitories)都clone過去,並且在他那邊自己有一個repo。tom可以自由的對這個repo做各種提交修改,直到他覺得滿意為止。這時候tom可以告訴billy,他改了一些什麼,若billy覺得不錯,可以從tom那邊fetch回去並merge。

由於repo可以綁在寫程式的人身上,不用一定要有中央伺服器的主從架構,因此就出現了github這個網站。github是用ruby寫的,上面的ruby專案也非常活躍。github中,每個人都可以有多個repo,這些repo都是綁在user上的。user之間可以互相clone repo,watch repo,或是 follow 其他 user,就好像twitter或是plurk這些社交網站一樣。



不過若要免費使用github,所有的repo都要public。若希望有private的repo,則要跟github付費才可擁有。而github另外有剪貼簿的功能,可將程式碼貼於其中,並自由的發展各種branch。
如以下連結:http://gist.github.com/37915

這邊簡單介紹一下git,再簡單介紹一下如何在github上面管理並開啟一個專案。

版本控制系統之所以存在,主要是為了開發軟體,並避免多人同時編輯同一檔案造成的混亂與困擾。這邊有一個subversion的線上中文文件,雖然是不同軟體,但是在版本控制的核心概念上並無二致。
http://twpug.net/docs/Subversion/

首先先來介紹如何將環境建置好。
建置環境分為三個步驟,安裝與設定git,安裝與設定ssh-key,以及在github上註冊,並建立一個repo。

1.安裝與設定git
Linux:
只要用yum,apt-get等各種套件服務尋找並安裝git,或是git-core即可。

Mac OS X
請在這邊抓取安裝檔案並安裝之
http://code.google.com/p/git-osx-installer/

Windows
請先抓取putty-installer安裝,或至少抓取plink.exe
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
接下來抓取msysgit的安裝檔
http://code.google.com/p/msysgit/downloads/list

安裝時,選擇使用Plink,並從putty安裝資料夾或plink.exe所在資料夾點選plink。

2.設定與上傳ssh key

git使用ssh tunnel來傳遞原始碼,這個加密通道可以避免原始碼的封包被攔截而竊取。
因此要先產生與上傳ssh key到github,方便之後與伺服器之間的通訊。

Mac OS X 與 Linux:

只要輸入ssh-keygen -t rsa並照著指示即可

[~/.ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tom/.ssh/id_rsa): <enter>
Enter passphrase (empty for no passphrase): <輸入存取此key之密碼,或直接按下enter使用空密碼>
Enter same passphrase again: <再一次輸入相同密碼>
Your identification has been saved in /home/tom/.ssh/id_rsa.
Your public key has been saved in /home/tom/.ssh/id_rsa.pub.
The key fingerprint is:
50:43:77:c6:97:af:61:82:dc:ea:9b:6b:67:d4:1b:61 tom@volcano

您的public key就存放在id_rsa.pub裡面,而id_rsa則是private key,請妥善保存以免遺失。
這個key是一對的,private key要存放於家目錄下的.ssh資料夾中。public key則複製後,貼上您github帳號中的SSH Public Keys欄位。注意小心不要複製到空格。

Windows:

在安裝好的git選單中選取git-bash,並輸入

ssh-keygen -C “username@email.com” -t rsa


一樣照著上面的指示,輸入密碼或跳過密碼設定之。key file一樣放在家目錄中的.ssh資料夾。

將Public key所有內容複製後貼上您github帳戶底下的 SSH Public Keys 欄位,一次貼上一個(注意,這邊貼上的是public key,另外請注意不要有空格。)

3.設定github帳號並開啟一個repo

在github您的帳號右上角可以看到一個Your Repositories,點選Create one。
輸入Project name以後,可以看到他有教學如何打開一個新的專案

這邊以一個名為test的專案為例

Global setup:

Download and install Git
git config --global user.email <這邊輸入您的email> #先在git自己的廣域設定中設好您的e-mail


Next steps:

mkdir test
cd test
git init #產生.git資料夾並存放git相關資料進去。
touch README #加點什麼東西,因為github會自動讀入您的README檔案並顯示於下面,因此先產生README。
git add README #將README加到stage
git commit -m 'first commit' #在local repo(也就是您的電腦上)提交為第一個commmit,註解為'first commit'。這個commit也可輸入為unicode中文。big5不知道支不支援,目前看起來應該不行。
git remote add origin git@github.com:<您的ID>/test.git #把github的repo加入為遠端的repo
git push origin master #把目前的commit狀態push並同步到github上面。


Existing Git Repo?

cd existing_git_repo
git remote add origin git@github.com:<您的ID>/test.git
git push origin master


把您的程式碼push上github後,您就可以有自己的repo了。

若您喜歡別人的repo,只要他是public的,您就可以點選上面的fork,把整個repo複製到您的帳戶底下,並開始看原始碼,對他修改。

若您fork了一個repo(假設名稱為test)到github中之後,只要輸入

git clone git@github.com:<您的ID>/test.git test


就可以將整個repo複製下來並存放在test資料夾中。

若您的ssh key有加上密碼保護,每次與github連線的過程中都需要輸入密碼以存取ssh key。


接下來簡單描述一下git要如何使用。

首先,開啟一個專案只要輸入

git init


再來,每次修改好了以後,可以先將修改存入stage

git add <modified files>


若一次修改大量檔案,可以將所有檔案修改都add進去stage

git add .


之後commit提交一次的修改

git commit -m "註解"


另外也可以把git add與git commit用一個指令完成

git commit -a -m "註解"


git特別的一點是,他可以在本地端開啟並使用。上面這些用法完全不用伺服器,本機就可以執行。

本地端會有自己的repo,可以在飛機上,各種沒有網路的地方都可以順利使用並提交任何變更。

等您覺得修改好了,可以放上伺服器的時候,確保網路連線並輸入

git push


就可以將這邊的檔案與變更提交到github上面。
如果您在github上的版本較新,也可以輸入

git pull


更新本地端的repo。

如果今天tom的test repo有了新的變更,告訴billy,billy要將變更merge到自己的repo中,可以在本地端輸入

git pull git://github.com/tom/test.git


pull這個指令其實涵蓋了fetch(將變更複製回來)以及merge。
因此經過merge後,tom的變更就加入到billy的repo囉!

另外版本控制系統的branch功能也很有意思,若您的程式碼同時要修改bug,又要加入新功能,可以fork出一個branch,一個專門修bug,一個專門加入新功能,等到穩定後再來merge

git branch bug_fix #建立branch,名為bug_fix
git checkout bug_fix #切換到bug_fix這個branch
git checkout master #換為主要的repo
git merge bug_fix #把bug_fix這個branch和現在的branch合併
git push origin bug_fix:refs/heads/bug_fix #把bug_fix這個branch推至遠端repo上面


若有branch在remote,想要查看並checkout出來

git branch -r #查看遠端branch
git checkout -b bug_fix_local bug_fix_remote #把本機端切換為遠端的bug_fix_remote branch,並命名為bug_fix_local


還有其他可以觀看repo狀態的工具

git log #可以查看每次commit的改變
git diff #可以查看最近一次改變的內容,加上參數可以看其他的改變,並互相比較
git show #可以看某次的變更


若想知道目前repo的狀態,可以輸入

git status



這邊只是一些簡單的功能,還有更多的功能,等大家去摸
想要深入了解git,可以看
http://excess.org/article/2008/07/ogre-git-tutorial/
這個教學影片說明的很詳細。

這個投影片也非常棒,強力推荐:
寫給大家的Git教學
http://www.slideshare.net/littlebtc/git-5528339

也有很多小工具,比如這個
http://gugod.org/2008/11/github-badge.html
可以把您目前的github repos顯示在blog上面

希望大家也能在git上面使用github開心的開發!

參考資料
http://github.com/guides/home
http://kylecordes.com/2008/04/30/git-windows-go/
http://nathanj.github.com/gitguide/creating.html
http://www.qweruiop.org/nchcrails/posts/49
http://www.slideshare.net/littlebtc/git-5528339

4 意見:

RD-Value 提到...

我可以轉貼這篇文章嗎 ?

Unknown 提到...

請自便 :)

凍仁.翔 (Chu-Siang Lai) 提到...

受用了 <(_ _)>

凍仁.翔 (Chu-Siang Lai) 提到...

補上 ihower 前輩的圖文簡報! -- Git and GitHub