> 技术文档 > 【随笔】Git 实战篇 -- 将本地分支有 merge 后,有新改动,rebase 后报错No changes - did you forget to use ‘git add‘? (四十一)_no changes - did you forget to use \'git add\'? if t

【随笔】Git 实战篇 -- 将本地分支有 merge 后,有新改动,rebase 后报错No changes - did you forget to use ‘git add‘? (四十一)_no changes - did you forget to use \'git add\'? if t

请添加图片描述

  • 💌 所属专栏:【Git】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

  • 前言
  • 一、介绍
  • 二、问题背景
  • 三、模拟场景
      • **Step 1、克隆仓库**
      • **Step 2、模拟远程提交**
      • **Step 3、本地提交**
      • **Step 4、更新本地分支**
      • **Step 5、本地再次提交**
      • **Step 6、远程分支也新提交**
  • 四、解决方案
      • 方案一:
      • 方案二:
  • 总结

前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第41篇文章;
  今天又是学习 Git 实战篇 的一天,总结在使用 Git 过程中遇到的问题 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【Git】 , 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


一、介绍

  这里给大家推荐一个好用的 Git在线练习地址。在这练习网站里面也有自己的教程,可以一步一步跟着教程学习吧,记录下自己的所感所悟。
  在 Git 的日常使用中,git rebase 是一个强大的命令,它能够帮助我们保持提交历史的清晰和线性。然而,不当的使用或复杂的合并场景下,rebase 操作有时会遇到各种错误,让开发者头疼不已。接下来就让我们看看在实际项目过程中 git rebase 的时候出现 No changes 是怎么解决的吧。话不多说,让我们开启新的征程吧。 🚀 🚀 🚀 Let’s GO GO GO !!!

请添加图片描述

二、问题背景

  今天跟同事遇到 git 提交的一个比较抽象的问题,他本地分支与远程分支是不一致(此时他本地分支是有 merge 记录和多个 commit ),我就让他先 rebase 一下将本地分支更新于远程分支同步,这样就可以将本地分支的改动提交到远程分支。但实际上 rebase 到第三个 commit 的时候就报错了:

No changes - did you forget to use ‘git add’? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. Resolve all conflicts manually, mark them as resolved with “git add/rm ”, then run “git rebase --continue”. You can instead skip this commit: run “git rebase --skip”. To abort and get back to the state before “git rebase”, run “git rebase --abort”.

  No changes 这一下子就把我干懵了,这辈子都没打过这么懵逼的仗 😭,于是绝对用 git 模拟出他的场景,利用可视化界面来帮我们理清一下思路。

三、模拟场景

  首先来到我们的 Git 练习场地,进来可以发现就只有一个本地分支,所以我们需要一步一步来模拟出他的错误场景。

  • 开始结构
    在这里插入图片描述

  接下来就让我们来看看是怎么操作的吧。

Step 1、克隆仓库

  首先我们先把远程仓库克隆下来。

git clone

  很简单吧!运行结果如下图所示
在这里插入图片描述

Step 2、模拟远程提交

  模拟远程分支提交记录,这里相当于远程仓库别的同事也进行了提交。

git fakeTeamwork main 2

  很简单吧!运行结果如下图所示:

在这里插入图片描述

Step 3、本地提交

在本地分支上提交,这里先提交在 fakeTeamwork 也是可以的。

git commit

  很简单吧!运行结果如下图所示:

在这里插入图片描述

Step 4、更新本地分支

  拉取远程分支的数据并合并到本地分支中。

git pull

  很简单吧!运行结果如下图所示:

请添加图片描述

Step 5、本地再次提交

  此时本地再次进行多次提交,这里为了贴近问题场景所以也跟着提交了三次。

git commitgit commitgit commit

  很简单吧!运行结果如下图所示:

在这里插入图片描述

Step 6、远程分支也新提交

  当本地分支有新提交时,远程分支也有新的合入点。

git fakeTeamwork main 2

  很简单吧!运行结果如下图所示:

在这里插入图片描述

  到这里基本上已经把问题场景复现出来了。

