遠端多人合作開發-單分支
上個單元介紹如何在GitHub建立一個遠端儲存庫,接下來這個
單元要來看本地與遠端如何運作,同時為了將問題複雜度簡化,
此單元只介紹一個mater分支情況下的開發流程。
一、只有一個人開發
若你在使用GIT版本控管只是自己一個人獨力開發程式,且不會分支,
只用master分支來開發,那開發流程是如何呢?我們來看一下。
首先就像上個單元所講的,你必須先建立一個遠端儲存庫和本地儲存庫,
並且讓兩個儲存庫連結:
你可以使用自己建立的遠端儲存庫。若懶得建立,請上網將底下專案Fork至你自己的儲存庫吧:
https://github.com/kingofamani/sample501
接著clone至辦公室
的電腦,記得要用你自己
的GitHub帳號:
git clone https://github.com/[你的GitHub帳號]/sample501.git
打開sourceTree開一下分支圖,有5個提交版本:
圖中除了有master分支外,多了origin/master及origin/HEAD分支,
這兩個分支其實是存在於遠端GitHub儲存庫的分支。當我們把儲存庫clone下來後,
就會自動在本地建立起這些分支,藉以追蹤遠端分支,
因此我們可以將origin/master、origin/HEAD稱為本地追蹤分支
;
而origin/HEAD是GIT自動產生,用來指向目前分支的最新版本,
也就是指向origin/master,所以其實遠端只有一個origin/master分支。而origin其實就是遠端儲存庫的別名,你可以輸入
git remote -v
就可以看到遠端儲存庫的路徑:
如果要查看所有分支,可用
git branch -a
指令查看,其中紅色的表示本地追蹤分支:
好了,現在你辦公室
電腦已經有完整的Git版控啦。
現在要進行程式開發,假如我又提交了兩個版本:
cd sample501
echo 1 > 6.txt
git add .
git commit -m "C6"
echo 1 > 7.txt
git add .
git commit -m "C7"
現在開始,本地和遠端的儲存庫版本有差異了,本地有7個版本,遠端只有5個版本:
那遠端要如何取得這兩個新的版本呢?簡單,只要下push
指令就可以了:
git push origin master
現在遠端也有最新版本,準備下班回家囉!
回到家後,準備洗澡看電視,好好休息一番…但…老闆此時來電,表示案子進度不夠,明天要
看到某某功能完成,天啊!又要加班,不得已,只好又打開電腦,繼續coding…
打開電腦後,家裡電腦並沒有程式碼,怎麼辦咧?
就克隆
下來就好啦…
git clone https://github.com/[你的GitHub帳號]/sample501.git home501
接著在家裡又提了一個版本,並上傳至遠端:
cd home501
echo 1 > 8.txt
git add .
git commit -m "C8"
git push origin master
現在家裡電腦和GitHub遠端儲存庫都同步了,開心!總算可以睡覺囉!
隔天…
來到公司辦公室後,打開電腦,再來要做什麼呢?當然是繼續扣頂!扣頂!
呼~好不容易又改了一個功能,也提交了一個版本:
cd sample501
echo 1 > 9.txt
git add .
git commit -m "C9"
接著開開心心下了push
指令,準備上傳吧~~~
git push origin master
蝦米~error~怎麼了?開發的程序和之前一樣,怎麼會出錯呢?啊…早知道就不要用Git…哇~~
沒關係,別急!來看怎麼了,我們先來比較一下GitHub網站、家裡、辦公室儲存庫的版本:
原來是昨天晚上在家裡做的C8
版本,並沒有在辦公室的儲存庫裡,
這個時候我們只要透過git pull
指令,將GitHub昨晚更新的版本下載至辦公室儲存庫即可:
git pull origin master
※ pull後看一下分支圖,你會發現多了一個耳朵,就好像之前在做merge時一樣。
其實pull指令包含了兩個動作,第一個動作是先將origin/master遠端分支的版本抓下來(fetch),
然後再將master與origin/maser做合併(merge)的動作,如此本地的master也就有了遠端master分支的新版本了。所以 pull = fetch + merge
有些人不喜歡每次pull後,會產生一堆merge後的耳朵,因為會習慣將master與origin/master看成一同一分支,
當有新版本時,也只是在同一分支做快轉而已,那要怎麼做呢?
如果下 git push --no-ff origin master可以嗎?當然不行,origin和origin/master在C7
時已經分叉開了,
當然也就沒有所謂的快轉合併,因此用--no-ff參數是沒有意義的。有一個方法可以解決,我們可以使用
pull --rebase
來完成任務,
指令為git pull --rebase origin master
下載合併後,
C8
放進來了,而且還是在同一條線上,好看!但有一點要注意,使用
--rebase
後,C9
版本的SHA1值被改變了,
由於我們還沒將C9
版本push
上遠端,因此也就不用擔心其他人版本會亂掉的問題。
另外還有一個問題,若rebase時origin/master有多個commit,一旦發生衝突(conflict)時,
是會接續產生的,你必須一一處理每個commit的衝突後,才能pull
辦公室的儲存庫也有C8
版本了,但GitHub遠端還沒有今天做的C9
版本,
此時下push
指令就可以上傳了:
git push origin master
今天的工作總算又解決了~
考考大家,如果回家後,要繼續做版控,你會怎麼做呢?
偷偷地告訴做法好了,但這次我要用不一樣的方法來完成,
還記得剛才有說過pull其實是fetch + merge兩個指令,如果分開下指令會怎麼樣呢?首先下fetch指令:
cd home501 git fetch origin master
分支圖可以看到已經將
C9
版本抓下來了,但還沒有合併,因為master和origin/master
是在不同版本上。
接著我們要做合併動作git merge origin/master
由於master和origin/master並沒有分叉,想當然爾這是一個快轉合併囉!
由上你可發現使用同一遠端儲存庫,然後在不同電腦做版控,
就只是clone
、push
和pull
三個指令在做變化而已。
第一次用clone
複製到本地,
然後本地建好版本就push
上傳、若遠端有新版本就pull
下來,
等本地又有新版本再push
上去,遠端若又有新版本就再pull
下來…
就這樣一直循環建立版本控制,不難!不難!
二、多人合力開發
其實不管是幾個人,整個團隊的開發流程是差不多的,
你只要將辦公室
和家裡
改成同事甲
與同事乙
,然後所有流程都一樣,搞定!
流程:先要有人在遠端建好儲存庫,接著團隊的每個人clone
一份完整的儲存庫到自己的電腦,
接下來若有人寫了新版本就push
上遠端,其他人要這個新版本就pull
下來自己電腦…一直循環,
完成版本控制。