💌 所属专栏:【Git】
😀 作 者:我是夜阑的狗🐶
🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!
💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩
文章目录
- 前言
- 一、介绍
- 二、问题背景
- 三、模拟场景
- 1、开始结构
- 2、克隆仓库
- 3、本地提交
- 4、撤销提交
- 四、解决方案
- 1、方案一
- Step 1、回退撤销改动
- Step 2、撤销改动
- Step 3、修改 C2 改动再提交
- Step 4、合并 C3
- Step 5、提交至远程
- 2、方案二
- Step 1、merge 合并 C3
- Step 2、提交至远程
- 总结
前言
大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第43篇文章;
今天又是学习 Git 实战篇 的一天,总结在使用 Git 过程中遇到的问题 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
专栏地址:【Git】 , 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
一、介绍
这里给大家推荐一个好用的 Git在线练习地址。在这练习网站里面也有自己的教程,可以一步一步跟着教程学习吧,记录下自己的所感所悟。
从题目中不难看出今天我们的主角就是 git reset
。在 Git 的日常使用中,git reset
指令用于将HEAD指向的当前分支位置重置为指定的提交,并可选择性地更新暂存区域和工作目录。这个命令通常用于撤销之前的提交或者重置当前分支到一个特定的状态。然而,不当的使用或复杂的合并场景下,git reset
操作有时会遇到需要回退该操作的方式(简而言之就是 reset 内容不满足开发者需求),让开发者头疼不已。接下来就让我们看看在实际项目过程中 git reset
的时候想要回退该操作的时候是怎么解决的吧。话不多说,让我们开启新的征程吧。 🚀 🚀 🚀 Let’s GO GO GO !!! </font>
二、问题背景
今天跟同事遇到 git
提交的一个问题,本地分支 commit
提交两次,发现第一次提交那里有一些地方忘记修改了,需要回退第一笔提交,但是想保留第二提交不动。然后他使用 git reset HEAD^
, 就只把一笔改动给回退。此时🧐,需要把状态还原回去重新尝试,于是我让同事打 git reset --abort
(这里我学艺不精就没咋记住那个回退命令 😭)回退一下,同事就是执行 git reset --abort
,然后就没有然后,因为这个命令压根就不存在,纯粹是我记混了哈哈哈哈哈。没办法只能用 git
模拟出他的场景,利用可视化界面来帮我们理清一下思路。
三、模拟场景
首先来到我们的 Git 练习场地,进来可以发现就只有一个本地分支,所以我们需要一步一步来模拟出他的错误场景。
1、开始结构
接下来就让我们来看看是怎么操作的吧。
2、克隆仓库
首先我们先把远程仓库克隆下来。
git clone
很简单吧!运行结果如下图所示:
3、本地提交
在本地分支上提交l两次,这里先提交在 fakeTeamwork
也是可以的。
git commitgit commit
很简单吧!运行结果如下图所示:
4、撤销提交
在本地分支上进行两次 commit 提交。
git reset HEAD^
很简单吧!运行结果如下图所示:
到这里基本上已经把问题场景复现出来了。
四、解决方案
通过前面的步骤已经把问题场景可视化出来了,我们可以看到想要把当前状态回退到 C5 状态。这里通过查阅 git reset 的命令,🚨 🚨 🚨 注意一下,从了 【随笔】Git – 高级命令(上篇)(六) 了解到 git reset 回退的参数是 --hrad,而不是 --abort。谨记啊😭,看来我还得在多精进精进。
1、方案一
Step 1、回退撤销改动
将前面撤销改动回退到指定状态,将HEAD指向的当前分支位置重置为指定的提交,同时将暂存区域和工作目录都重置为指定提交的状态。
git reset --hard C5
运行结果如下图所示:
🚨 🚨 🚨 注意一下,这里 --hard 参数是属于硬重置,不保留修改的文件,恢复到最近一次提交的状态。想要指定提交之后的修改移除暂存区,但保留在工作目录中,就需要 git reset --mixed
了。
我们也可以发现 git 练习网站是不支持 git reset --mixed
的,所以想要验证的话只能真正的 git 仓库了。
Step 2、撤销改动
通过多次尝试,发现想要只回退第二笔,保留第一笔改动不动的情况貌似有点不知道怎么实现,当然有知道的大佬也可以在评论区告诉我哈,或者我知道了也会第一时间更新的,这里我就随意操作一下哈。
git reset HEAD~2
运行结果如下图所示:
Step 3、修改 C2 改动再提交
当我们撤销两笔改动后,需要将 C2
提交点补齐之前忘记修改的部分,然后再次提交。
git commit
运行结果如下图所示:
Step 4、合并 C3
此时 C4
就是我们修改 C2
后的结果,接下来就只要把 C3
合并进来就可以了。这里用 git cherry-pick
命令来指定合入对应的提交点即可。
git cherry-pick C3
运行结果如下图所示:
🚨 🚨 🚨 注意一下,这里是不推荐用 rebase
来合并 C3
,因为 rebase
会把一整条分支合并进来,所以 C2
也会跟着合并进来,显然不符合我们的要求。可以来看一下 rebase
是怎么跑的:
git rebase main C3
运行结果如下图所示:
Step 5、提交至远程
最后将处理好的 commit
提交至远程仓库即可。
git push
运行结果如下图所示:
Oh yeah,圆满解决!!!🎉🎊🎉实际上同事也按这个方法顺利解决问题。
2、方案二
当然不止上面这一种解决方法,这里提供另外一种方法,我们可以不用 cherry-pick
方式合入对应的分支,而是通过 merge
方式来合入分支。前面步骤这里就省略了,直接来到合并环节。
Step 1、merge 合并 C3
git merge C3
运行结果如下图所示:
Step 2、提交至远程
最后将处理好的 commit
提交至远程仓库即可。
git push
运行结果如下图所示:
这里两种方法都能解决该问题,区别在于第一种方法远程仓库上不会产生多余提交,是一条干净的 commit
,而第二种方法则会在远程仓库上将本地分支的合并操作也一并合进来。一些开发人员喜欢保留提交历史,因此更偏爱 merge
。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase
。仁者见仁,智者见智。 😄 当然知道更便捷方法的大佬也可以在评论区告诉我哈。
总结
感谢观看,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹
也欢迎你,关注我。👍 👍 👍
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉
更多专栏订阅:
😀 【LeetCode题解(持续更新中)】
🥇 【恒玄BES】
🌼 【鸿蒙系统】
💎 【蓝牙协议栈】
🎃 【死机分析】
👑 【Python脚本笔记】
🚝 【Java Web项目构建过程】
💛 【微信小程序开发教程】
⚽ 【JavaScript随手笔记】
🤩 【大数据学习笔记(华为云)】
🦄 【程序错误解决方法(建议收藏)】
🔐 【Git 学习笔记】
🚀 【软件安装教程】
订阅更多,你们将会看到更多的优质内容!!