四、解决方案

  通过前面的步骤已经把问题场景可视化出来了,我们可以看到如果将本地分支合入到远程分支,首先得更新本地分支,我们来看一下为什么在实际中会 rebase 不了?

方案一:

  • Step 1、更新本地分支

  这里通过 git push --rebase 更新本地分支

git push --rebase

  运行结果如下图所示:

请添加图片描述

  🚨 🚨 🚨 这里注意一下!!!大家都看到了吧,关键点就是 C5 提交点,rebase 的时候并没有把 C5 合进去,而是选择了跳过,这是因为 C5 提交点包含C4C3C2 ,而对于远程主分支来说 C3C2是已经存在的,当合入 C4,在合入 C5 提交点时,此时我们主分支已经包含了 C4C3C2, 所以 C5 对于远程主分支来说是 No changes 的,这里跳过 C5 就可以了。

  然而为什么 git 练习网址 rebase 报错呢?细心一点的小伙伴就能从上图中看出了,那是因为网站上已经帮我们主动跳过 C5 了,所以不会报错,而实际 git 使用过程中并不会跳过,而是给我们报如下提示:

No changes - did you forget to use ‘git add’? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. Resolve all conflicts manually, mark them as resolved with “git add/rm ”, then run “git rebase --continue”. You can instead skip this commit: run “git rebase --skip”. To abort and get back to the state before “git rebase”, run “git rebase --abort”.

  • Step 2、跳过无改动的 commit

  所以我们只要跳过无改动的 commit,后续分支也就可以合入进去。

git rebase --skip
  • Step 3、提交至远程

  最后将处理好的 commit 提交至远程仓库即可。

git push

  运行结果如下图所示:

在这里插入图片描述

  Oh yeah,圆满解决!!!🎉🎊🎉实际上同事也按这个方法顺利解决 rebaseNo changes 问题,

方案二:

  当然不止上面这一种解决方法,这里提供另外一种方法,我们可以不用 rebase 方式合入分支,而是通过 cherry-pick 来合入对应的分支即可。

  • Step 1、拉取远程分支

  将远程分支拉取缓存到本地分支中,注意一点:这里是拉取远程分支数据到本地,并没有合入。

git fetch

  运行结果如下图所示:

在这里插入图片描述

  • Step 2、选择o/main

  选择本地仓库中的 o/main 远程分支,为后续合并做准备。注意一下:o/main 只是远程分支在本地仓库的一个映射位置而已。

git checkout o/main

  运行结果如下图所示:

在这里插入图片描述

  • Step 3、cherry-pick

  将需要合并的分支通过 cherry-pick 合入到指定分支中,这里我们就可以指定跳过 C5 不合入了。

git cherry-pick C4 C6 C7 C8

  运行结果如下图所示:

在这里插入图片描述

  • Step 4、选择main

  在选回本地 main 分支,为后续的合并做准备。

git checkout main

  运行结果如下图所示:

在这里插入图片描述

  • Step 5、更新本地分支

  将处理好的 o/main 分支上的提交点 C8\' 合入到 main 分支上。

git merge C8\'

  运行结果如下图所示:

在这里插入图片描述

  • Step 5、推送本地分支

  最后将处理好的 commit 提交至远程仓库即可。

git push

  运行结果如下图所示:

在这里插入图片描述

  这里两种方法都能解决该问题,区别在于第一种方法远程仓库上不会产生多余提交,是一条干净的 commit,而第二种方法则会在远程仓库上将本地分支的合并操作也一并合进来。一些开发人员喜欢保留提交历史,因此更偏爱 merge。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase。仁者见仁,智者见智。 😄


总结

  感谢观看,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】

  • 🥇 【恒玄BES】

  • 🌼 【鸿蒙系统】

  • 💎 【蓝牙协议栈】

  • 🎃 【死机分析】

  • 👑 【Python脚本笔记】

  • 🚝 【Java Web项目构建过程】

  • 💛 【微信小程序开发教程】

  • 【JavaScript随手笔记】

  • 🤩 【大数据学习笔记(华为云)】

  • 🦄 【程序错误解决方法(建议收藏)】

  • 🔐 【Git 学习笔记】

  • 🚀 【软件安装教程】

订阅更多,你们将会看到更多的优质内容!!