图解 Git 基本命令 merge 和 rebase

OpenClaw Mac本地部署保姆级教程:手把手教你“养龙虾” 聊天:直接与AI助理对话问你好后,AI回复下图内容:可以命令OpenClaw自动完成改名操作。管理技能:安装/卸载各种功能扩展查看日志:实时监控运行状态配置定时任务:让龙虾自动干活恭喜!现在你的Mac上已经有了一只功能强大的“小龙虾”。你可以通过Web界面或终端与它对话,让它帮你处理邮件、管理日程、编写代码,甚至控制智能家居。把它当实习生:初期多检查它的工作成果给最小权限:只授予完成任务所需权限定期审计:查看行为日志,发现异常及时处理及时更新保持最新版本。 阅读详情

green-leaf-merge-git

Git 基本命令 merge 和 rebase,你真的了解吗?

前言

Git 中的分支合并是一个常见的使用场景。

  • 仓库的 bugfix 分支修复完 bug 之后,要回合到主干分支,这时候两个分支需要合并;
  • 远端仓库的分支 A 有其他小伙伴合入了代码,这时候,你需要和远端仓库的分支 A 进行合并;

以上只是列举了分支合并的一些常见场景,关于 mergerebase 命令你足够了解吗?

HEAD 的理解

在介绍本文的主要内容之前,我们先理解一下 HEAD

HEAD 指向当前所在的分支,类似一个活动的指针,表示一个「引用」。例如当前在 develop 分支,HEAD 内容就是 ref: refs/heads/develop

HEAD 既可以指向「当前分支」的最新 commit,也可以指向历史中的某一次 commit (「分离头指针」的情况)。归根结底,HEAD 指向的就是某个提交点。

当我们做分支切换时,HEAD 会跟着切换到对应分支。

fast-forward 与 --no-ff 的区别

假如有一个场景:有两个分支,master 分支和 feature 分支。现在,feautre 分支需要合并回 master 分支。

fast-forward-初始状态

fast-forward 合并方式是条件允许的情况,通过将 master 分支的 HEAD 位置移动到 feature 分支的最新提交点上,这样就实现了快速合并。这种情况,是不会新生成 commit 的。

fast-forward

--no-ff 的方式进行合并,master 分支就会新生成一次提交记录。

--no-ff

如果条件满足时,merge 默认采用的 fast-forward 方式进行合并,除非你显示的加上 --no-ff 选项;而条件不满足时,merge 也是无法使用 fast-forward 合并成功的!

merge 操作

上面用图解的方式介绍了 fast-forward--no-ff 的区别。下面,结合实际的代码仓进行合并操作,举几个栗子理解一下。

git merge 操作是区分上下文的。当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。这个注意点记住了,方便记忆!所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上。

fast-forward 合并

刚刚一直在强调条件允许的时候,fast-forward 才能合并成功。条件指的是什么呢?

其实指的是源分支和目标分支之间没有分叉(单词 diverge),这种情况才可以进行快速合并。如果是下图中的场景,无法通过 HEAD 的快速移动实现分支的合并!

分叉

下面进行一个不分叉的场景的示例:

featuren 分支的初始状态

现在需要将 feature 分支合入到 master 分支,默认使用 fast-forward 方式:

# 切到目标分支
git checkout master
git merge feature

命令行里显示了 Fast-forward 的提示:

合入效果

看一眼 master 分支合入的前后对比(注意 HEAD 的位置):

master 分支合入前

master 分支合入后

no-ff 合并

不分叉的场景是否可以强制采用 --no-ff 方式合并呢?可以!

# master 回到合入前的状态
git reset --hard d2fa1ae
git merge feature --no-ff

no-ff

这次命令行没有 Fast-forward 的提示了。

看一眼 master 分支图:

no-ff

这个图和上面讲解 no-ff 命令时的示意图一致,果然会有新 commit 生成。

分叉场景的合并

分叉

上面的图展示了我们经常遇到的一个场景,特性分支创建之后,源分支也会有新的提交。这就是形成分叉了。

这时候如果我们进行合并呢?

git merge feautre

分支图

可以看到,虽然默认会尝试 fast-forward 的方式进行合并,但是因为分叉了,所以此时会采用 no-ff 的方式进行合并!有新的 commit 生成了!

fast-forward 方式对应的合并参数是 --ff

我们试试这个参数 --ff-only,顾名思义,就是强制只使用 ff 方式进行合并:

# 回到合并前
git reset --hard 3793081
git merge feature --ff-only

合并终止

经过测试,当分叉时,因为无法使用 ff 方式合并,即使你强制指定使用该方式合并也不行,会提示终止!

附上 Git 官方文档中的解释,方便理解:

