iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
Software Development

Emacs 來寫程式系列 第 11

[Emacs-11] 版本控制:Emacs Magit 的分支管理

分支管理 (Branch)

常常在專案開發時或產品推出後,我們會想加入新的功能或多項新的功能到目前的專案上,或是要解決一些 Bug, 但要在開發完整前需要充分測試完才能進入下一個階段,這個時候專案分支就可以應用上,分支是 Git 很強的功能之一,複雜的分支可能像是 Imgur (https://git-scm.com/book/en/v2/Git-Branching-Branching-Workflows 截圖)

在開發新的功能階段,我們可能還需要對已經在市場的產品進行臭蟲修改,例如Imgur

因此分支的管理對於專案而言,其重要性不可言喻

用 Magit 建立分支

Magit 裡跟分支有關的次指令是使用 b,按下 b 會出現另一個指令緩衝區 Imgur
這個次指令下

  • 可以建立一個新的分支(使用 c)
  • 可以切換到另一個分支 l,等等
    我們用 c 來建立一個分支,Magit 會問這個分支要從哪裏分出來,這裏我們選 master wherebranch
    打入新分支的名字 branch1 branch
    這時後 Magit 的緩衝區會出現 Head: branch1 ... Imgur

利用 b cb l 來建立及切換分支,最後我們建立了 branch1 (基於 master),branch2 (基於 branch1),中間對 Master 做了一個 hotfix跟 commit

合併分支

我們對於 branch2 已經非常滿意,現在要把它合併回 master,先用 b l 切回 master,按 m (merge)merge
這個指令也有次指令如圖 merge2

再按一次 m ,會問你要跟哪ㄧ個分支合併Imgur
選擇 branch2 後 conflict

無法合併,因為有衝突,衝突來自於 test.txt 這個檔案 branch2 跟 master 都修改過,我們需要來解決衝突 (conflict)

處理合併衝突 (conflict)

Emacs 使用 Ediff 來解決衝突,按 E 來啟動 EdiffImgur
一樣有次指令,再按 m (Resolve) 來解決衝突,如果有多個衝突的地方,按 p 或者 n 來選擇要解決的地方 Imgur
這裏有三個緩衝區,上面左邊來自於 Master 分支(稱為 a),上面右邊來自於 branch2 分支 (稱為 b),下面是合併完的檔案樣子(稱為 c),這裏的指令可以按 ? 來開啟幫助緩衝區 diff
因為 branch2 修改比較多,我們先將右邊(b) 複製到 (c),直接按 b Imgur
然後直接再 (c) 打入 (a) 的 hotfix 部分,滿意後按 q 然後存檔 (yes)

合併完成

這個時候 master 分支已經將 branch2 合併進來 merge
做一個 commit commit
預設會直接給你 Merge branch 'branch2' 的訊息,Ctrl-c Ctrl-c 來完成
看一下 logl llog

Rebase (衍合)

Rebase 通常使用在整理或者修改已經 commit 過的歷史,Magit 讓你可以互動式做 rebase,rebase 可以做

  1. commit 歷史的重新排列 (re-order)
  2. 可以將一些歷史壓縮 (squash)
  3. 可以將一個 commit 拆開 (un-squash)

假設上面合併完成的歷史,我們不滿意它看起來很複雜,不是一系列,我們來用 Rebase 修改它

先將 logl l 叫出來,將游標移動到分支的最起點,second commit 的地方 rebase
按一下 r,會出現 rebase 次指令 rebase
我們使用互動式 i interactively 來整理從剛剛游標的commit 一直到最近的 commit commitlog
它的順序是從舊到新,最上面是 second commit,一直到最新的 commit to branch2
這個介面讓我們可以用 Meta-n Meta-p 來重新排列 commit 的歷史,可以按 s 來 squash 某些 commit,完整的指令如 Imgur
假設我們把 branch1 squash 掉,squash
合併時按 Ctrl-c Ctrl-c,可能會產生衝突 (conflict),用 Ediff 解決Imgur
做 commit, 修改因為 squash branch1 到 master 的原始訊息 Revisemsg
再按一次 r 繼續 rebaser continue rebasecont
最後的 Log 會是乾淨清爽的 Imgur

遠端資源庫

Magit 支援遠端資源庫的指令有

  1. M Remoting : 來加入新的或命名遠端的名稱 (origin)
  2. P Pushing: 將本地資源庫送到遠端
  3. f Fetching: 取遠端資料庫
  4. F Pulling: 取遠端資料庫並合併到本地

這些指令比較容易,詳細操作可以看我的影片

可以跟著我的影片操作

我的部落格

Elips 的程式 你可以下載 init.el 放在 ~/.emacs.d/ 下,啟動 Emacs,套件會自動下載設定

相關簡報


上一篇
[Emacs-10] 版本控制:Emacs 的 Git 介面 Magit - 1
下一篇
[Emacs-12] 專案管理 : Projectile
系列文
Emacs 來寫程式30

尚未有邦友留言

立即登入留言