git rebase 变基
git rebase 和 git merge 类似,但工作方式不同
git merge
不会修改提交历史,存在分叉,完整地保留每个提交记录git rebase
会修改提交历史,保持简洁,类似草稿到最终呈现的版本一样,不保留草稿
注意
- 已经推送到远程的内容,分支,不要执行
git rebase
,因为这部分已经和其他成员协作,已经拉取了我的提交记录,这个时候再去git rebase
,将改变提交记录,push上去的时候,会导致其他人pull操作,增加手工处理内容,改完之后重新push,而我们去pull也会存在相同的问题,恶行循环,增加工作复杂度。 - 只作用于自己还没推送到远程的,没人共享过的本地内容
- rebase任何时候都可以终止
git rebase --abort
- 继续rebase
git rebase --continue
应用场景一、 rebase branch
master 和 dev 两条分支
- 在master
commit-C2
创建dev
分支 - master 提交
C3
、C4
- dev 提交
C5
、C6
dev merge master
三方合并(往前找到共同的parent-C2),产生一个新的 coomit-C7(有两个parent,一个指向C4,一个指向C6),存在分叉
git checkout dev
git merge master
dev rebase master
在master的基础上,改变dev,dev原来的C5
、C6
变成补丁的方式,重新打到了C4
之后,dev原来的C5
、C6
被git自动创建成 C5'
、C6'
补丁,修改了dev的commit历史,不存在分叉
git checkout dev
git rebase master
应用场景二、合并记录
使git commit更简洁
注意:已经push过的commit不要执行rebase,永远只rebase本地自己的pull之后自己添加的commit
git rebase -i <commit-id>
将HEAD ~ commitid这区间的commit合并git rebase -i HEAD~n
将HEAD最近的n次commit合并
git commit -am 'C7'
git commit -am 'C8'
git commit -am 'C9'
git rebase -i HEAD~3
把上面三次commit合成一个commit