首页 > 其他分享 >Git知识总览 git分支管理之rebase 以及 cherry-pick相关操作

Git知识总览 git分支管理之rebase 以及 cherry-pick相关操作

时间:2023-08-15 11:57:59浏览次数:40  
标签:Git cherry rebase git master pick 总览 分支

https://www.cnblogs.com/ludashi/category/1141984.html

 

 

上篇博客聊了《Git知识总览(三) 分支的创建、删除、切换、合并以及冲突解决》,本篇博客我们主要来看一下 rebase 变基相关的操作。rebase 操作和 merge 操作最终都可以达到合并代码的效果,不过其对分支的影响不同。上篇博客中我们聊到了 merge操作。简单的说merge操作就是将两个commit进行合并,然后在这两个分支合并的基础上创建一个新的commit。而变基操作简单的说是改变提交的父类,在改变父类时进行合并操作。合并就可能产生冲突,所以rebase时也会产生冲突,下方会介绍到。

聊完rebase,下方还聊如何进行cherry-pick。cherry-pick的本质其实也是合并,只不过是可以将任意分支,任意提交合并到相关分支。当然只要是合并操作,都有可能产生冲突,下方会给出cherry-pick操作的基本使用以及如何解决cherry-pick时产生的冲突。

 

一、merge 与 rebase 的简单对比

下方是我们做操作之前的分支状态,共有 bugFix、side 、another 三个分支。现在我们要做的是分别使用 merge 和 rebase 将分支 side 中的内容合并到master分支。

  

 

首先我们先来看一下 merge 操作。上篇博客中已经详细的聊了merge的相关操作,再次就不做过多的展示了,下方只做了简单的展示。

  • 首先切换到master分支
  • 然后在master分支上执行 git merge side 操作,将side分支上的内容合并到master分支上。
  • 最后如果需要的话,在将side分支的指针指向master分支即可。

  

 

然后我们再看一下 rebase 下的相关操作。

  • 首先切换到 side 分支。
  • 然后在 side 分支上执行 git rebase master 操作,将其变基到master分支上。

  

 

 

二、rebase的基本操作

首先我们来看一下在git分支管理中如何使用rebase, 以及rebase的后会起什么作用。下方会根据一系列的示例来看一下rebase操作的实际效果。首先我们先来看一下做rebase操作之前的分支状态,如下所示。目前除了master主分支外,还有其他三个分支,分别为bugfix01、bugfix02、bugfix03。

现在要做的事情是在 bugfix01 的分支上执行rebase操作,将其变基到master分支上。

  

 

下方是在 bugfix01分支上执行的 git rebase master 将bugfix01分支变基到master分支上,下方是变基后的分支状态。从下方的分支中不难看出,之前在 master 分支后方的 bugfix01现在跑到了master分支的后方,并且 bigfix01 分支上的两个提交(3cc582b、f47d2ac)不见了。取而代之的是基于master分支的两个新的提交(d6d82d8、14bc685)。这两个新的提交不但包含了3cc582b、f47d2ac这两个旧的提交的内容,而且还包含了master分支当前指向的分支(b79aa11)提交上的内容。

  

 

上面的表达也许有点抽象,下面我们可以话一张图来表示上述的关系。根据上面的分支关系,简单的画了一下上面的 rebase 操作所对应的关系图。rebase 操作完后,下方画红框的分支就被废弃掉了。然后bugfix01会指向rebase后的commit上。

  

接着上面的操作,可以切换到master分支,然后执行 git merge bugfix01 命令,将master分支快速移动到bugfix01分支上所指向的内容上。下方就是快速移动后的结果。经过这步后,就完成了一次rebase操作。从rebase操作的结果来看,其对 git 的分支进行了整理,换句话说,rebase操作可以将其他分支上的内容合并到主分支上,合并后之前的分支的指针的指向也会随之变化,变化后之前的提交就会被抛弃掉。

  

 

