[TOC] #### 1. git rebase 介紹 ---- git rebase 最大的作用是可以重寫歷史(重寫提交記錄) 合理使用 rebase 命令可以使我們的提交歷史干凈、簡潔 ! rebase 在 git 中是一個非常有魅力的命令,使用得當會極大提高自己的工作效率;如果亂用,會給團隊其他人帶來麻煩 #### 2. 將多個 commit 合并為一個 commit --- 相信絕對大多數公司都會有這個要求: 每天下班前必須將當天的代碼推送到遠程庫,但是今天在本地做了多次提交記錄,你想要將今天的多次提交記錄合并為一個提及記錄,然后再推送到遠程庫。此時,使用 git rebase 命令可以實現你的目的 有這樣一個倉庫,當前有 5 個提交記錄,我想要將最后三次的提交記錄合并為一個提交記錄 ![](https://img.itqaq.com/art/content/5fa44878226612d7fc883e22e0764f4f.png) 使用下面命令進行提交記錄的合并,`-i, --interactive` 參數的作用是以交互式的界面讓用戶編輯完成合并的操作 ``` git rebase -i HEAD~3 ``` 也可以使用 ``` git rebase -i 2402738 ``` 執(zhí)行命令后進入以下界面,修改完成后使用 `:wq` 保存退出 ![](https://img.itqaq.com/art/content/ce4bba535ada7577f4df18c2dcbf667f.png) 指令編輯區(qū)域: 本次 rebase 操作包含的所有提交,每一個 commit id 前面的 pick 表示指令類型 指令說明區(qū)域: 指令類型說明,rebase 的指令類型有以下幾種 | 指令 | 縮寫 | 描述 | | ------------ | ------------ | ------------ | | pick | p | 保留該 commit | | reword | r | 保留該 commit,修改該 commit 的注釋 | | edit | e | 保留該 commit,修改該 commit,不僅僅是注釋 | | squash | s | 將該 commit 和前一個 commit 合并 | | fixup | f | 將該 commit 和前一個 commit 合并,但不保留該提交的注釋 | | exec | x | 執(zhí)行 shell 命令 | | drop | d | 丟棄該 commit | rebase 指令類型編輯界面修改完成后進入注釋修改界面,修改完成后使用 `:wq` 保存退出 ![](https://img.itqaq.com/art/content/1f0b5104b21944f2e7842baaf2d6f353.png) 合并成功后的提示 ![](https://img.itqaq.com/art/content/2273bacf0a015480966835296bdd63d1.png) 將合并成功后結果推送至遠程庫時會報錯,必須使用 -f 參數進行強制推送才行 ![](https://img.itqaq.com/art/content/6a0ecd058eea0eb44fff81d15c05439e.png) 剛才我們是將遠程庫中的多個 commit 合并為一個 commit,下面來測試將本地的多個 commit 合并為一個 commit ![](https://img.itqaq.com/art/content/40b73d1953e30f3424a20b46a2acaec2.png) 合并最新的 4 個提交記錄 ``` git rebase -i HEAD~4 ``` 話不說多,直接上操作流程圖 ![](https://img.itqaq.com/art/content/3b1b88f6884fec7b43e6e9520fff0560.png) ![](https://img.itqaq.com/art/content/4beb854b50c1f98cabb7f222b7e03949.png) ![](https://img.itqaq.com/art/content/fc88ec40290922e0a301083f1eca82a6.png) 總結: 合并遠程庫中的多個 commit 推送時需要強制推送,合并多個未推送到遠程庫的多個本地 commit,不需要強制推送。平時開發(fā)中,合并本地的多個 commit 還比較實用,已推送到遠程庫中的 commit 不建議輕易的去修改它