Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Git rebase -i
Charlie Tsai
Git rebase -i
Charlie Tsai
Agenda
• 修改多個commit message
• 合併commit
• 改變commit順序
• 嫁接branch
• 上述事情發生時,實際上背後git做了什麼
修改commit
• 改HEAD上的commit -> $ git commit —amend
• 改多個怎麼辦?
用—amend的case
N1
N0
N2
Checkout
Base
用—amend的case
N1
N0
N2
git commit —amend
Base
用—amend的case
N1
New
N0’
N2
Base
實際狀況
N1
New
N0’
N2
Base
N0
灰色表示detached
(想成孤兒就好)
用—amend的case
N1
New
N0
N2
Base
New
N1
只好cherry-pick N1再amend
(就算N1不改commit message
也要cherry-pick)
用—amend的case
N1
New
N0
N2
Base
New
N1
N2也要 cherry-pick再amend
New
N2
真心麻煩!
改用rebase
N1
N0
N2
Checkout
Base
改用rebase
N1
N0
N2
git rebase -i Base
Base
改用rebase
New
N1
New
N0
New
N2
Base
實際狀況
New
N1
New
N0
New
N2
Base
N1
N0
N2
一步到位!
改變commit順序
Base
N0
N1
git checkout
改變commit順序
Base
N0
N1
git rebase Base -i
改變commit順序
Base
N1
N0
實際狀況
Base
New N1
New N0
N0
N1
改順序的應用情境
• 整理branch上的commit
• 某個branch上的commit想先merge回master,就
可以先拉到branch的頭,把那個commit給merge
回master
合併commit
Base
N0
N1
合併commit
Base
New N0
實際狀況
Base
New N0
N0
N1
合併的使用情境
• 避免太過瑣碎的commit
• 寫新的class/module時可以step by step,最後再
整理成較少的commit
• 一次改比較多東西但又希望只有一個commit的時
候,中間可以先commit一些暫存點,最後...
嫁接branch
Base
Base_
1
N0
N1
N2
想把N0的前一個commit改到Base_1這點上
嫁接branch
Base
Base_
1
N0
N1
N2
git checkout
嫁接branch
Base
Base_
1
N0
N1
N2
git rebase -i Base_1
嫁接branch
Base
Base_
1
New
N0
New
N1
New
N2
實際狀況
Base
Base_
1
New
N0
New
N1
New
N2
N0
N1
N2
嫁接的使用情境
• 當你開發一個很大/需時較久時的功能
• 避免你開發到一半的branch沒法merge回master
也避免merge回去卻不會動時,沒有頭緒
• local有多個瑣碎但高度相關的branch,可以整理
成一個branch再m...
Question?
Upcoming SlideShare
Loading in …5
×

Git rebase -i

2,105 views

Published on

Some simple usage tips for $ git rebase -i. (git rebase interactive)

Published in: Software
  • Be the first to comment

Git rebase -i

  1. 1. Git rebase -i Charlie Tsai
  2. 2. Git rebase -i Charlie Tsai
  3. 3. Agenda • 修改多個commit message • 合併commit • 改變commit順序 • 嫁接branch • 上述事情發生時,實際上背後git做了什麼
  4. 4. 修改commit • 改HEAD上的commit -> $ git commit —amend • 改多個怎麼辦?
  5. 5. 用—amend的case N1 N0 N2 Checkout Base
  6. 6. 用—amend的case N1 N0 N2 git commit —amend Base
  7. 7. 用—amend的case N1 New N0’ N2 Base
  8. 8. 實際狀況 N1 New N0’ N2 Base N0 灰色表示detached (想成孤兒就好)
  9. 9. 用—amend的case N1 New N0 N2 Base New N1 只好cherry-pick N1再amend (就算N1不改commit message 也要cherry-pick)
  10. 10. 用—amend的case N1 New N0 N2 Base New N1 N2也要 cherry-pick再amend New N2
  11. 11. 真心麻煩!
  12. 12. 改用rebase N1 N0 N2 Checkout Base
  13. 13. 改用rebase N1 N0 N2 git rebase -i Base Base
  14. 14. 改用rebase New N1 New N0 New N2 Base
  15. 15. 實際狀況 New N1 New N0 New N2 Base N1 N0 N2
  16. 16. 一步到位!
  17. 17. 改變commit順序 Base N0 N1 git checkout
  18. 18. 改變commit順序 Base N0 N1 git rebase Base -i
  19. 19. 改變commit順序 Base N1 N0
  20. 20. 實際狀況 Base New N1 New N0 N0 N1
  21. 21. 改順序的應用情境 • 整理branch上的commit • 某個branch上的commit想先merge回master,就 可以先拉到branch的頭,把那個commit給merge 回master
  22. 22. 合併commit Base N0 N1
  23. 23. 合併commit Base New N0
  24. 24. 實際狀況 Base New N0 N0 N1
  25. 25. 合併的使用情境 • 避免太過瑣碎的commit • 寫新的class/module時可以step by step,最後再 整理成較少的commit • 一次改比較多東西但又希望只有一個commit的時 候,中間可以先commit一些暫存點,最後再合併 (# 也可以用git stash, 但stash太多會亂)
  26. 26. 嫁接branch Base Base_ 1 N0 N1 N2 想把N0的前一個commit改到Base_1這點上
  27. 27. 嫁接branch Base Base_ 1 N0 N1 N2 git checkout
  28. 28. 嫁接branch Base Base_ 1 N0 N1 N2 git rebase -i Base_1
  29. 29. 嫁接branch Base Base_ 1 New N0 New N1 New N2
  30. 30. 實際狀況 Base Base_ 1 New N0 New N1 New N2 N0 N1 N2
  31. 31. 嫁接的使用情境 • 當你開發一個很大/需時較久時的功能 • 避免你開發到一半的branch沒法merge回master 也避免merge回去卻不會動時,沒有頭緒 • local有多個瑣碎但高度相關的branch,可以整理 成一個branch再merge回master
  32. 32. Question?

×