為什麼需要分支

正式主機是不會亂更動的,如果需做更動通常會先開一個分支 ( 測試主機 ) ,更動的內容於測試主機做 commit ,等到客戶檢查無誤才會 push 上正式主機。

開分支、合併分支流程

  • 新增分支:git branch 分支名稱
  • 查看分支:git branch
    • 按小寫 q 可回到環境區域。
  • 切換分支:git checkout 分支名稱
    • 從 a 分支切換至 b 分支可使用此指令。
    • git branch 可查詢目前所有分支。*星號標記的為目前所在的分支位置,HEAD 會跟隨checkout 分支名稱 ( 切換到那個分支,HEAD 就會跟著它 )。
  • 合併分支:git merge 分支名稱

開發情境 :

目前有一筆新資料要上傳正式主機前,先於測試主機審核步驟

  • 於 master 開一個新分支,命名 develop → git branch develop
  • 查詢目前分支有哪些 → git branch 。可見目前有 develop 與 master 分支,而目前位置在 master 分支上
  • 把分支切換到 develop → git checkout develop 。可見目前星號在 develop 上,切換成功 !
  • 因為目前在 develop 分支上,所以新 commit 的資料會在 develop 分支上,master 分支是不會有這筆資料的。

Git 分支_01

// 使用 git branch 可查詢現有的分支們, *星號標記的為目前所在的分支位置(HEAD 也在目前星號上)。

  • 通常這種開發情境會使用在不想直接把新資料蓋在正式主機上 ( master ),所以另開一個分支 ( develop ),把新資料丟此,確認無誤後,再 push 到 master 分支。如下示意圖。

Git 分支_02

新資料無誤後, master 分支與 develop 分支合併之後上傳遠端數據庫。

  • 首先 master 要擁有 develop 資料,要先切換至 master → git checkout master
  • 把這兩個分支作合併 → git merge develop

Git 分支_03

// master 與 develop 合併 ( merge ) ▲ 圖片來源:六角學院

Git 分支_04

// sourcetree 示意圖 – master 與 develop 合併 ( merge ) ▲ 圖片來源:六角學院

合併 & 快轉機制

  • 合併分支:git merge 分支名稱
  • 取消快轉 ( 不要使用快轉模式合併 ):git merge 分支名稱 --no-ff
    • --no-ff 參數是「不要使用快轉模式合併」的意思,這樣一來就會額外做出一個 Commit 物件。
    • 非快轉模式合併的好處是可以完整保留分支的樣子 ( 會有小耳朵 ),方便日後查詢紀錄。

Git 分支_05

  • 觀看線圖:git log —oneline -graph
  • 還原合併前狀態:git reset —hard ORIG_HEAD

以遊戲來了解開分支與合併快轉機制流程

遊戲網址 : https://learngitbranching.js.org/

EX 01

因同個源頭 C3,為了讓它們保留分支的樣子 ( 小耳朵 ) ,所以使用 git merge dev --no-ff 讓 dev(c6) 與 master 合併成 C7 時會額外做出一個 commit 物件

  • 如果直接使用 git merge dev 快轉也是可行的不受影響,只是就不會有小耳朵 ( 不會像左圖一樣知道 dev 過去紀錄改了些甚麼,因為與 master 做合併了 )。下方示意圖右
  • git merge dev --no-ff 非快轉模式合併的好處是可以完整保留分支的樣子。 下方示意圖左

Git 分支_06

EX 02

結尾直接下 git merge dev 即可。因 dev 與 master 是以 C2 為基底,dev 與 master 都各自在 C3 與 C5 更新資料,所以 C6 做合併時不須用到快轉機制。

步驟 ,從 C1 開始

  1. git commit
    • 例如 C1 → C2 為開一個新的 commit
  2. git branch dev
    • 開新的名為 dev 的分支
  3. git checkout dev
    • 切換到 dev 分支。 要在不同分支做操作記得一定要先做切換 → git checkout 分支名稱
  4. git commit → dev 分支開了 C3 的 commit
  5. git commit → dev 分支開了 C4 的 commit
  6. git checkout master
    • 切換到 master 分支
  7. git commit → master 分支開了 C5 的 commit
  8. git merge dev
    • C4 與 C6 做合併

Git 分支_07

git merge dev --no-ff 非快轉模式 / 使用時機

  • 同個源頭再使用
  • 同源頭使用非快轉模式合併的好處是可以完整保留分支的樣子 ( 同源頭不用非快轉模式用可看上方範例一 ),不同源頭本來分支就不同所以不須再多此一舉。

Git 分支_08

資料來源

最後修改日期: 9 月 2, 2020

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。