常常在專案開發時或產品推出後,我們會想加入新的功能或多項新的功能到目前的專案上,或是要解決一些 Bug, 但要在開發完整前需要充分測試完才能進入下一個階段,這個時候專案分支就可以應用上,分支是 Git 很強的功能之一,複雜的分支可能像是 (https://git-scm.com/book/en/v2/Git-Branching-Branching-Workflows 截圖)
在開發新的功能階段,我們可能還需要對已經在市場的產品進行臭蟲修改,例如
因此分支的管理對於專案而言,其重要性不可言喻
Magit 裡跟分支有關的次指令是使用 b
,按下 b
會出現另一個指令緩衝區
這個次指令下
c
)l
,等等c
來建立一個分支,Magit 會問這個分支要從哪裏分出來,這裏我們選 master 利用 b c
跟 b l
來建立及切換分支,最後我們建立了 branch1 (基於 master),branch2 (基於 branch1),中間對 Master 做了一個 hotfix跟 commit
我們對於 branch2 已經非常滿意,現在要把它合併回 master,先用 b l
切回 master,按 m
(merge)
這個指令也有次指令如圖
再按一次 m
,會問你要跟哪ㄧ個分支合併
選擇 branch2 後
無法合併,因為有衝突,衝突來自於 test.txt 這個檔案 branch2 跟 master 都修改過,我們需要來解決衝突 (conflict)
Emacs 使用 Ediff 來解決衝突,按 E
來啟動 Ediff
一樣有次指令,再按 m
(Resolve) 來解決衝突,如果有多個衝突的地方,按 p
或者 n
來選擇要解決的地方
這裏有三個緩衝區,上面左邊來自於 Master 分支(稱為 a),上面右邊來自於 branch2 分支 (稱為 b),下面是合併完的檔案樣子(稱為 c),這裏的指令可以按 ?
來開啟幫助緩衝區
因為 branch2 修改比較多,我們先將右邊(b) 複製到 (c),直接按 b
然後直接再 (c) 打入 (a) 的 hotfix 部分,滿意後按 q
然後存檔 (yes)
這個時候 master 分支已經將 branch2 合併進來
做一個 commit
預設會直接給你 Merge branch 'branch2' 的訊息,Ctrl-c Ctrl-c
來完成
看一下 log 按 l l
Rebase 通常使用在整理或者修改已經 commit 過的歷史,Magit 讓你可以互動式做 rebase,rebase 可以做
假設上面合併完成的歷史,我們不滿意它看起來很複雜,不是一系列,我們來用 Rebase 修改它
先將 log 用 l l
叫出來,將游標移動到分支的最起點,second commit 的地方
按一下 r
,會出現 rebase 次指令
我們使用互動式 i
interactively 來整理從剛剛游標的commit 一直到最近的 commit
它的順序是從舊到新,最上面是 second commit,一直到最新的 commit to branch2
這個介面讓我們可以用 Meta-n
Meta-p
來重新排列 commit 的歷史,可以按 s
來 squash 某些 commit,完整的指令如
假設我們把 branch1 squash 掉,
合併時按 Ctrl-c Ctrl-c
,可能會產生衝突 (conflict),用 Ediff 解決
做 commit, 修改因為 squash branch1 到 master 的原始訊息
再按一次 r
繼續 rebase 按 r
continue
最後的 Log 會是乾淨清爽的
Magit 支援遠端資源庫的指令有
M
Remoting : 來加入新的或命名遠端的名稱 (origin)P
Pushing: 將本地資源庫送到遠端f
Fetching: 取遠端資料庫F
Pulling: 取遠端資料庫並合併到本地這些指令比較容易,詳細操作可以看我的影片