首页 > 其他分享 >Git rebase使用小结

Git rebase使用小结

时间:2022-12-23 09:45:07浏览次数:55  
标签:git rebase feature Git master 提交 小结 分支

1、分支之间rebase

构造两个分支master和feature,其中feature是在提交点B处从master上拉出的分支

master上有一个新提交M,feature上有两个新提交C和D

此时我们切换到feature分支上,执行rebase命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动。模拟了git pull --rebase的情形)

git checkout feature
git rebase master

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

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

解释: 当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到这两个commit。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,注意这里的接法,实际是会依次拿M和C、D内容分别比较,处理冲突后生成新的C’和D’。一定注意,这里新C’、D’和之前的C、D已经不一样了,是我们处理冲突后的新内容,feature指针自然最后也是指向D’

另外:当rebase过程中,可能会遇到冲突,需要进行以下处理

vim 冲突文件 #冲突文件中会有两个或多个commit的修改,删掉其中不需要保留
git add 冲突文件
git rebase --continue #若想终止rebase,请使用--abort参数

注意:git rebase之前尽量先将分支pull一下,而且rebase之后push的时候,需要使用--force参数

 

 

2、合并多个commit

当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。

使用以下命令

git rebase -i [startpoint]  [endpoint]

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

示例,我们执行以下rebase命令:

git rebase -i ${A的commit id}  #对上图分支中B、C、D进行合并,合并为B’

除了使用git rebase -i  [startpoint]  [endpoint],还有另外一种方式:

git rebase -i HEAD~n

其中n表示合并当前分支最后的几次提交。

示例:

git rebase -i HEAD~3  #对当前分支最后3次提交进行合并,也就是对B、C、D进行合并,合并为B’

 

 

3、将某一段commit粘贴到另一个分支上

当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,就像下图:

我们希望将develop分支中的C~E部分复制到master分支中,这时我们就可以通过rebase命令来实现

git rebase   [startpoint]   [endpoint]  --onto  [branchName]

其中,[startpoint] [endpoint]仍然和上一个命令一样指定了一个编辑区间(前开后闭),--onto的意思是要将该指定的提交复制到哪个分支上。

示例:

master分支:

develop分支:

所以,在找到B(b4d576bc4)和E(5de0da9f2)的提交id后,我们运行以下命令:

git rebase b4d576bc4 5de0da9f2  --onto master

执行完成,查询当前git log,记住E'的commit id(0c72e64

可以看到,C~E部分的提交内容已经复制到了G的后面了,大功告成?NO!我们看一下当前分支的状态:

当前HEAD处于游离状态,实际上,此时所有分支的状态应该是这样:

所以,虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,它还是指向G,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:

git checkout master
git reset --hard  0c72e64

此时就完成所有操作了,master分支也指向E’了

 

参考:

1、https://www.jianshu.com/p/4a8f4af4e803

2、https://blog.csdn.net/weixin_42310154/article/details/119004977

 

标签:git,rebase,feature,Git,master,提交,小结,分支
From: https://www.cnblogs.com/limstorm/p/17000033.html

相关文章

  • 关于git的reset指令说明-soft、mixed、hard
    在开发过程中,git的版本管理越来越普及。在版本管理中,最常用和最重要的是重置提交的版本,恢复后悔做了的事。大家都知道用reset命令。但是有几种形态需要整理共享一下,也方......
  • Git-回退到指定版本 reset/revert
    2019/7/27修改更新一、问题描述在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总......
  • jenkins+git+.net core实现自动发布
    一、前言    继上篇介绍jenkins过去2年多了,最近整理了一下,希望这篇能介绍到一些更实用的方法和知识。本次使用的jenkins版本是2.375.1、jdk17、WinRAR、git;......
  • Bash Shell自定义助手函数git-submodule-foreach:遍历对每个子模块仓库执行自定义的函
    BashShell自定义助手函数git-submodule-foreach:遍历对每个子模块仓库执行自定义的函数或命令序列...概述:在一个大型项目下,我们通常通过GitSubmodule(子模块)机制引入了其......
  • Git的常用命令
    Git基础操作:本地分支与远程master保持同步:​1.先将本地的master拉到最新`gitcheckoutmaster`​gitpull使dev分支保持同步gitcheckoutdevgit......
  • 集成GIT仓库
    集成GIT仓库jgit-java实现git操作一个Java程序中使用Git,有一个功能齐全的Git库,那就是JGit。JGit是一个用Java写成的功能相对健全的Git的实现,它在Java......
  • 用python写一个获取git log也就是changeLog的小工具
    一、前提:每次发版后,都是人工去整理gitlog进行发版说明,结合项目需要,决定写个小工具获取gitlog,主要实现的功能点有以下几点:1、获取gitcommit时的记录。2、在commit中......
  • Git使用教程
    目录​​Git和SVN的区别​​​​Git的安装​​​​Git结构​​​​Git和代码托管中心​​​​本地库和远程库的交互​​​​Git的命令行操作​​​​本地库初始化​​​​Gi......
  • github pages官方资料限制空间最大1G
    githubpages官方资料限制空间最大1G 但是目前我的空间已经突破5G也没看到有任何限制的趋势。】目前编译一次就是比较慢,大概需要50分钟了。    ......
  • Git & Github & Gitee
    Git学习一、认识Git1、什么是Gitgit是一个分布式版本控制软件,最初由林纳斯·托瓦兹(LinusTorvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。2......