一、為什么需要合並多個 commit 呢?
有時候,我們開發一個功能。
修修補補 commit 了很多次,過多的 commit 會顯得很復雜。
不夠直觀,不能比較清晰查看那些 commit 是對應的那個功能。
所以,在這種情況下。我們需要整理一下 commit 的記錄,讓我們更好的管理提交記錄。
二、具體合並多個 commit 的流程。
1、development 分支有四次 commit ,然后我准備合並 "add a.php" 和 "add b.php" 的兩次 commit。
ps: 使用 git log 命令,查看 commit 記錄。


2、然后執行命令:
$ git rebase -i d2bf14b495fe57583371be8d0a48c927a2da7eb9 7fc6da429881c5bca2705f61aac0e3a1a3c0b1c7

ps: 命令說明
// -i 的含義是:--interactive, 即彈出交互式的界面讓用戶編輯完成合並操作 // [startpoint] 指的是合並區間的起點。 // [endpoint] 指的是合並區間的終點,默認是當前分支 HEAD 所指向的 commit。 $ git rebase -i [startpoint] [endpoint] // 注意:這里的區間是一個前開后閉的區間。

ps: Commands 說明,以下單字符命令為簡寫命令。
- p, pick: 保留該 commit。
- r, reword: 保留該 commit,可以修改 commit 的注釋。
- e, eidt: 保留該 commit,但停下來修改該 commit (不僅僅是注釋),可以用來解決 merge 沖突。
- s, squash: 將該 commit 和 前面一個 commit 合並。
- f, fixup: 將該 commit 和 前面一個 commit 合並,但不保留該提交的注釋信息。
- x, exec: 執行 shell 命令。
- d, drop: 丟棄該 commit。
3、然后,編輯 commit 內容。將 "pick" 改成 "squash" 或者 "s",意思是將該 commit (add b.php)和 前面的 commit (add a.php) 合並。編輯完成后,保存並退出(wq!)。


4、修改合並之后的 commit 注釋。


5、編輯完合並 commit 的注釋之后,就保存退出(:wq!)。


6、但是,在我們的一頓猛操作之后,我們進入了一個臨時的分支(從 development 分支切出來的臨時分支)。


7、那這個問題怎么解決呢?現在我們來基於這個臨時分支,創建一個新的分支 feature/temp。


8、然后,我們再切回 development 分支,執行:git rebase feature/temp。

9、最后,看我們的 commit 記錄,就已經把 "add a.php" 和 "add b.php" 的 commit 合並了。


三、總結。
- 這次合並多個 commit,主要用到的命令是:git rebase -i [startpoint] [endpoint]。
- 合並完成之后,會進入一個臨時分支。需要在 development 分支上 rebase 這個臨時分支。
- 我們可以通過 git log 命令,查看提交的記錄。