10/30/2011

GIT協同開發


自己學git的時間,斷斷續續加起來也不過2個多月的時間,認識週遭的同事大多也都使用SVN,鮮少接觸到git。

正如之前說的,用git的時機大多只管理我自己的job...很少用git跟人一起協同開發..

而自己對git的原理也矇矇矓矓的,只知道git對我來說,是個非常棒的軟體管理和提高效率的好工具!

奈何它也確實學習曲線頗高,剛接觸的人如果不是抱有很大的興趣的話,很容易讓人打退堂鼓。

前陣子公司正好要開始開發系統的東西,意識到沒有版本控制的工具,真的會一團亂...所以開會提出要架設server來管理版本。

這對我來說實在是大好機會 ! 立刻毫不猶豫把Git提出來,並分析Git的好處和它的優秀又快速的branch...

很可惜的,最終還是敗給SVN,因為SVN相對而言較簡單,我也承認SVN的確入門....但我對它的歷史查找和開設branch實在是無法認同。

SVN架了一陣子,因為種種因素而失敗,所以最後主管同意讓我去架設git server,這讓我高興了好一陣子呀 XD

雖然server我不會架...但弄一個簡單的repository讓同事clone這點我還是會的qq

因為公司有同事並不熟悉git,所以就寫了這些東西,順便拷貝上來作筆記 :)

============

整個source branch model我都是參考這篇,這對個人或小型團隊真的是滿漂亮的模型,我自己的job也都是這樣去分的 :)

一般而言,我都會在遠端開設develop分支,所以clone下來之後可以看到兩個遠端分支 :






預設都會指向遠端master分支,因為master屬於穩定發佈的分支,是不能隨便去merge或是commit,所以應該在自己的本地去新建一個分支,這個分支的名字最好對應遠端develop,讓自己知道該向哪一個遠端分支進行提交 :








"git co -b develop" 這意思就是在當前的分支(master)checkout出來一份並切換到你建立的分支底下,所以這時master和develop就屬於同一平行線上,不管你對develop做多少修改,都不會影響到master分支,所以從develop分支底下就可以安心進行工作了.

但依我自己的習慣,我建議在develop底下再建立一個分支來開發,等最後開發好了再merge到develop。這樣做的原因是一來不用擔心自己把develop這分支弄壞,造成其它人的不便。二來隨時可以很方便的對develop分支進行diff,來觀察自己改了什麼導致系統不正常或其它原因。三來是怕有時腦神經大條,commit到錯的檔案或是忘了add ( 這點我常犯的XD),最後還要用reset回去...

所以在develop分支底下再checkout出來一分 :







現在可以安心進行開發了,先在a.c裡面加了一個printf :















可以看到多了一個"Hello test",還有status,以及最後再把它commit上去,現在回到develop底下,再merge hello_test,讓develop有了hello_test功能 :





加"--no-ff"是為了讓merge之後的訊息不要遺失,清楚呈現整個分支merge狀況,像這樣 :















現在dicky的工作結束了,所以可以對遠端develop提交成果,讓大家可以使用你的功能 :







註 : 如果發現自己merge的分支裡面有存在很嚴重的bug,但都己經commit和push到遠端分支了....該怎麼還原遠端分支 ? 用reset只對自己的本地有用而己...
我不清楚是否還有更好的辦法,我自己是先創個分支把develop備份起來,再回到develop使用reset --hard還原,然後把遠端develop砍了....再重新把reset過的develop push上去 :

$ git checkout -b develop_bak develop                                            // 先備份develop
$ git checout develop                                                                    // 切回develop
$ git reset --hard 2941b2d2e89adc311354bffea4fb521941976790     // 還原
$ git push origin :develop                                                             //  把遠端分支砍了
$ git push origin develop                                                              //  再重新push develop到遠端



假設Jimmy也clone一份,但他需要知道先前有沒有人更新過,所以在工作前要把server上資料pull下來:








從git回應的訊息來看,Jimmy知道有人創建develop並在更新遠端develop,這時Jimmy想要跟蹤這個遠端分支develop,並且以後也想在develop做開發 ,可以運行"git checkout --track origin/develop" :


















這樣一來,Jimmy以後可以在自己的develop分支來進行開發和提交了。

假設另一個人Jack在develop更新了功能並己經更新,但Dicky並不知道,也更新了develop,commit之後在push時會出現git需要先pull :







Dicky也對遠端develop進行pull,但卻發現在Auto merge a.c 時發生錯誤 :








這時就需要自己手動把錯誤修改回來再commit回去,先來看看錯誤是長什麼樣子 :







所謂的"HEAD"就是自己所增加的程式,而另外一個用"="分開並用哈希做為結尾就是Jack所增加的程式,通常這種錯誤都是發生在兩方修改同一行,Git是沒辦法解決這種衝突,需要自行修改,修改完之後長這樣 :






這時Dicky就可以再重新commit和push上去了 :