With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

rebase 操作

rebase 命令是一个经常听到,但是大多数人掌握又不太好的一个命令。rebase 合并往往又被称为 「变基」,我称为 「基化」🤣。「基」的理解很重要,理解了它,其实 rebase 命令你就掌握了。

我的描述可能并不准确,只是为了能够帮助你理解。这里的「基」就是一个「基点」、「起点」的意思。「变基」就是改变当前分支的起点。注意,是当前分支! rebase 命令后面紧接着的就是「基分支」。

变基前:

分叉

git reabse master feature 变基后:

变基后

git rebase 命令通常称为向前移植(forward porting)。

变基提交示例

我们接下来进行实际的测试,将代码库状态构造成分叉的状态,状态图如下:

分叉初始状态

以 master 分支为基,对 feautre 分支进行变基:

git checout feature
git rebase master

以上两行命令,其实可以简写为:git rebase master feature

特性分支 feature 向前移植到了 master 分支。经常使用 git rebase 操作把本地开发分支移植到远端的 origin/<branch> 追踪分支上。也就是经常说的,「把你的补丁变基到 xxx 分支的头」

变基后

可以发现,在 master 分支的最新节点(576cb7b)后面多了 2 个提交(生成了新的提交记录,仅仅提交信息保持一致),而这两个提交内容就是来自变基前 feature 分支,feature 分支的提交历史发生了改变。

观察上图还可以发现,变基后,改变的只是 feature 分支,基分支(master 分支)的 HEAD 指针依然在之前的 commit (576cb7b)处。这时候要将 feature 分支合入到 master 分支上,就满足 fast-forward 的条件了,master 分支执行快速合并,将 HEAD 指针指向刚刚最新合入的提交点:

git checkout master
git merge feature

快速合并

看下图 master 分支图,观察 HEAD 指针的位置:
分支图

rebase 变基操作最适合的是本地分支和远端对应跟踪分支之间的合并。这样理解可能会更清晰一点。比如,远端仓库里有一个特性分支 feature,除了你开发之外,还有其他人往这个分支进行合入。当你每次准备提交到远端之前,其实可以尝试变基,这时候基分支就是远端的追踪分支。

下图是仓库的分支图:

与远端分支分叉

git fetch
git rebase origin/feature feature

变基后

观察上图,我们本地的提交以远端分支的最新提交为「基」,将差异提交重新进行了提交!远端分支的提交记录依然是一条直线~如果分叉的情况,不采用这种「变基操作」,而直接采用 merge 的方式合并,就会有如下这种分支提交图:

no-ff 合并

因为分叉了,采用 git pull 时也没法 fast-forward 合并,只能采用 no-ff 方式合并,最后的提交历史就会像上图那样。会产生一个合并提交。同时,分支图也显得稍微杂乱了一点,因为 feature 分支不是一条直线了。但是,其实也有好处,可以实际的看出来合并的提交历史。该选择哪个,往往取决于团队的选择策略。

rebase 总结

rebase 命令其实关键在于理解「基」,git rebase <基分支>,就是将当前基分支与当前分支的差异提交获取到,然后在「基分支」最新提交点后面将差异提交逐个再次提交,最后将当前分支的 HEAD 指针指向最新的提交点。

「基分支」的 HEAD 位置是不变的。要想完成分支合并,完成变基之后,需要再进行分支间的合并等操作。

rebase 命令的用法也不止于此,计划后期会专门写一篇介绍她的文章。本文本来是计划介绍 merge 命令的,但是合并的方式中,其实也经常涉及变基操作之后的合并,因此,干脆就放一起比较好了,这样易于理解记忆。

补充

  • git merge --abort 当合并的过程中,由于冲突难解决,你想放弃合并,回到未合并之前的状态;
  • git log --graph --pretty=oneline --abbrev-commit 可以在命令行方便地查看提交图

一言

在 Git 这个专辑里有一篇介绍 cherry-pick 的文章,有个小伙伴给了如下的留言,说明自己分享的内容获得了肯定,欣慰啊!

留言

今天肝的这篇文章,介绍了 Git 中的 merge 和 rebase 的基本概念和用法,同时,又自己手动绘制了图!俗话说,一图胜千言,但写完才发现,是真的耗时啊……不过,总结绘图的过程,自己也加深了理解,有些概念也变得更加清晰了!希望,我的总结也能让其他人读懂~

之前我经常会开启文章的「赞赏」,但发现收效甚微,很少有小伙伴会打赏。后来我就每次发文就关闭了这个选项。本文应该是 6 月份的「月末总结」了,就开启一次「月末赞赏」吧!期待小伙伴的支持与鼓励!

