NUK JavaScript Lesson 07:Git 分支 (Branch)

想了很久,決定直接寫 Git Branch 的筆記,SourceTree 目前只用來看 Commit Tree 的狀況,因此打算就直接進入分支的世界啦!

前言:為什麼要用分支

在我初次學習分支 (Branch) 之後,我對分支的第一個印象,就是分支真的好複雜!
自己一個人開發時,根本完全用不到分支,有的話也頂多一兩個,只會使用到基礎的指令!但是,如果是多人開發時,就不可能都是在 master 分支做開發了。

因此,理解分支 (Branch) 是相當重要的事情,否則日後要是不小心把重要的專案弄壞的話,那可就母湯了。

分支 (Branch) 介紹

Branch 通常用來區分正式版本與開發版本的網站,像是以名稱為 master 與 dev 的兩個 Branch 做區分。
這邊也稍微介紹一下幾個常見的分支名稱唄!

常見分支名稱

  • master:預設分支
  • develop:開發分支
  • feature:開發新功能分支

我自己通常是把 master 分支當作是穩定版本,就是上市、正式發布的網站或軟體的版本;
而 dev(或 develop)分支則做為測試版的開發線,等開發完畢也 Debug 完成之後,再合併到 master 分支並發布。

而所謂的合併分支,就是把兩個分支的 commit 紀錄進行合併。
這邊可以先想像一下,其實分支就像是便利貼,可以貼在某個 commit 上。

開分支流程

  • 新增分支:git branch 分支名稱
  • 查看分支:git branch
  • 切換分支:git checkout 分支名稱
  • 刪除分支:git branch -d 分支名稱-D 是強制刪除)
  • 還原上個版本:git reset HEAD^

關於 checkoutreset 的使用,可參考 上篇筆記 裡的還原技巧說明。

合併分支

最一開始有提到,所謂的合併分支,就是在開發分支 (dev) 完成之後,使用 merge 等指令將它合併到主要分支 (master) 上面。

  • 合併分支:git merge 分支名稱
  • 取消快轉:git merge 分支名稱 --no-ff

快轉機制 (Fast-forward)

簡單來說,快轉機制就是直接把開發分支 (dev) 移動到主分支 (master),這樣就可以導入 dev 分支的內容了。

如果想要有一個新的提交紀錄,來記錄 “合併” 這件事情,就可以使用「取消快轉」。

  • 預設使用快轉:本地與遠端兩條相同的任務分支時,可以用快轉
  • 取消快轉:兩個不同任務分支合併時,取消快轉

解決衝突流程

在合併時,如果兩個分支改到同一個檔案的話,使用 merge 合併時會發生衝突!

在發生衝突之後,我們可以使用 git reset --merge 指令來回到合併之前的狀態。
Git 1.7.4 版本之後,也可以使用 git merge --abort 來回到合併前的狀態。

回到合併之前的狀態:

  • git reset --merge
  • git merge --abort

Q:在進行 git merge 時加上 --abort 這個參數,可以做什麼呢?
A:簡單來說,加上 --abort 參數後,如果合併沒有順利完成的話,這個參數可以讓專案會自動回到合併之前的狀態。

其他指令

  • 拿掉作者、日期等相關資訊,只保留驗證字串的七碼:git log --oneline -graph
  • 還原合併前狀態:git reset --hard ORIG_HEAD
  • 將特定 commit 貼上分支:git branch 新分支名稱 commit編號

後記

其實 Git 的知識內容相當廣泛,還有許多內容還沒提到,像是 revertcherry-pick 等等。
這些內容其實在 Learn Git Branching 遊戲內都有提到,相信破關之後再多複習幾次,應該就能熟練地使用 Git 了。

以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫。