遠端多人合作開發-單分支

上個單元介紹如何在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並沒有分叉,想當然爾這是一個快轉合併囉!

由上你可發現使用同一遠端儲存庫,然後在不同電腦做版控,
就只是clonepushpull三個指令在做變化而已。
第一次用clone複製到本地,
然後本地建好版本就push上傳、若遠端有新版本就pull下來,
等本地又有新版本再push上去,遠端若又有新版本就再pull下來…
就這樣一直循環建立版本控制,不難!不難!

二、多人合力開發

其實不管是幾個人,整個團隊的開發流程是差不多的,
你只要將辦公室家裡改成同事甲同事乙,然後所有流程都一樣,搞定!

流程:先要有人在遠端建好儲存庫,接著團隊的每個人clone一份完整的儲存庫到自己的電腦,
接下來若有人寫了新版本就push上遠端,其他人要這個新版本就pull下來自己電腦…一直循環,
完成版本控制。

results matching ""

    No results matching ""