命令介绍
rebase为变基
git rebase -i 命令可以压缩合并多次提交
格式:git rebase -i [startpoint] [endpoint]
其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
在查看git的log后,可以使用如下命令
// 合并从当前head到15f745b(commit id) git rebase -i 15f745b 或: // 合并最近的两次提交 git rebase -i HEAD~212345
执行这个命令后会跳到一个vi编辑器
里面的提示有:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)用的比较多
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
第一步,获取commit id
比如上图里面这些提交记录,我们想把前面4次记录合并到“重构”这次,那么我们就需要先获取“重构”这个提交记录 前面 那一次提交的commit id,就是那一串hash值,使用git log
命令:
1 2 3 4 5 6 7 8 9 10 11 | commit 01da1d7351dfea156eabc7ddf36a9e8eba227645 (tag: v1.1) Author: wangbenjun <wangbenjun@gmail.com> Date: Fri Nov 19 22:00:16 2021 +0800 重构 commit a0645baeb9938f34658f2766a2d4ec2855791da1 (tag: v1.0) Author: wangbenjun <wangbenjun@gmail.com> Date: Wed Aug 18 20:47:34 2021 +0800 优化目录结构 |
四次提交
第二步,把最近的三次提交合并为一个提交:git rebase -i HEAD~3
(或git rebase -i <倒数第四次提交的哈希值>,即该哈希值代表的提交不参与合并
)
修改内容,保存退出 这里显示提交记录从上到下是从远到近的顺序
第三步,注释并保存
把pick改成s之后保存,又会自动弹出一个新的编辑页面,内容大概如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # This is a combination of 5 commits. # This is the 1st commit message: 重构 # This is the commit message #2: fix # This is the commit message #3: update # This is the commit message #4: fix |
其大意是这是这5次提交信息的合并,然后它会自动把每次提交的信息都给你列出来,这里你可以选择直接保存,也可以顺便修改一下,改成你想要的内容,然后保存。
第四步,推送到远程
完成上面的操作之后,再次使用git log则会发现提交记录已经变了,但是目前还只是在本地,还需要推送到远程,而且推送的时候必须使用–force,如:
1 | git push origin --force |
完成上述操作之后,整个git提交记录就会完全改变了,而且是不可逆操作,当然这也意味着rebase操作是有一定风险的,如果你不太清楚需要做什么的话就不要做。