变基是存在一定风险的,在 ProGit上有一句话:Do not rebase commits that exist outside your repository. 大概意思就是说:不要在你的仓库在其他地方存在副本的情况下,对分支执行变基。也就是说,你从远程Clone下来代码,然后对之前的操作进行了rebase, 并且强推到远端。如果别人也clone的相关仓库,在其分支上做了相关操作。在push之前执行pull时,因为之前的分支被你rebase了,也就是有了新的提交,在pull时,就会进行merge操作。这样一来,分支就会更加复杂。如果出现上述问题 就使用rebase 来解决问题,即使用 git pull --rebase 来执行。

这一块具体的东西还是参考ProGit上的内容来的比较直观,在此就不做过多赘述了。

 

三、rebase的冲突解决

为了看rebase冲突的解决方式,我们故意的制造了下方的冲突,然后去执行rebase操作。从下方的操作中不难看出,在rebase的过程中产生了冲突,需要我们去解决。解决冲突后将相关问题件进行commit, 然后使用 git rebase --continue 操作来继续rebase。

因为rebase时会合并多个提交,在多个提交合并时会产生多个冲突,所有在一个冲突解决并提交后,进行git rebase --continue继续合并接下来的点。继续后仍然有可能产生冲突,产生冲突即解决冲突,直到rebase结束为止。

 

 

四、cherry-pick的基本操作

接下来我们来看一下git中比较实用的一个命令:cherry-pick。这个命令的名字是比较形象的,cherry-pick即“摘樱桃”,使用该命令可以将任意的commit通过其commit号将其合并到你想要的分支上。接下来我们就来看一个例子。

下方就演示了cherry-pick命令的使用方法。在 master 分支上,执行 git cherry-pick <一些commit的哈希值> 然后将这些提交合并到master分支上。这些分支会根据cherry-pick的顺序进行merge,每次merge都会形成一个新的提交。与rebase命令不同,虽然会产生一个新的提交,而之前的提交是不变的。具体如下所示: 

  

 

接下来我们来看一下具体在终端上cherry-pick的操作命令。下方是目前分支的状态,并且处于master分支上。现在我们要做的事情是将 d98ff43  这个commit 拿到master上。

  

 

下方就是我们执行cherry-pick的命令,如下所示。下方执行cherry-pick时是非常顺利的,没有产生冲突。当提交进行合并时会产生冲突,就不是这个样子了,稍后会演示到。

  

 

下方就是顺利的cherry-pick后的样子。

  

 

五、cherry-pick的冲突解决

在cherry-pick时遇到冲突是避免的,下方特地搞了一个cherry-pick冲突的例子。为了更进一步的了解冲突的解决方式,下方cherry-pick了多个提交,而且这多个提交在merge时都会有冲突。下方我们会对这些冲突进行解决。

  • 首先我们在master分支上通过 git cherry-pick <一系列提交的哈希值>来将 4f8e019、dbe9e8a、5c52520这三个提交摘到master分支上。
  • 然后我们会先看到在cherry-pick 4f8e019 这个提交时产生了冲突,报了一个Error:提升不能将cherry-pick命令应用于4f8e019。并且下方给了一系列的提示(解决此错误可以通过正确的方式解决冲突,然后通过git add 或者 git rm将更改的文件进行追踪,最后可以使用 git commit进行提交)
  • 解决一个冲突并commit后,使用 git cherry-pick --continue可以进一步的进行下一个提交的cherry-pick。下方再次执行git cherry-pick --continue时,又出现了冲突,此刻我们还是按照上述的步骤对冲突进行解决,解决完毕后接着git cherry-pick --continue。直到所有的commit被合并完毕即可。具体操作步骤如下所示:

  

 

下方是上述操作的最终结果,cherry-pick了三个commit,冲突了三次,解决了三次。如下所示:

  

 

下篇博客会继续聊Git的相关的内容。

 

标签:Git,cherry,rebase,git,master,pick,总览,分支
From: https://www.cnblogs.com/gongxianjin/p/17630955.html