参考

我将本文的参考文章也都注明了,他们也都很有阅读的价值。但由于微信外链的缘故,可以点击右下角的「阅读原文」浏览!


生命不息,折腾不止!关注 「Coder 魔法院」,祝你 Niubilitiy !🐂🍺

公众号-二维码-截图

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新) 菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。 阅读详情

相关推荐

保姆级教程:用Python 3.10Ollama在Windows上搞定LightRAG本地部署(附环境配置避坑指南)

本文提供了一份详细的Windows系统下LightRAG本地部署指南,涵盖Python 3.10环境配置、Ollama模型服务安装到LightRAG核心组件部署的全流程。特别针对Windows平台常见问题提供解决方案,帮助开发者快速搭建高效的检索增强生成(RAG)系统,实现专业领域知识的智能检索与整合。

weixin_28725407的博客 446

Fast-forward merge is not possiable.To merge this request, first rebase locally

将dev 分支merge到master分支时出现以上问题,无法自动merge。9. push到dev分支:git push origin dev。10.强制push: git push -f origin dev。1.首先查看本地分支及远程分支:git branch -a。4.切换到dev分支:git checkout dev。远程分支: dev(开发分支) master。push成功以后就可以自动merge啦!3. 再重新查看本地分支及远程分支。此时不显示远程分支master。test.py不一致。

weixin_42148389的博客 2883

手把手带你实现DAF-Net:零代码基础入门红外与可见光图像融合(从理论到实战)

本文介绍了红外与可见光图像融合技术及DAF-Net网络的应用。红外图像能捕捉热源但缺乏细节,可见光图像纹理丰富但在低光环境下表现不佳。DAF-Net采用双分支特征提取动态注意力融合架构,能智能分配特征权重实现优势互补。文章详细讲解了环境配置、数据集准备(如TNO数据集)预处理方法,并提供了DAF-Net的核心代码实现,包括特征提取、注意力融合图像重建模块。通过该技术可在安防、自动驾驶等领域获得更优质的融合图像,提升视觉感知能力。

m0_71589036的博客 204

git rebasemerge 的那些事儿~(详细图解,通俗易懂)

什么是 rebase? git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。 原理很简单:rebase 需要基于一个分支来设置你当前的分支的基线,这基线就是当前分支的开始时间轴向后移动到最新的跟踪分支的最后面,这样你的当前分支就是最新的跟踪分支。这里的操作是基于文件事务处理的,所以你不用怕中间失败会影...

张兴华的博客 2914

git代码合并:MergeRebase的选择

代码合并:MergeRebase的选择 Zhongyi Tong edited this page on Dec 7, 2015 · 3 revisions  Pages 19 Home 2.1 快速指南 2.2 创建代码仓库 2.3 保存你的更改 2.4 检查仓库状态 2.5 检出之前的提交 2.6 回滚错误的修改 2.7 重写项...

weixin_34310785的博客 1184

git rebase详解(图解+最简单示例,一次就懂)

在拉公共分支最新代码的时候使用rebase,也就是git pull -r 但往公共分支上合代码的时候,使用merge

风中一匹狼的博客 63万+

git pull 提示Not possible to fast-forward,无法提交也无法更新

出现这个错误提示的原因是,你其他人修改了同一个文件,而且别人比你先提交。所提此时你在本地执行git pullgit push都无法完成。 1、此时你需要执行下面命令(--rebase顾名思义,重新校准基础版本,将本地的基础版本更新为git上的基础版本)【注意执行这个命令之前你需要将本地代码全部暂存】 // master指的是当前修改的分支,请修改当前你所修改的分支名称(不然会出人命的0.0) git pull origin master --rebase 2、一般情况下执行完这个,如果没有冲突,

dingyi4815313的专栏 4万+

图解 Git 工作原理,看了秒懂!

**前言** 在**乐字节**公开课上学习了git原理分享出来大家学习。。 正文 本文图解Git中的最常用命令。如果你稍微理解Git的工作原理,这篇文章能够让你理解的更透彻。 基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)仓库之间复制文件。 git add files把当前文件放入暂存区域。 git commit给暂存区域生成快照并提交。 git reset – files用来撤销最后一次git add files,你也可以用git reset撤销所有暂存区域文件。 git chec.

weixin_52397329的博客 251

深入浅出图解Git(转)

此页图解git中的最常用命令。如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻。 如果你想知道这个站点怎样产生,请前往GitHub repository。 正文 基本用法约定命令详解 DiffCommitCheckoutDetached HEAD(匿名分支提交)ResetMergeCherry PickRebase 技术说明 基本用法 上面的四条命令在工作目

wsfdl的专栏 1214

