iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
1
Software Development

用樂高玩轉 GIT 版本控制系列 第 8

Day 08 - 當你想為你的手冊作不一樣的版本時,談 git branch

有沒有印象,曾經電視劇有提出過網友票選解決這樣的活動?但票選公布的時間常常離結局的時間不遠,礙於時間因素,劇組可能就會決定,先把兩個結局都先拍好,時間點到了,再正式撥出票選決定的那版本就好。執行拍兩個版本的戲劇,再排劇本、作分鏡的時候,就與 GIT 的 branch 類似。

假設電視劇總共有十集,只有最後一集的結局是不一樣的,那麼劇本的編排就只需要從第九集之後,設定不一樣的劇本,也就是無論是那種結局,基底都是一樣的一到九集。交劇本的時候,也只要把最後一集的劇本替換為最後設定的結局,就是整份電視劇的劇本了。

上面這段話在談什麼?

劇本AB版本圖

如上圖,第十集的 A 劇本,跟第十集的 B 劇本,前面的一到九集是完全一樣的。

如果是樂高呢?如果劇情變成是,友人製作了一個樂高模型的樣板,前面的製作步驟完全是一致的,現在分享出來,讓網友們繼續基於這個樣板往下發揮;那A網友拿到開始從這個樣板開始做自己的創意,同樣的再基於樣板,做出製作手冊分享出來;B網友也同樣的基於樣板,製作自己的手冊分享出來,那這兩個網友做出來的手冊,原屬於樣板的步驟就會是一模一樣的。

GIT 的 分支 branch

那 GIT 版本控制的分支概念呢?GIT 的分支 branch 與電視劇、樂高手冊分版本完全是一樣的概念。還記得上一篇提到的 HEAD 指向 master 嗎?這個 master 其實就是一個 branch,一般來說 GIT 在進行 init 之後就預設有的分支,一開始就在這個分支上工作。

同樣的,假設我們原本有一個版本控制,目前進行到了HASH C 這個步驟,這時候我們想開始作兩個不一樣的版本,走不一樣的劇情,一個維持正式版本,另外一個供開發測試驗證使用,於是想要開啟不一樣的分支。

這時候,假設供開發測試使用的這個分支叫做「develop」那我們建立分支的方法也就只需要執行指令 git branch develop,這時候就會同樣在 HASH C 上面建立一個 develop 「標籤」,如下圖。

建立DEVELOP圖

對於 GIT 實作

為什麼一下叫分支 branch 一下又說 develop 是「標籤」呢?因為對於 GIT 來說,建立一個分支,就像是在 HASH C 上面貼上一張貼紙,讓這張名叫做 develop 的貼紙,貼到 HASH C 上面。

那上一篇所提到的 HEAD 指向 master 又是什麼意思?上一篇提到,HEAD 就像是跟著樂高手冊步驟時,鉛筆指向的那個步驟,而這邊 HEAD 指向 master 完整的意思就可以想像,master 這張貼紙,指向目前正在執行的步驟(HASH)上,而 HEAD 指向 master 這張貼紙

那如果我們把新的原始碼變更 commit 到儲存庫呢?這時候 master 這張貼紙,會往後移動轉貼到新產生的 HASH 上,而 HEAD 依然跟著 master 這張貼紙。如下圖:

新增 commit 對於 GIT 的概念

develop 分支呢?因為 HEAD 並沒有指向 develop,所以在新增 commit 到儲存庫的時候,develop 這張貼紙並不會跟著往後移動。直到 HEAD 指向它,並且在這時候又新增新的 commit 到儲存庫時,develop 才會跟著移動。還記得上一篇說的嗎?現在在哪裡很重要。HEAD 指向哪裡很重要。

總結:

當把 GIT 的 branch 認清為一個會移動的貼紙標籤時,GIT 很多關鍵的功能就變得很好解釋。

對於 GIT 來說,開分支的成本是很低的,只是增加了一個標籤,指到你所指定的位置上。當 HEAD 指向 develop,把原始把新增到舞台區,而後 commit 到儲存庫,這時候對於 GIT 來說,也就是在目前的 develop 這個標籤,移動到新產生的 HASH 上,而 HEAD 也維持指向到 develop 這個標籤上。


上一篇
Day 07 - 做到哪個步驟了?現在在哪?GIT HAED 很重要
下一篇
Day 09 - 寫好的手冊想改寫怎麼辦?談 GIT RESET
系列文
用樂高玩轉 GIT 版本控制30

尚未有邦友留言

立即登入留言