git-rebase 到底是个什么东东?如何使用

158 阅读2分钟

概念

  1. 当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改
  2. 然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面
  3. 相比merge会减少一些分支合并记录
  • feature:待变基分支、当前分支
  • master:基分支、目标分支

用法

1、常见命令

命令 缩写 含义

pick p 保留该commit

reword r 保留该commit,但需要修改该commit的注释

edit e 保留该commit, 但我要停下来修改该提交(不仅仅修改注释)

squash s 将该commit合并到前一个commit

fixup f 将该commit合并到前一个commit,但不要保留该提交的注释信息

exec x 执行shell命令

drop d 丢弃该commit

i 合并当前分支的多个commit记录

2、解决冲突

  1. git rebase --skip

抛弃本地的 commit,采用远程的 commit。慎用:因为你本地的修改都会失去。

  1. git rebase --abort

效果是:终止这次 rebase 操作

  1. git rebase --continue

手动处理冲突的文件:执行git add .,再 git rebase --continue

反复操作直到解决完所有冲突,并合并到分支上。

3、其他

  • git pull -- rebase

拉取代码减少不必要的 merge commit


注意事项

1、不要基于rebase的分支 切新分支

如果feature在写完新需求b后, 切了新分支 feature_B, 然后又rebase了develop, 那么新分支feature_B无论是合进develop 还是 合进 feature 都会有冲突, 出现重复的b(其实是b和b’)

2、不要对已经合并到主分支的本地修改进行变基

自己的分支, 如果想对已经推送的commit进行修改, 可以在修改完后, 使用 git push -f 强行push并覆盖远程对应分支。
但是如果这些修改 已经被合到了其他分支(比如主分支), 那又会出现冲突, 因为其他分支保存的是你rebase之前 合进去的commit

3、不要在预发布/正式分支上使用rebase -i

变基那个节点开始往后的所有节点的commit id 都会发生变化,master上有100个commit, 你悄悄改了第50个commit, 那从50—100的所有commit全部改变了, 这时, 别人的分支合进来, 就会有51个冲突