使用 git rebase -i <branch> 能夠進入交互式模式,能夠對 某一範圍內的提交 進行從新編輯git
默認狀況下,直接使用 git rebase -i 命令的操做對象爲自最後一次從 origin 倉庫拉取或者向 origin 推送以後的全部提交。segmentfault
假設我要把 master 上紅色區域的分支合併成一個提交bash
首先找到起始 commit 的 前一個,也就是 865b2ac
,rebase 會顯示當前分支從這個 comimt 以後的全部 commit。編輯器
執行 git rebase -i 865b2ac
,會自動喚出編輯器,內容以下:spa
這些信息表示從 865b2ac
commit 操做後有 4 個提交。每一個提交都用一行來表示,按時間順序展現,首行是最先的提交,末行是最新的提交,行格式以下:3d
(action) (partial-sha) (short commit message)
當修改這個文件後,git 會依次把這些 commit 按照 action 從新執行。action 有不少種,默認都是 pick
,即便用該 commit,不做任何修改。code
咱們如今想把後三個提交合併到第一個中去,這裏須要用到 squash
,該 action 表示 使用該提交,可是把它與前一提交合並,因此只需把後四個的 action 改成 squash 便可。對象
保存以後,會喚出編輯器提示基於歷史的提交信息建立一個新的提交信息,也就是須要用戶編輯一下合併以後的 commit 信息,更改提示信息並保存便可。blog
合併完以後的歷史記錄:ip
若是想把某個 commit 拆分紅多個 commit,可使用 edit
做爲 action,edit 表示 使用該提交,可是先在這一步停一下,等我從新編輯完再進行下一步。
初始狀態以下:
just add a new line
這個 commit 修改了兩個文件 myfile.txt
和 anothorfile.txt
,咱們但願把它拆成兩個 commit,每一個文件的修改各提交一個 commit
執行 git rebase -i 13243ea
,而後修改 865b2ac
這個 commit 的 action 爲 edit
保存並退出後,git 會提示在 865b2ac
上中止了
➜ git rebase -i 13243ea Stopped at 865b2ac... just add a new line You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue
這裏可使用 git commit --amend
命令對 commit 信息進行從新編輯(什麼是 git commit --amend)
咱們這裏是要拆分 commit,因此要先對 commit 內容 reset,而後從新提交
➜ git reset HEAD^ # 撤銷提交 Unstaged changes after reset: M myfile.txt M anotherfile.txt ➜ git add myfile.txt # 拆解出第一個提交 ➜ git commit -m 'first part of split commit' [detached HEAD d0727f7] first part of split commit 1 file changed, 1 insertion(+) ➜ git add anotherfile.txt # 拆解出第二個提交 ➜ git commit -m 'second part of split commit' [detached HEAD 2302fc7] second part of split commit 1 file changed, 1 insertion(+) create mode 100644 anotherfile.txt ➜ git rebase --continue Successfully rebased and updated refs/heads/master.
拆分完成後使用 git rebase --continue
即結束 rebase,結果以下:
若是想刪除某個提交,使用 git rebase -i 後直接在編輯器中刪除那一行 commit 便可
假設刪除的是 commit 2,那麼編輯完成後 git 會比較 commit 1 與 commit 3 的差別,若是有衝突,須要手動解決衝突後 add 並 git rebase --continue