Git 之 交互式 rebase

使用 git rebase -i <branch> 能夠進入交互式模式,能夠對 某一範圍內的提交 進行從新編輯git

默認狀況下,直接使用 git rebase -i 命令的操做對象爲自最後一次從 origin 倉庫拉取或者向 origin 推送以後的全部提交。segmentfault

合併提交

假設我要把 master 上紅色區域的分支合併成一個提交bash

clipboard.png

首先找到起始 commit 的 前一個,也就是 865b2ac,rebase 會顯示當前分支從這個 comimt 以後的全部 commit。編輯器

執行 git rebase -i 865b2ac,會自動喚出編輯器,內容以下:spa

clipboard.png

這些信息表示從 865b2ac commit 操做後有 4 個提交。每一個提交都用一行來表示,按時間順序展現,首行是最先的提交,末行是最新的提交,行格式以下:3d

(action) (partial-sha) (short commit message)

當修改這個文件後,git 會依次把這些 commit 按照 action 從新執行。action 有不少種,默認都是 pick,即便用該 commit,不做任何修改。code

咱們如今想把後三個提交合併到第一個中去,這裏須要用到 squash,該 action 表示 使用該提交,可是把它與前一提交合並,因此只需把後四個的 action 改成 squash 便可。對象

clipboard.png

保存以後,會喚出編輯器提示基於歷史的提交信息建立一個新的提交信息,也就是須要用戶編輯一下合併以後的 commit 信息,更改提示信息並保存便可。blog

合併完以後的歷史記錄:ip

clipboard.png

拆分提交

若是想把某個 commit 拆分紅多個 commit,可使用 edit 做爲 action,edit 表示 使用該提交,可是先在這一步停一下,等我從新編輯完再進行下一步。

初始狀態以下:

clipboard.png

just add a new line 這個 commit 修改了兩個文件 myfile.txtanothorfile.txt,咱們但願把它拆成兩個 commit,每一個文件的修改各提交一個 commit

執行 git rebase -i 13243ea,而後修改 865b2ac 這個 commit 的 action 爲 edit

clipboard.png

保存並退出後,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,結果以下:

clipboard.png

刪除提交

若是想刪除某個提交,使用 git rebase -i 後直接在編輯器中刪除那一行 commit 便可

clipboard.png

假設刪除的是 commit 2,那麼編輯完成後 git 會比較 commit 1 與 commit 3 的差別,若是有衝突,須要手動解決衝突後 add 並 git rebase --continue

clipboard.png

相關文章
相關標籤/搜索