图解 Git 工作原理

图解 Git 工作原理 分布式实验室朱小厮的博客2月6日 点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 本文图解Git中的最常用命令。如果你稍微理解Git的工作原理,这篇文章能够让你理解的更透彻。 基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)仓库之间复制文件。 git add files把当前文件放入暂存区域。 git commit给暂存区域生成快照并提...

ailiandeziwei的专栏 274

小伙画了 22 张图,爆肝 git 的秘密

比如说你想要编译 1.6.6.1 版本的 git,你可以运行 git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说 git checkout main。当不指定文件名,而是给出一个(本地)分支时,那么 HEAD 标识会移动到那个分支(也就是 “切换” 到那个分支了),然后暂存区域工作目录中的内容会 HEAD 对应的提交节点一致。上面的命令都在 topic 分支中进行,而不是 main 分支,在 main 分支上重演,并且把分支指向新的节点。

bjmsb79的博客 96

图解GitRebaseMerge的区别

本文深入对比GitMergeRebase两种分支整合策略。Merge通过创建合并提交保留完整分支历史,适合团队协作公共分支;Rebase则重写提交历史形成线性记录,适合个人分支整理。文章通过可视化图表实际场景示例,展示了两种方法的工作流程与冲突解决差异,并给出最佳实践建议:遵循"公共分支用Merge,个人分支用Rebase"的黄金法则,同时注意避免强制推送等常见陷阱。掌握这两种策略的平衡使用,能显著提升版本控制效率团队协作体验。

qq_43947876的博客 2150

Git进阶(十八):git rebase详解

rebase使用方法git rebase [基节点]git rebase [基节点] [待变基节点]rebase后面的参数可以是两个,也可以是一个,当rebase为一个参数的时候其实是省略了第二个参数,第二个参数为HEAD指针当前指向的那个节点。

IT全栈 华强工作室 1万+

git mergegit rebase详解

git mergegit rebase详解

✍Snoring cat 6101

GIT】一文带你彻底了解 git rebase图解+案例+实战)

git rebase,顾名思义即变基,不过这是一条多功能命令,既可以重建提交历史,还可以整合不同分支间的变更。本文将对相关功能进行介绍。文中的截图为使用创建的,不熟悉git的可以使用这个练习一下。

Friday 2万+

git rebasegit merge图文详解(一文看懂区别)

git-rebasegit merge图文详解

weixin_45565886的博客 2万+

git rebase (合并代码整理提交记录)图文详解

使用rebase 可以进行 合并代码以及整理提交记录。本文使用完整的图文讲解,对rebase进行了详细的说明,使用命令进行执行,执行之后的图片、结果都进行了说明。对操作过程中可能出现的问题也进行了说明解释。

wangdawei_的博客 1万+

git基础】git merge使用简介

git merge 简介

All_In_gzx_cc的博客 10万+

git 合并分支 merge

git 分支开发 git 分支开发,分支(feature)同步主干(master)代码,以及最终分支合并到主干的操作流程 由于 rebase 执行速度慢,分支同步主干代码时,分支的每次提交都可能主干产生冲突,需要解决的次数太多,影响提交效率。 同时,为了保证主干提交线干净(可以安全回溯),所以采用下面所说的 merge 法。 merge法 核心:(master) git merge feat...

牛奔的博客 623

三年 Git 使用心得 & 常见问题整理

Git 流程图 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 配置 Git # 配置全局用户 $ git config --global user.name "用户名" $ git config --global user.email "git账号" # 配置别名 $ git config --global alias.co checkout $ git config --global alias.ss statu

山不走来 791

Fast-forward合并普通合并

Fast-forward合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息 合

要考甲级的fairy 2536

git mergegit rebase

文章目录git mergegit merge --ff (-ff可不写, 默认参数fast-forward )git merge --no-ff (non-fast-forward)git merge --ff-only (fast-forward-only )git merge --squashgit merge 小结git rebase使用场景1: 合并主分支到特性分支(变基)使用场景2: 合并多次提交纪录使用习惯参考 git merge git merge --ff (-ff可不写, 默认参数fast

fzzjoy的专栏 3408

变频器说明书大全系列-SK300E.rar

变频器说明书大全系列-SK300E.rar

微信小程序商城源码.zip

小程序商城源码,包含小程序,后台管理系统,服务后端,小程序包含商品浏览,商品详情,分类浏览,微信授权登录,微信支付等功能,管理后台可进行商品及订单的管理,包含上架、下架、公告,发货等功能

上一篇: 将博客搬至CSDN
下一篇: 2020 疫情年一次说走就走的端午重庆游
Michael翔
博客等级 码龄13年 45粉丝 135原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值