合並提交操作示例
本文源自極客時間 《go 語言項目開發實戰 孔令飛》
本文是 rebase 命令的一個使用場景,關於rebase命令,可以參考這篇:git rebase 命令介紹
假設我們需要研發一個新的模塊:user,用來在平台里進行用戶的注冊、登錄、注銷等操作,當模塊完成開發和測試后,需要合並到主干分支,具體步驟如下。
首先,我們新建一個分支。我們需要先基於 master 分支新建並切換到 feature 分支:
$ git checkout -b feature/user
Switched to a new branch 'feature/user'
這是我們的所有 commit 歷史:
$ git log --oneline
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
接着,我們在 feature/user分支進行功能的開發和測試,並遵循規范提交 commit,功能開發並測試完成后,Git 倉庫的 commit 記錄如下:
$ git log --oneline
4ee51d6 docs(user): update user/README.md
176ba5d docs(user): update user/README.md
5e829f8 docs(user): add README.md for user
f40929f feat(user): add delete user function
fc70a21 feat(user): add create user function
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
可以看到我們提交了 5 個 commit。接下來,我們需要將 feature/user分支的改動合並到 master 分支,但是 5 個 commit 太多了,我們想將這些 commit 合並后再提交到 master 分支。
接着,我們合並所有 commit。在上一步中,我們知道 fc70a21是 feature/user分支的第一個 commit ID,其父 commit ID 是 7157e9e,我們需要將7157e9e之前的所有分支 進行合並,這時我們可以執行:
$ git rebase -i 7157e9e
執行命令后,我們會進入到一個交互界面,在該界面中,我們可以將需要合並的 4 個 commit,都執行 squash 操作,如下圖所示:
修改完成后執行:wq 保存,會跳轉到一個新的交互頁面,在該頁面,我們可以編輯 Commit Message,編輯后的內容如下圖所示:
#開頭的行是 git 的注釋,我們可以忽略掉,在 rebase 后,這些行將會消失掉。修改完成后執行:wq 保存,就完成了合並提交操作。
除此之外,這里有 2 個點需要我們注意:
- git rebase -i
這里的一定要是需要合並 commit 中最舊 commit 的父 commit ID。 - 我們希望將 feature/user 分支的 5 個 commit 合並到一個 commit,在 git rebase 時,需要保證其中最新的一個 commit 是 pick 狀態,這樣我們才可以將其他 4 個 commit 合並進去。
然后,我們用如下命令來檢查 commits 是否成功合並。可以看到,我們成功將 5 個 commit 合並成為了一個 commit:d6b17e0。
$ git log --oneline
d6b17e0 feat(user): add user module with all function implements
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
最后,我們就可以將 feature 分支 feature/user 的改動合並到主干分支,從而完成新功能的開發。
$ git checkout master
$ git merge feature/user
$ git log --oneline
d6b17e0 feat(user): add user module with all function implements
7157e9e docs(docs): append test line 'update3' to README.md
5a26aa2 docs(docs): append test line 'update2' to README.md
55892fa docs(docs): append test line 'update1' to README.md
89651d4 docs(doc): add README.md
這里給你一個小提示,如果你有太多的 commit 需要合並,那么可以試試這種方式:先撤銷過去的 commit,然后再建一個新的。
$ git reset HEAD~3
$ git add .
$ git commit -am "feat(user): add user resource"
需要說明一點:除了 commit 實在太多的時候,一般情況下我不建議用這種方法,有點粗暴,而且之前提交的 Commit Message 都要重新整理一遍。