# 短心得-git rebase -i

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](https://github.com/Desolve/LeetCode)當作範例：

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1768759622855/cba2c600-2c1a-4d3f-8c6e-d9f65e608d15.png)

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

  
git rebase -i 971725c

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1768759623923/55ec1dad-6045-495f-beee-25166101d23f.png)

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1768759624576/4fcc072d-dd0b-4f65-8b83-d5339386bc17.png)

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

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1768759625223/2c3e0f66-5e46-4191-8bbb-832cd61fa4e5.png)

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

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

以上提供大家參考~
