【講清楚】rebase的使用

Git rebase

 git original log:

 

目前有多於三個的log,而我想要合併最近的兩個 log, 也就是上圖中紫色的圈和黃色的圈,所以這個時候使用rebase的方式如下:

git    rebase   -i   ee9ee598ea2a4bece9b23

注意這個時候的應該使用的log的編碼是紅色的圈,雖然我想要合併紫色和黃色,但是需要在紅色圈的基礎上進行合併,所以需要填入ee9ee598

 填完之後,需要對log進行重新選擇,

pick 82b5047  Changes for MapLoad (changed InitKeyFrame for EUCM based on ORI_Ver)
pick eddaa2b  Load Map 
# Rebase a71eba2..e1a7dfa onto a71eba2
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

這個文件中的log是按照提交的時間順序來的,提交的時間最早的log,就會在 出現在 最上面,這樣給了我們更清楚的知識,究竟保留哪個,去掉哪個?

pick即爲保留的意思,如果pick某個hash,那個這一次提交的代碼修改將會被保存;

squash表示那一次的提交內容將會和它的上一個log合併到一起;squash很適用於那種commit完成後發現自己沒有add全的情況;

reword表示當前的commit記錄會被保留,但是允許你修改commit的comment,使用與commit -m ”“ 時寫錯log的情況;

fixup就更徹底了,會將當前的提交代碼與上一次的提交合併到一起,同時直接刪除掉當前的log message,跟在下面圖2的文件中註釋掉其實是一樣的效果;

一般情況下,squash是最常用的,即保留文件中的修改和commit的提交,只是將這次的commit與上一次的合併而已,所以需要將上述文件修改成:

pick 82b5047  Changes for MapLoad (changed InitKeyFrame for EUCM based on ORI_Ver)
s eddaa2b  Load Map 

然後ctrl+x 離開,其中會提示是否需要保存,選擇YES即可;

然後會遇到如下文件:

 

這個文件主要是需要選擇新的commit 的comment,也就是log message內容,如果不想要什麼可以直接用#把他們註釋掉,

因爲我合併和紫色和黃色的兩個圈圈log,並且覺得黃色圈圈的log內容更加準確,所以,就選擇留下第三行的文字;

那麼最後合併後的log內容爲

 

從如上的合併可以看出,紅色的圈圈沒變,但是紫色圈圈和黃色圈圈都不存在了,而合併成立綠色圈圈,同時綠色圈圈的commit 內容選用了紫色圈圈的內容;

更多理論參考:

https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章