From 326b98edc901caf131c8d6d3f853b27f8a58937b Mon Sep 17 00:00:00 2001 From: Rikako Wu <496063163@qq.com> Date: Wed, 18 Jan 2023 15:56:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=85=B3=E4=BA=8Egit=20rebas?= =?UTF-8?q?e=E7=9A=84=E6=96=87=E6=A1=A3=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Git/git rebase.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Git/git rebase.md b/Git/git rebase.md index e69de29..256e051 100644 --- a/Git/git rebase.md +++ b/Git/git rebase.md @@ -0,0 +1,22 @@ +# 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操作最终产物是相同的,通过两种方式整合的分支最后都完全相同。但是相比较于merge,rebase操作产生的git log更加干净,其提交历史更像是一条直线,即使存在并行修改,在提交历史中也更像是串行提交的。 +### rebase --onto +对于rebase操作,可以将branch 1相对于branch 1和branch 2公共祖先节点的变动rebase onto到branch 3上去。 +```shell +# 将client相对于client和server公共先祖节点的修改应用到master分支上 +git rebase --onto master server client +``` +可以通过git rebase \ \命令来执行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。