02「Git 介紹」git rebase -i

git rebase -i 強大指令

「Git 介紹」Ch2: git rebase 互動模式 - git rebase -i

上次提到 git rebase 的使用時機,這次介紹一下 git rebase -i 互動模式!

Git 第二篇, git rebase -i 互動模式

(What?) 什麼是 git rebase -i

  • Git rebase 提供的全家餐,輸入魔法-i, 搭配 commit ID, 神力再現。

(How?) git rebase -i 的幾種操作

1.情境:

  • 假設現在自己分支多了 3 個 commit 準備要合回去主分支,在合回去之前,想對自己的 commit 先做些整理,這時候 git rebase -i 就派上用場了。
# 目前的三個 commit, commit ID 先用 aaaaaaa, bbbbbbb, ccccccc 代替, a 是第一個 commit, b 是第二個, c 是第三個
ccccccc commit-msg
bbbbbbb commit-msg
aaaaaaa commit-msg

2. 流程:

  1. 進入互動模式
  2. 執行這次想做的修改
  3. 如果有衝突的話,需要解決
  4. 完成操作

3. 進入,git rebase -i <commit ID>

  • 解釋: 代表我現在想進入 interactive rebase 的模式來做些事情,那我要處理哪些 commit 呢? 就是 -i 後面輸入的 <commit ID> 之後的所有 commit 我可能需要處理。

所以這行指令就是,我想進入互動模式處理 <commit ID> 之後的 commit (不包括輸入的 commit ID 的 commit 好饒舌?..)

4. 進來後,注意順序:

  • 一進來互動模式時,最新的 commit 是在最下面!
# 像是這樣
# 上面最舊
pick aaaaaaa commit-msg #1
pick bbbbbbb commit-msg #2
pick ccccccc commit-msg #3
# 下面最新

5. 手法:

pick - 預設值

  • 作用: 意思是保留這個 commit

squash - 合併

  • 作用: 合併多個 commit
pick aaaaaaa commit-msg #1
squash bbbbbbb commit-msg #2
pick ccccccc commit-msg #3

把 pick 改成 squash。如此, bbbbbbb 會與前一個 commit aaaaaaa 合併。

reword - 修改訊息

  • 作用: 修改 commit message
pick aaaaaaa commit-msg #1
reword bbbbbbb commit-msg #2
reword ccccccc commit-msg #3

如此便能修改 commit message

drop - 丟掉

  • 作用: 丟掉這個 commit
pick aaaaaaa commit-msg #1
drop bbbbbbb commit-msg #2
pick ccccccc commit-msg #3

如此 bbbbbbb 這個 commit 便會被丟掉。 也可以直接刪掉那一行,也可以達成丟掉。

edit - 修改內容

  • 作用: 我要這個 commit 但到這裡的時候停一下,我要修改一下。 修改完後指令接著做:
git add xxxx
git commit --amend --no-edit
# --no-edit 是不修改 commit 訊息

fixup - 也是合併

  • 作用: 也是合併,但捨棄這個 commit message。

替換 commit 順序

  • 就直接換就好哈哈哈哈
pick aaaaaaa commit-msg #1
pick ccccccc commit-msg #3
pick bbbbbbb commit-msg #2

6. 一些會遇到的基本流程:

修改 commit message。

遇到衝突:

解決衝突 
git add xxxxxxxx
git rebase --continue

放棄這次 rebase,回到之前的狀態。

git rebase --abort

小心使用, 慎用。如果有衝突,這個會丟掉整個 commit,很容易出事。

git rebase --skip

The End:

Review:

  • git rebase -i 所做的更動,commit ID 的 SHA-1值是會變的,也就是說與人協作時要注意目前做的動作會不會影響他人。
  • 善用 git rebase -i 整理自己的 commit 紀錄。
  • git rebase -i 時, 遇到衝突會一個一個停下來讓我們解決。
  • git rebase --skip 危險!
  • git rebase --abort 當作什麼事都沒發生。
  • 最後, git rebase -i <commit ID> 安心服用,熟能生巧。

Reference:

上一篇:

01「Git 介紹」什麼是 git rebase