[git]source tree裡rebase的使用,還有如何還原rebase的記錄

[git]source tree裡rebase的使用,還有如何還原rebase的記錄

前言

這篇想要說明一下rebase的使用,為何要使用rebase,有什麼好處呢?其實rebase跟merge的目的是一樣的,就是同步分支的原始碼,但是分支在merge的時候,會自動產生一個commit記錄,還有從別條線再交錯回來,如下圖的樣子,代表的就是從master merge回dev的樣子

而rebase的樣子會長成如下圖的樣子,這個意思就是說把我們在dev的commit記錄,onto在master上面如下圖

使用source tree來操作rebase

接著來看一下實作的過程吧,目前的dev的index.txt跟master的index.txt不一樣,而目前整個分支圖如下樣子

來看一下整個操作如何進行吧,我們現在想要把master的最新程式碼同步到dev分支,所以我們需要停在dev並指向master rebase,如下圖

因為我故意產生了衝突,所以會跳出如圖下的樣子

衝突如下圖的樣子,我們可以使用很多種方式去解決衝突,筆者比較習慣使用的工具是vs code,更難解的衝突則是使用kdiff3,而在此案例來說我們只要選擇使用哪邊就好了,在跟同事對衝突時候,發現大家對Resolve Using Who常常搞不清楚,可以看一下圖下的示例

這時候當我們選擇了mine的話,代表的就是選擇了要同步過來的分支master的部份,完成之後會看到我們已不再任何分支上,我們需要再對master按一下rebase

當我按下Continue Rebase的話就會如圖下的樣子,因為我目前的原始碼跟master一模一樣,所以原本dev的commit記錄不見了

因為此案例過於簡單,如果我們原始碼只要有不同於master的部份,dev的commit記錄就會在原本的master記錄上面,所以此案例如果筆者使用了using theirs的話,就會如圖下的樣子

如何反悔rebase呢?

當我們用merge的時候,我們很簡單的就可以使用reset來還原commit記錄或程式碼,但如果我們用rebase的話,如何回到未rebase前的狀態呢?這時候source tree就幫不上忙了,我們需要自己打指令來做這種操作了,我們可以在source tree上快速的點擊打開Terminal

接著我們可以在主控台打上git reflog來查看過往的所有操作記錄,最新的是在最上面,如果假如我想要回到rebase前的記錄,就必須要找到rebase前的記錄

接著我們只要打上如下指令,並對照編號就可以回到那個記錄狀態,以下面指令代表的就是不只回到之前狀態,而且原始碼是完全不保留的

git reset 5bd1baa --hard

下完指令就可以看到我們又回到未rebase的狀態

結論

在實務上什麼狀況會選擇使用merge,而什麼狀況之下又是使用rebase呢?筆者大部份在同步程式的時候都會選擇使用merge的方式,但是如果我的branch是從某個分支而來,而某個分支又是穩定的版本,我就會用rebase的方式來平順的直接把程式碼同步回來,不過rebase相對的來說也比較麻煩,如果程式碼衝突的話需要解決多次conflict,所以就得視團隊或個人自行的評估了。