git rebase: 合并/截取commit 及 分支间的commit拼接
一. 只涉及单独分支的操作
1. 合并commit
当前分支状态:
A--------B-------C--------D
|--想要合并的commit--|
预计合并之后的状态:
A--------B'(包含C, D)
使用命令:
git rebase -i [start] [end]
start
和end
遵循左开右闭原则
1.-i
:启用交互,只有加了这个,才会有下面一步步的操作提示
2.[start]
: 如果想要合并B----C----D
,则[start]
为B
的前一个commit
, 即A
3.[end]
: 如果想要合并B----C----D
,则[end]
为D
; 如果缺省的话,默认为当前head
指向的commit
Note:[start]
和[end]
均为commit-ish
,有如下表示方法
----------------------------------------------------------------------
| Commit-ish | Examples
----------------------------------------------------------------------
| 1. <sha1> | dae86e1950b1277e545cee180551750029cfe735
| 2. <describeOutput> | v1.7.4.2-679-g3bee7fb
| 3. <refname> | master, heads/master, refs/heads/master
| 4. <refname>@{
<date>} | master@{yesterday}, HEAD@{5 minutes ago}
| 5. <refname>@{
<n>} | master@{1}
| 6. @{
<n>} | @{1}
| 7. @{-<n>} | @{-1}
| 8. <refname>@{upstream} | master@{upstream}, @{u}
| 9. <rev>^ | HEAD^, v1.5.1^0
| 10. <rev>~<n> | master~3
| 11. <rev>^{
<type>} | v0.99.8^{commit}
| 12. <rev>^{} | v0.99.8^{}
| 13. <rev>^{/<text>} | HEAD^{/fix nasty bug}
| 14. :/<text> | :/fix nasty bug
上表整理自StackOverFlow, 更多commit-ish理解可点这里
示例:
1. 当前状态:
2. 输入命令:
git rebase -i 869af45 9728be5
869af45
和9728be5
为hashID
的简写形式,git
会查找以其开头的hashID
此时会以编辑器(vim)形式进入第一个交互:
pick f9a2daa add 1.txt
pick dd0326f add 2.txt
pick 9728be5 add 3.txt
# Rebase 869af45..9728be5 onto 869af45 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, bu