相关文章

  • 如何将composer包私有化,并放在git上
     以laravel框架举例:1.创建私有Composer包并初始化Git仓库:在你的项目根目录中打开命令行,并执行以下命令:composerinit--name=myvendor/my-package这将引导你创建一个基于Composer的包,并在完成后将其初始化为一个Git仓库。2.将自己的源码包,复制到刚刚创建的私有包......
  • 【开发环境配置指导】Git和CodeHub配置指导
    (注:博客图片显示不清晰,详细可见附件word文档)1   Git工具安装及配置1.1 Git安装1、 点击如下链接进入到Git下载页面;http://3ms.huawei.com/hi/index.php?app=group&mod=File&act=showList&gid=20315572、 找到最新的TortoiseGit-xxx.zip(可视化工具)及Git-xxx.zip(命令行工......
  • git 仓库创建并导入项目
    1.初始化项目gitinit本地出现.git文件2、本地项目的文件gitadd.   添加所有的文件gitadd--all 添加所有的文件3、gitstatus显示工作目录和暂存区的状态4、gitcommit提交到版本库gitcommit-m"此处写提交备注"gitpushoriginmaster......
  • 修复漏洞-gitlab升级(2)
    修复漏洞-gitlab升级(2)接上一篇。。。升级完我就做了个快照,等领导有空试用下,然后我不忘提醒,升级十几个版本需要花费2天时间,而且升级过程中有些报错,不知道会不会影响使用。领导说直接装新版本,免得夜长梦多(一下子推翻我所有的努力)当时我领导想买一台按量付费的服务器B......
  • 字节码的终极应用-GitHub高星开源APM项目之Pinpoint
    大家好,我们前面的章节javaagent以及一些字节码修改框架ASM和Javassist,以及他们的一些简单的应用场景.今天重点给大家介绍一款github上开源的APM分布式链路监控产品--Pinpoint.Pinpoint是什么?Pinpoint是一个开源的APM(ApplicationPerformanceManagement/应用性能管理......
  • git 笔记
    1:删除远端分支假设gitbranch-va后显示存在名为test_dev的远端分支,则通过gitpushorigin:test_dev命令即可删除远端的 test_dev分支2:在网页上创建仓库,pull到本地后将变更在本地修改commit后gitpushoriginmaster即可将变更推送到远端的master分支上;......
  • 修复漏洞-gitlab升级(1)
    修复漏洞-gitlab升级(1)这东西搞了我很久。。。今天终于告一段落了,可喜可贺(现在喉咙痛想生病的样子)上一篇提到我们的gitlab版本存在漏洞:任意文件读取漏洞(CVE-2020-10977),大家有兴趣可以查下这个安全漏洞的重现  (虽然是测试域名被测到,但真实环境就是这个版本)。而领导最......
  • git clone失败解决方法
    gitclone如果遇到下面两个error:error:RPCfailed;curl92HTTP/2stream5wasnotclosedcleanlybeforeendoftheunderlyingstreamerror:RPCfailed;curl56OpenSSLSSL_read:Connectionwasreset,errno10054输入下面命令可能有帮助:gitconfig--globalh......
  • git将一个分支修改的内容提交到另一个分支
    以下操作是在代码未commit的情况下进行的一.git命令操作gitstash//把暂存区内的修改存储起来gitcheckoutdev//切换到正确的分支gitstashpop//将存储的修改取出来二.idea操作1.gitstash暂存本地分支修改的内容 2.gitcheckout分支 3.rebase更新代码 4......
  • git操作配置命令
    右键菜单配置GitBashHere功能键运行regedit.exe进入注册表,在HKEY_CLASSES_ROOT\Directory\Background\shell中进行设置。1.新建项GitBushHere,此时你可以看到在桌面右键会出现“GitBushHere”菜单。2.添加GitBushIcon,在第一步的新建项GitBushHere下,新建字符串值Icon,......