详解Git 的 rebase 命令使用方法

在基于 Git 的开发过程中,我们很容易遇到合并代码的情况,例如我们从 master 分支拉取了一个 feature 分支,当我们开发到一段时间之后,可能需要将 master 的代码合并到我们当前的 feature 分支之中。

这时,我们有两个选择,一个是使用git merge命令,一个是使用git rebase命令,这两个命令都是用来合并代码的,但却有一些差异。在本文中,我们主要讲述git rebase命令的使用方法,也会简单介绍这两个命令的差异。

如上图所示,我们从 master 分支拉取了一个名为 feature 的分支,并且在拉取新分支之后,有过三次提交记录;同时,master 分支在我们拉取 feature 分支之后,也有过两次提交记录。现在我们已经构造了背景,接下来我们合并代码。

首次,我们使用merge命令,其命令形式一般为git merge --no-ff master,即表示将 master 的代码合并到 feature 分支,其中--no-ff参数是为了保留 master 分支的提交记录。如上图所示,在使用merge命令进行代码合并之后,Git 会自动创建一个新的 commit 用来表示当前的合并操作,此 commit 记录了 master 代码合并到 feature 分支时产生的所有改动。

接下来,我们使用rebase命令,其命令一般形式为git rebase feature,即表示在 master 分支上执行rebase命令,将 feature 分支的代码合并到 master 分支。如上图所示,在使用rebase命令之后,Git 会合并两个分支的 commit 记录,其规则为「在基准分支上合并目标分支的代码,会将目标分支的提交记录全部前置到基准分支的最新提交记录之前」,就如上面这样,我们在 master 分支上使用了rebase命令之后,Git 将 feature 分支上面的所有 commit 记录都前置到了 master 分支的最新 commit 记录之前。

在这里,需要注意的是:rebase是以 commit 为维度的,按 commit 提交的顺序依次进行合并操作;如果在合并的过程中,某个 commit 遇到了冲突,则需要我们先解决该冲突,然后才能继续进行合并操作。特别地,在我们解决冲突之后,需要使用git add + 冲突文件命令将当前冲突标记为已解决,然后使用git rebase --continue命令继续合并操作。

通过上面的描述,我们能发现mergerebase有一个很明显的差异,那就是当遇到冲突的时候,使用merge命令,我们只需要解决一次冲突即可;使用rebase命令,我们则需要依次解决每一个冲突。

对于 Git 的rebase命令,其除了能进行代码合并之外,还有一个常用的功能,那就是将多个 commit 合并为一个,仍然以上面的 feature 分支为例,我们将其从 master 分支拉取之后,进行了三次提交,现在我们将这三个提交结论合并为一个,其命令一般形式为:

git rebase -i HEAD~N

其中,N为我们需要合并的 commit 记录的数量,因为示例中是三次提交记录,所以在此场景下,将N替换为3即可。

在执行完上面的命令之后,我们会进入vi或者vim文件编辑器:

如上图所示,pick标识了我们的三次提交记录,按i建进入编辑模式,保留第一个pick,然后将后面两个pick修改为s或者f,然后键入:wq保留修改。最后,为了将变更同步到远程分支,我们需要使用git push -f命令,其中参数-f表示强制提交。

到此这篇关于Git 的 rebase 命令使用方法的文章就介绍到这了,更多相关git rebase 命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-05-12

git rebase 成功之后撤销的操作方法

rebase在git中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率:相反,如果乱用,会给团队中其他人带来麻烦.它的作用简要概括为:可以对某一段线性提交历史进行编辑.删除.复制.粘贴:因此,合理使用rebase命令可以使我们的提交历史干净.简洁! 下面看下git rebase 成功之后如何撤销,感兴趣朋友看下. git rebase 过程中可以使用git --abort/--continue来进行操作,成功之后如何撤销呢? 首先执行git reflog查看本地记录 可知本次rebase

git rebase -i合并多次提交的实现

简介 在日常开发中,代码变更比较频繁,有时候想让前几次提交的合并为一次提交,这里可以使用git rebase -i 命令来完成,当然,git rebase命令不仅仅用于合并提交,它还有许多用处,比如可以使用git rebase onto将某一段commit粘贴到另一个分支上等等,这里主要介绍合并提交. 命令介绍 rebase为变基 git rebase -i 命令可以压缩合并多次提交 格式:git rebase -i [startpoint] [endpoint] 其中-i的意思是–intera

Git rebase命令使用实战

一.前言 一句话,git rebase 可以帮助项目中的提交历史干净整洁!!! 二.避免合并出现分叉现象git merge操作 1.新建一个 develop 分支 2.在develop分支上新建两个文件 3.然后分别执行 add.commit.push 4.接着切换到master分支 分别添加c.txt 和 d.txt两个文件,分别进行add.commit.push 5.现在想把develop分支上开发的部分合并到master分支上 6.git merge 会将master和develop合并的

详解git merge 与 git rebase的区别

