短心得-git rebase -i

Chih-Yu Lin
Jun 13, 2023

git rebase -i 以及預設編輯器修改方法

在git的常見指令當中,git rebase是一個工作時常用的到的東西;
尤其當本地端要和遠端的server同步的時候,
我們常常會下:

git pull --rebase

該指令原則上會將遠端的新commit(s)下載下來,
擺在本地端的HEAD上,最後再將本地端的commit(s)重新銜接上去;
在這個過程中,pull下來的分支被當成主幹,而本地端多出來的那些commit(s)則被視作要銜接上去的分支。

問題來了,如果我們在工作時共同開發的時候,
也許某些功能彼此的用途或目的比較一致,
我們會希望commits的順序是A -> D-> B -> C,
但本地目前是A -> C,遠端目前是D -> B,
如果進行pull rebase沒有發生衝突的話,
會變成D->B->A->C,顯然和我們想要的不同。

這個時候,一個比較簡單的方法是使用git rebase -i [commit-id]。

筆者使用自己之前練題放上github的repository當作範例:

假定我想要調整0148和0238的commit順序的話,
可以這麼下:


git rebase -i 971725c

這意義代表以971725c為基準(這個基底是不能調的!),
以互動的模式來幫我調整後面的commits,
接著只要在文字編輯器上將想調整的commit直接調順序即可。
當然,如果想要直接砍掉某個commit,也可以將pick改成drop,
它就會直接消失囉!(慎用XD)

另外一方面,如果是VSCode的話,可以考慮安裝GitLens的Extension,
操作起來會更直覺:

git rebase -i在有裝GitLens的狀況下可以直接拖拉

最後,有安裝VSCode的話,
預設編輯器應該會變成使用VSCode開啟。
(不管是rebase還是做commit都是)

但如果預設不是的話,
可以使用以下方式修改:
(請特別注意,由於VS Code的路徑內含空格,而且需要下--wait等待,
所以外側要下雙引號,然後內側路徑要用單引號括起來
才不會出現路徑錯誤的問題。)

git config --global core.editor "'C:\Users\user\AppData\Local\Programs\Microsoft VS Code\bin\code' --wait"

以上提供大家參考~

--

--

Chih-Yu Lin

LeetCode、Python、Java、Android;第11屆iT邦幫忙鐵人賽Software Development組優選(從LeetCode學演算法);HiSKIO特約講師;課程優惠: https://bit.ly/lc2022all ;合作請洽: learnwithdesolve@gmail.com