Git rebase 合併多次提交

在一般研發管理流程中,我們一般都是這麼使用Git版本的:

  • 0、先拿到一個需求(不細談需求前面的採集、歸納整理、確認及評審等環節)
  • 1、從主分支checkout一個新分支
  • 2、在完成階段性的目標後,提交代碼
  • 3、完成整體需求後自測,並提測,提測內容包含當前分支代碼
  • 4、通過測試後,代碼合併到主分支
  • 5、新建tag,按照tag發佈代碼,系統上線

整個流程沒有什麼問題,只是在git管理時,會在git的提交記錄中看到每一次的提交,使得主分支的版本比較多,在特殊情況下,進行代碼回溯及比較時,弄得頭暈眼花。

Git提供reabse命令,可以將多次commit合併成一個提交,這樣提交記錄看起來比較簡潔些。

沒有rebase的示例

開發改需求時,先checkout出了一個新分支feature_connectLimit_20201119,使用git log或者IDEA查看某需求的提交記錄,如下圖

從上到下對應的revision number如下表

9e1a88efb9cad48a46a1103a6920d752afca3513
9a32e0bc33c8d31bb6d9f2150af247aa784df14d
9fa7517460aac5c8d3e617be0e8c92d3e0570926
d1fcf3db8a49207a065624295121b903d06bec64
d0096d69986a70ea7911dd521fcfafcd7dad13e0
2fe0e3f1ac36d6299bb2618394d0d73ab79e17c7
37a19607401bbe929884ae36d34f0df450754692

合併到主分支(main)時,如果不進行處理,就會在主分支看到6條commit,如下圖

以上還是比較樂觀的情況,主分支只需要fast-forward到最新commit即可。如果發生衝突,再進行merge後,版本圖表就不是一條簡簡單單的直線了。

rebase示例

git 提供了reabase命令,可以將(連續的、關聯性的)多次commit合併成一個新的commit,再重新合併到主分支。

我們將2fe0e3f1~9e1a88ef這6個commit合併成一個新的commit。
具體看以下命令:

git checkout feature_connectLimit_20201119
git rebase -i 37a19607

其中,-i 的參數是不需要合併的 commit 的 hash 值。
進入到vi的編輯模式,

pick 2fe0e3f1a --story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx
pick d0096d699 呼叫記錄:插入時檢查重複
pick d1fcf3db8 呼叫記錄:根據redis插入時檢查重複
pick 9fa751746 --story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx
pick 9a32e0bc3 代碼還原
pick 9e1a88efb 調整緩存key

# Rebase 37a196074..9e1a88efb onto 9fa751746 (6 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell

可以看到其中分爲兩個部分,上方未註釋的部分是填寫要執行的指令,而下方註釋的部分則是指令的提示說明。指令部分中由前方的命令名稱、commit hash 和 commit message 組成。

根據命令註釋,我們很容易知道 pick 和 squash 這兩個命令的大概意義。

pick 的意思是要會執行這個 commit
squash 的意思是這個 commit 會被合併到前一個commit

我們將 d0096d699~9e1a88efb 這5個 commit 前方的命令改成 squash 或 s,然後輸入:wq以保存並退出,如下

pick 2fe0e3f1a --story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx
s d0096d699 呼叫記錄:插入時檢查重複   
s d1fcf3db8 呼叫記錄:根據redis插入時檢查重複   
s 9fa751746 --story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx
s 9a32e0bc3 代碼還原   
s 9e1a88efb 調整緩存key

這時我們會看到新的commit message 的編輯界面,大概列舉了要合併的commit的log信息。

# This is a combination of 6 commits.
# This is the 1st commit message:

--story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx

# This is the commit message #2:

呼叫記錄:插入時檢查重複

# This is the commit message #3:

呼叫記錄:根據redis插入時檢查重複

# This is the commit message #4:

--story=1038913 --user=xxx 國內外 - 限制過去60分鐘內呼叫短信次數 https://www.tapd.cn/xxx/s/xxx

# This is the commit message #5:

代碼還原

# This is the commit message #6:

調整緩存key

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Fri Nov 20 19:08:02 2020 +0800
#
# interactive rebase in progress; onto 37a196074
# Last commands done (6 commands done):
#    squash 9a32e0bc3 代碼還原
#    squash 9e1a88efb 調整緩存key
# No commands remaining.
# You are currently rebasing branch 'feature_connectLimit_20201119' on '37a196074'.
#
# Changes to be committed:
...file lists

輸入新的提交信息,this is a rebase test for many times commit;,並:wq保存退出。再次查看 commit 歷史信息,你會發現這些commit已經合併了。

這是合併的commit的提交信息:

合併到主分支後,也只有一條commit,這些清爽多了。

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