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