git rebase

254 阅读2分钟

git rebase 变基

git rebasegit merge 类似,但工作方式不同

  • git merge 不会修改提交历史,存在分叉,完整地保留每个提交记录
  • git rebase 会修改提交历史,保持简洁,类似草稿到最终呈现的版本一样,不保留草稿

注意

  1. 已经推送到远程的内容,分支,不要执行git rebase,因为这部分已经和其他成员协作,已经拉取了我的提交记录,这个时候再去git rebase,将改变提交记录,push上去的时候,会导致其他人pull操作,增加手工处理内容,改完之后重新push,而我们去pull也会存在相同的问题,恶行循环,增加工作复杂度。
  2. 只作用于自己还没推送到远程的,没人共享过的本地内容
  3. rebase任何时候都可以终止git rebase --abort
  4. 继续rebase git rebase --continue

应用场景一、 rebase branch

master 和 dev 两条分支

  1. master commit-C2创建dev分支
  2. master 提交 C3C4
  3. dev 提交 C5C6

image.png

dev merge master

三方合并(往前找到共同的parent-C2),产生一个新的 coomit-C7(有两个parent,一个指向C4,一个指向C6),存在分叉

  1. git checkout dev
  2. git merge master

image.png

dev rebase master

master的基础上,改变devdev原来的C5C6变成补丁的方式,重新打到了C4之后,dev原来的C5C6git自动创建成 C5'C6' 补丁,修改了dev的commit历史不存在分叉

  1. git checkout dev
  2. git rebase master

image.png

应用场景二、合并记录

使git commit更简洁

注意:已经push过的commit不要执行rebase,永远只rebase本地自己的pull之后自己添加的commit

  • git rebase -i <commit-id> 将HEAD ~ commitid这区间的commit合并
  • git rebase -i HEAD~n 将HEAD最近的n次commit合并
  1. git commit -am 'C7'
  2. git commit -am 'C8'
  3. git commit -am 'C9'
  4. git rebase -i HEAD~3 把上面三次commit合成一个commit

image.png