Files
rikako-note/Git/git rebase.md

2.0 KiB
Raw Blame History

Git Rebase

Rebasing

git中通常有两种方式将一个分支上的变动整合到另一个分支merge和rebase。

  • merge将两个不同branch相对其最近公共祖先节点的修改进行merge操作产生一个新的snapshot和commit
  • rebase将c3和c4相对最近公共祖先节点c2的修改进行rebase操作将c4相对c2的修改应用到c3上。

rebase细节

找到最近公共祖先节点将当前节点相对公共祖先节点引入的变动保存到临时文件中并且将当前branch的指针移动到想要rebase到的目标分支上最后应用保存到临时文件中的变动。

rebase和merge比较

rebase操作和merge操作最终产物是相同的通过两种方式整合的分支最后都完全相同。但是相比较于mergerebase操作产生的git log更加干净其提交历史更像是一条直线即使存在并行修改在提交历史中也更像是串行提交的。

rebase --onto

对于rebase操作可以将branch 1相对于branch 1和branch 2公共祖先节点的变动rebase onto到branch 3上去。

# 将client相对于client和server公共先祖节点的修改应用到master分支上
git rebase --onto master server client

可以通过git rebase <base-branch> <topic-branch>命令来执行rebase操作这样在执行rebase操作时无需先切换到topic-branch分支该命令会切换到rebase分支并在base branch上执行replay操作。

rebase操作的危险

不要对存在于本地库之外远程仓库也存在的提交进行rebase操作如果对一个提交执行了rebase操作并且其他开发者基于该提交进行了开发工作这样会造成问题。
在git fetch远程分支之后可以通过git rebase来代替git merge从而保持提交历史的干净。
可以通过git pull --rebase来简化每次fetch后手动rebase的过程。
也可以设置git config --global pull.rebase true来默认在git pull时使用rebase。