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