close

git_flow.png        

今天來分享一下"Git"這個最近覺得很好用的版本控制軟體的使用方法。

這是在unix based工作環境使用的版本控制軟體,可以在下面2個網站download到source code:

http://git-scm.com/

http://git.or.cz/index.html

Git - The stupid content tracker. 據說他的開發者之一Linus是這樣形容它的。

 

所謂版本控制 (Version Control),即是對不同版本的檔案做管理、備份、回復等的動作。

這些檔案可能是程式的source code,或是像我們在用Latex寫論文時的文字檔。

 

大部分的人平常可能沒有做version control的習慣,那如果在寫程式時,發現原本可以動,

但是改了一些東西後,發現不能動了,甚至是compile不過,這時候記憶力好的人,

可能會記得改了什麼東西,再嘗試著自己手動做復原的動作,

但是如果更改的程度很大,或是手動復原又出錯,那就只能哭哭了...0rz

 

有些人在寫code時有想到要做version control,但是也許他不知道、沒想到,

或是不想用version control的軟體來幫他做管理,

那麼可能會在要做更動前先手動copy備份,以免發生改完不會動的慘劇,

但當copy的備份檔很多時,畢竟還是會很不方便。

 

通常在開發大型專案,或是一些比較謹慎的人,在寫東西時,

會使用version control的工具來對不同版本的東西做管理、備份與回復等的動作。

我們實驗室之前是使用svn這套工具來做version control,

但是就我自己使用的經驗來說,每次要commit或是要checkout一些檔案,

就必須把完整的路徑打出來,而且又不能按tab自動補完路徑,

甚至當我想把整個project的資料夾搬動或改名時,原本的svn就會出錯了,

因為檔案路徑已經跟原本的不一樣,很不方便

 

最近開始使用git這個tool來做version control,和svn最大的不同在於git是分散式的,

當你今天要把整個project的資料夾改名還是換路徑時,就直接換就好了,

甚至要發佈給別人用,就整個資料夾tar起來丟給別人,或是用git的clone就可以了。

使用git在複製整個資料夾時,就同時把整個version control的tree也一起複製過去,

變成一棵新的tree。

另外,它也像svn一樣,支援使用網路下載整個project的資料夾。

對我來說,svn能做到的,git都能做到,但是git這種分散式的模式所帶的方便,卻是svn沒有的。

 

以下是我使用上面這張圖來稍微介紹一下git的使用方法,我目前也只會使用這些方法來用git,

其他的功能還沒用到的,目前也還不清楚用法,不過上圖中的指令已經很夠一般個人使用了。

一開始剛要開始使用git時,要先在project的目錄執行下面的指令來初始化git的資料庫

(大部分的version control tool都叫這資料庫做repository):

  % git init

 

當編寫了一些檔案後,要把這些檔案使用git來做版本控制,則用下列的方法來把檔案加進資料庫:

  % git add .   #這是把目前資料夾內的所有檔案加進資料庫,包含子資料夾

  or 

  % git add file_name   #這是把file_name這個檔案加進去

 

接著當每次覺得需要備份目前的版本時,可以使用下列的指令來備份目前資料庫中的檔案:

  % git commit -a

這樣就可以像上圖中那樣,有m0, m1, m2, ...等不同的版本備份。

 

然後在平常的時候可以用下面的指令來看一些狀況:

  % git log   #這可以看每次commit檔案時,自己寫的log檔

  % git status   #這可以看一下目前有哪些檔案有更改到,但是還沒備份到版本資料庫的

  % git diff   #這可以看目前的檔案和上一次備份到資料庫裡的檔案,有什麼不同的地方。

 

當覺得目前的東西改壞了,想要回復前一個版本,這時只要執行下面的指令即可:

  % git checkout asasdfasdfsadf.....   #後面是一串亂碼,這應該是hash產生的碼,可以用git log去看每個版本的hash碼

這樣就可以回復到上面那串亂碼的版本了。

 

最後一個目前覺得最好用的功能就是branch的控制。所謂的branch,其實就像是樹幹的分支一樣。

在使用git時,當還沒有branch前都是在master這個主幹上,

當你想要做一些很大幅度的修改,但是又想在原本master這個主幹上繼續做些修改,

這時就可以使用branch來做個分支,這樣就可以像上圖那樣,同時maintain兩個版本的更動。

 

使用下面的指令可以知道目前在哪一個分支上,以及目前有多少分支:

  % git branch

在還沒有創造分支之前,都會輸出下列的訊息:

  % * master   #表示目前在master這個主幹上

當想要做些大幅度的修改時,可以用下面的指令來新增branch:

  % git branch fix_bug   #這樣就新增了fix_bug這個分支

然後用下列的指令來切換到fix_bug這個分支:

  % git checkout fix_bug

這時候再打git branch就會顯示下面的資訊:

  %    master

      * fix_bug

表示目前在fix_bug這個資料夾。

這時候在master和fix_bug這兩個分支都可以分別去進行commit的備份動作。

可以使用git checkout mastergit checkout fix_bug來切換,

記得每次切換前都要先commit

切換branch其實都在同一個資料夾下動,git會自己把檔案內容改成在不同branch時的最新版本的內容。

 

就是這個功能非常好用,今天如果我想試個東西,就checkout個branch,

如果改壞了,就整個branch砍掉就好,完全不會影響到原本master主幹上的東西

 

最後如果要把branch的東西和原本master的東西做merge,則要先切換回master,

然後執行下面的指令:

  % git merge fix_bug

這樣就可以把master和fix_bug的東西做merge,然後可以用git branch -d fix_bug把fix_bug這個branch砍掉。

 

以上就是我目前使用git所用到功能的使用方法。

arrow
arrow
    全站熱搜

    jylai1982 發表在 痞客邦 留言(1) 人氣()