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 devgit merge master
dev rebase master
在master的基础上,改变dev,dev原来的C5、C6变成补丁的方式,重新打到了C4之后,dev原来的C5、C6被git自动创建成 C5'、C6' 补丁,修改了dev的commit历史,不存在分叉
git checkout devgit 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