前言 其实这个问题困扰我有一段时间,相信也有人和我一样有这个困扰,网上已有很多这种解释了,但是要么就是无图,要么就是解释的很乱,没太看懂,经过自己对git的使用,加上向同事请教,算是理解了这个问题,所以写下来分享一下,我尽量详细说明 merge与rebase的区别 假设我们有如下图一所示仓库,该仓库有master和develop两个分支,且develop是在(3.added merge.txt file)commit处从master拉出来的分支. merge 假设现在HEAD在(6.added

解决使用commit提交大文件无法推送到远程库问题及git rebase使用详解

解决这个问题并没有特别的(删除提交历史中某个文件,然后重新push),但是由于开始的使用失误,中间有使用git rebase和git reset命令处理,所以特此记录下 大文件无法push到远程仓库 问题 首先,故事(事故)的起因是这样的. 某次git push(类似测试使用,没有分支)到远程仓库时发生如下无法提交大文件的报错(大文件是一个pdf文件) $ git push Enumerating objects: 204, done. Counting objects: 100% (204/2

git rebase -i 修改历史提交的方法

git rebase -i 修改历史提交 commit 3 add 22222 commit 2 add 11111 commit 1 create file 有如上三次提交,发现第二次提交有失误,准备修改第二次提交. git log –oneline 查看head f206555 add 2222 572a41e add 1111 c195175 feat:create file git rebase -i c195175 回到第一次提交的基础上 进入命令模式 选择进行edit 此时已经回到第

一不小心git rebase后出现(master|REBASE 1/10)的问题及解决办法

有时候在向服务器git push origin master的时候会出现失败的现象.它是这样的 然后呢,我在百度上历经千辛万苦,找到了解决的方法. 他说是因为远程仓库和本地仓库文件冲突,使用git pull --rebase origin master(拉取远程的文件把本地的覆盖,再上传).然后再进行push,我这天真的小白,就深信不疑地使用了.第一次还真的成功了.还提交上去了.但是好景不长,我再次使用的时候(也可能是命令记错了),就变成了这样 然后我git status,他是这样的 不仅这样,

当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法

最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试. 重试本无可厚非,毕竟从使用者的角度来说,希望pt-heartbeat能不断重试,直到重新连接上数据库.但是,他们发现,不断的重试会带来内存的缓慢增长. 重现 环境: pt-heartbeat v2.2.19,MySQL社区版 v5.6.31,Perl v5.10.1,RHEL 6.7,内存500M 为了避免数据库启停对pt-heartbea

解决git 提交后中文字符会乱码的问题

最近发生那了一件怪事,当然菜鸡经常碰见怪事 本来一个.properties文件在idea里面commit的时候看了一下diff,没发现异常,但是提交到gitlab上发现.properties的所有中文字符都变成了 \xxxx 的ascii的编码. 然后我在idea的show history中查看和上一版本的差异,发现这些中文字符没问题??!! 然后就是一顿的百度,bing 最后发现设置里面 transparent native-to-ascii conversion是选中的 然后网上有人这样解释

详解git中配置的.gitignore不生效的解决办法

详解git中配置的.gitignore不生效的解决办法 前言: 通常我们希望放进仓库的代码保持纯净,即不要包含项目开发工具生成的文件,或者项目编译后的临时文件.但是,当我们使用git status查看工作区状态的时候,总会提示一些文件未被track.于是,我们想让git帮助我们忽略这些文件,不再提醒. 庆幸的是,git已经考虑到这点了.我们可以在项目的根目录下建立一个.gitignore的文件,该文件用来配置哪些文件或者目录不被track的.规则很简单,就在该文件中,写下你不想被track的文件

master数据库损坏的解决办法有哪些

SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s      Starting up database 'master'. 2015-10-27 10:15:23.01 spid6s      错误: 9003,严重性: 20,状态: 1. 2015-10-27 10:15:23.01 spid6s      The log scan number (227:

关于CentOs系统自带python和yum卸载后的解决办法

事故背景:前几天因项目需要,在服务器上搭建python-mysql模块,结果没安装好,于是乎想卸载重装,遂在网上查询卸载python的方法,结果一不小心直接把系统的python删了个干净.......... 现在只能含泪修复,博主在网上搜了一圈办法,基本上都不是那么的详细,现在记下这一方法,希望能帮到与我情况相同的朋友~ 1:卸载python(以免有些同学没有卸载干净) 2.卸载yum 3.验证是否删除干净 4.安装python和yum 在以下链接的镜像站中找到你系统对应版本的python rp

SQL Server 2012安装后服务器名称找不到的解决办法

网上说使用localhost即可,确实没错,但是有的仍旧会报出无法找到错误,我在无法通过的时候又重新安装了SQLServer,这次选中全部默认安装,之前使用的是选择安装,然后发现多了几个配置,其中有一项是建立实例,然后我再次选默认,安装完成后,再启动SQLServer2012,服务器名称中输入localhost,连接,ok. 猜想:估计是安装时没有建立实例所致,本机就没有安装实例 ,所以填localhost也没有用了. 以上所述是小编给大家介绍的SQL Server 2012安装后服务器名称找不

Eclipse启动Tomcat后无法访问项目解决办法

Eclipse启动Tomcat后无法访问项目解决办法 前言: Eclipse中的Tomcat可以正常启动,不过发布项目之后,无法访问,包括http://localhost:8080/的小猫页面也无法访问到,报404错误.这是因为Eclipse所指定的Server path和Deploy path的问题. 在Eclipse配置的Tomcat Server上双击,可以看到下图: 要想解决上述问题,需要修改Server path 和 Deploy path.选择上面第二项Use Tomcat inst

关于tomcat点击startup.bat后闪退问题的解决办法

问题:使用免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因:在启动tomcat是需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了tomcat的闪退. 解决办法: 1.在已解压的tomcat的bin文件夹下找到startup.bat,右击->编辑.在文件头加入下面两行: SET JAVA_HOME=D:\Java\jdk1.6.0_10 (java jdk目录) SET TOMCAT_HOME=E:\tomcat-6.0.

IIS服务器中 ASP.NET State Service 开启后 Session 仍容易丢失的问题终极解决办法

解决方法一: 1. 开启ASP.NET State Service服务: 选择管理工具->服务,找到ASP.NET State Service,点开后选择启动,并将启动类型设为自动. 2. 设置程序配置文件: 将web.config打开,会看到有一行是<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" timeout="20"/>,如