首页 > 其他分享 >git rebase

git rebase

时间:2022-10-24 19:45:48浏览次数:70  
标签:git rebase feature master 提交 分支

首先通过简单的提交节点图解感受一下rebase在干什么?

提交节点图解

两个分支master和feature,其中feature是在提交点B处从master上拉出的分支,master上有一个新提交M,feature上有两个新提交C和D。 image.png

此时切换到feature分支上,执行如下命令,相当于是想要把master分支合并到feature分支。

git checkout feature 
git rebase master // 这两条命令等价于git rebase master feature 
  • 1
  • 2

下图为变基后的提交节点图,解释一下其工作原理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QD9YcxiW-1653630148874)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/885c3148560748349ec1f39885a40004~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

这里要记住什么是待变基分支和基分支

  • feature:待变基分支、当前分支
  • master:基分支、目标分支

官方解释:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。

结合例子解释:当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,但这个过程是删除原来的C和D,生成新的C’和D’,他们的提交内容一样,但commit id不同,feature自然最后也是指向D’。

rebase的解释

rebase字面意思就是"变基",可以直接理解为改变基底。

feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。

注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录。

上面的例子可抽象为如下实际工作场景:张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。

实际git提交示例

按照上面的图解构造了提交记录,如下图所示:(ABM是master分支线,ABCD是feature分支线。这里画成了master变色分叉出来,这不影响理解,知道是表示两个分支两条线即可!)

image.png

此时,在feature分支上执行git rebase master,变基完成以后,ABCD是原来的feature分支线,ABMC’D’是新的feature分支线,ABM是master分支线(没有变化)。

image.png

推荐使用场景

  1. 拉公共分支最新代码的时候使用rebase,也就是git pull -r或git pull --rebase,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个commitid拉出来的了,因为基底变了嘛。(如果使用merge,多出无意义的一条提交记录"Merge … to …"

2、往公共分支上合代码的时候,使用merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次然后merge上去了,李四后来开发完rebase上去(注意:李四需要切换到主分支,然后执行git rebase,然后再git pull到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了

标签:git,rebase,feature,master,提交,分支
From: https://www.cnblogs.com/ianlab/p/16822520.html

相关文章

  • Git常用命令总结
    1、(先进入项目文件夹)通过命令gitinit把这个目录变成git可以管理的仓库gitinit2、把文件添加到版本库中,使用命令gitadd.添加到暂存区里面去,不要忘记后面的小数点“.”......
  • git hooks & ESLint All In One
    githooks&ESLintAllInOnegithookshttps://git-scm.com/book/en/v2/Customizing-Git-Git-Hookshttps://git-scm.com/docs/githooksESLinthuskyGithook......
  • Jenkins把GitHub项目做成Docker镜像
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《Jenkins流水线(pipeline)实战》系列的第三篇,......
  • git无法提交的问题
    因为以前的公司用git还挺溜的,但是新公司并不用git所以也想把这个公司的git捣鼓一下,无奈本人也是个git小白在提交的时候出现了如上图的超级多文件的eslint语法报错,需要更......
  • 基于git和markdown的个人笔记
    吹一波Onenote,用了很多年了,体验是最好的。但是他不支持Linux,这个非常难受。需求全平台通用,win/mac/linux,我会在这三种平台下写笔记。手机端很少用,甚至查看都很少用。支......
  • Gitlab 中,将 master 分支改名为 main
    背景吵吵闹闹了很久的master-slave机制也过去了很久,国内的反向一直不太强烈。不过今天有研发部的同事反馈说,他们项目组不再允许使用master分支了,原因是【项目规定】......
  • Git系列 -> git commit 报错 “Invalid syntax in configuration ini file.”
    gitcommit报错提示信息为“Invalidsyntaxinconfigurationinifile.”解决办法:方法一:使用-nor--no-verify参数:gitcommit-m"commitwithoutverify"-n......
  • Git 代码换行配置(.gitattributes)
    在项目的根目录下,配置包含下列内容的.gitattributes文件。*.vuetexteol=lf*.jstexteol=lf*.jsontexteol=lf*.css......
  • Ubuntu安装git
    1.打开终端,输入命令sudoaptupdate输入密码,确认授权。  3.输入命令。sudoaptinstallgit输入Y,确认命令执行。5.看安装版本,输入命令,。git--version......
  • 一台电脑上不同的Git仓库账号使用不同的公私钥设置
    使用场景:如我有多个git仓库账号,如2个bitbucket账号,一个github账号。我想让不同的git仓库账号使用不同的公私钥对,同时若多个bitbucket或多个github账号配置同一个公钥是不允......