GIT使用需知,哪些操作会导致本地代码变动

系列文章目录

手把手教你安装Git,萌新迈向专业的必备一步
GIT命令只会抄却不理解?看完原理才能事半功倍!
常用GIT命令详解,手把手让你登堂入室
GIT实战篇,教你如何使用GIT可视化工具


在这里插入图片描述
经过前三期的学习,相信大家对GIT的已经基本熟悉了。出于防患于未然,笔者还是决定讲一下日常操作中一些必须关注的点,即本地代码的丢失问题,GIT中有很多命令会更改工作区内容,我们今天就来详细地解析一下这些操作,做到防患于未然

📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 GIT 专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待


一、本地代码变动的本质

一旦我们把某个目录下的文件托付给GIT,那么在很多场景下,一些GIT的操作将直接改变这个目录的文件,这也就是所谓的工作区,要理清这个问题,我们必须先搞清楚工作区到底会和那些区域发生关联,我画了一个模型图供大家参考

在这里插入图片描述

可以看到,工作区与不少其他区域都有着交互,而这些交互都会改变工作区的内容。当然,在进一步详细讲解前,我们先简单介绍一下这些区域的概念,图中大部分的区域是我们在前面都提到过,至少相信大家对远程分支本地分支暂存区应该是有一定了解的,不了解的同学请看《GIT命令只会抄却不理解?看完原理才能事半功倍!》 中的描述。这里着重讲解一下远程跟踪分支贮藏区

1. 远程跟踪分支

远程分支本地分支通常是一对一的关系,但是它们并不是直接沟通的,它们有一个“中介”叫做远程跟踪分支,比方说我们使用

git branch -a

得到了这样的结果

* masterremotes/origin/HEAD -> origin/masterremotes/origin/masterremotes/origin/master_copy

其中以 remotes 开头的就是远程跟踪分支,它们可以说是远程分支的在本地的镜像,当然啦,这些跟踪分支不会自动更新或创建,比如此刻我在远程建了一个新分支叫 master_copy2,本地并不会察觉到的,也不会自己建一个远程跟踪分支

2. 贮藏区(stash)

贮藏区其实是GIT中一个比较特殊的区域(它的底层实际上类似于分支),当然由于翻译与功能的问题,有的人会把贮藏区(stash)和暂存区(index)混淆,但其实两者功能并不一致。

如果说工作区是加工台,那么当我们需要从一个工作切换到另一个工作时,如果本次工作已完成,我们就需要把本次加工完的零件放入暂存区(index),然后再从暂存区提交到本地分支;但是,如果本次的工作没有完成,我们是被迫要进行下一项工作时,我们就可以把本次还未完工的半成品放入贮藏区(stash),等我们什么时候又需要回来继续这项工作时,又可以去贮藏区(stash)把这个半成品拿回来继续加工

它两的逻辑如下图:
在这里插入图片描述
当然,他两的实际存储位置也不相同

在这里插入图片描述
在这里插入图片描述

二、分支切换

在一众操作中,分支的切换是最常见的操作,它的模型如下

在这里插入图片描述
只要你记住一点,工作区的代码是始终跟随 HEAD 的变化而变化的,我们切换分支实际上就是在切换 HEAD 的位置,比如当前我们是指向master分支,如果我们想切换到iss94-1分支,那么就会变成这样

在这里插入图片描述
然后工作区也就会变成iss94-1分支的代码。


三、分支合并

分支的合并其实前面已经做过比较详细的解释了,这里我们还是一样的以图来说话,当前分支是iss95,那么我的的工作区取的也是iss95最后一次提交的代码,即HEAD的位置。
在这里插入图片描述
如果在此时,我们执行

git merge master

就能把master的分支合并进来,最后的效果如图
在这里插入图片描述

此刻iss95就有了一次新提交,这次提交叫合并提交,我们的工作区代码将会被更新,此时的工作区将拥有原master和原iss95的所有代码。当然,必须再次重申,合并其实影响的只有本分支,即iss95,而master其实并没有被改变,此刻如果你切换分支去master,那它还是原master的代码


四、代码拉取

我们这里的拉取指的是pull,相信这个命令也有很多小伙伴用,比如我们很久没更新分支了,此时我们的图示如下,可以看到远程分支多了好几次提交,而我们本地则自己提交了一次
在这里插入图片描述
如果我们此时执行pull进行拉取,其实执行的是fetch 和 merge 两步操作,第一步fetch是把远程分支的代码拉下来,远程跟踪分支得到更新。然后执行merge,把远程跟踪分支和本地分支进行合并,最终得到如下的结构
在这里插入图片描述
这种操作会导致本地工作区被更新,其本质还是merge操作导致分支多了一次提交,进而影响到本地工作区


五、贮藏

如果说前面的操作带给工作区的改动是不可预知的,因为你无法预知其他分支的代码,因此自然不知道操做后本地会有哪些代码被改变。但贮藏不一样,因为贮藏的这些代码的变动是你自己改动的,所以其“危险性”就显得小了许多。相反,如果你预感某些操作可能会导致本地代码遗失,不妨先主动将代码贮藏起来,才做后再从贮藏去取回。

Git stash命令实际上会将当前工作区中未提交内容的修改暂存起来,并将工作区恢复到最后一次提交的状态。这个操作是通过保存当前工作区的修改,包括新增的、修改的和未跟踪的文件,然后再将工作区恢复到最后一次提交的状态来实现的


六、回退

我们如果是使用Idea的同学,很容易用到的一个功能就是rollback,通常是我们做了一些代码的修改,但感觉不对,又不想一行行删代码,于是想直接进行代码的回退。

在这里插入图片描述

Git中的rollback主要是指将代码恢复到之前的版本。但是,GIT中其实并不存在rollback命令,其主要依赖于 git checkoutgit reset 命令进行回滚:

git checkout 命令可以将工作区中的某个文件恢复到指定版本的状态,但是该命令会丢失当前的修改,因此需要慎重使用。例如,将 file.txt 回退到最新提交的版本:

git checkout file.txt

git reset 命令可以将工作区和暂存区回退到指定版本,其作用是将 HEAD 指针指向指定的提交,同时重置暂存区和工作区的状态。例如,将工作区和暂存区回退到最新提交的版本:

git reset HEAD~
git checkout .

其中 HEAD~ 表示回退到上一个提交,. 表示恢复所有文件的状态。当然,reset 也有 soft mixedhard 的三种模式

  • soft 回退到某个提交并保留修改:
git reset --soft <commit>

解释:这条命令会将 HEAD 指针指向指定的提交 ,但是不会修改暂存区和工作区的状态。这相当于撤销了该提交之后的所有修改,并且可以将这些修改再次提交。使用此命令可以修改之前的提交历史。

适用场景:在提交代码时,不小心将多次修改合并到了一起,想要将其中的一部分修改重新分开成多个提交记录,就可以使用 --soft 模式。

  • . mixed 回退到某个提交并保留修改,但暂存区丢失
git reset --mixed <commit>

解释:这条命令会将 HEAD 指针指向指定的提交 ,将暂存区的内容清除,但是不会修改工作区的状态。也就是说,通过该模式可以撤销之前的 git add 命令把文件添加到暂存区的操作。同时,工作区的代码不会受到影响

适用场景:将不想提交的文件或修改从暂存区中移除,或者在进行多次提交之前,重新整理暂存区的内容。

  • . hard 回退到某个提交并删除修改
git reset --hard <commit>

解释:这条命令会将 HEAD 指针指向指定的提交 ,并将暂存区和工作区的状态都重置为该提交的状态。这相当于彻底撤销了该提交之后的所有修改,同时删除了这些修改。

使用场景:在回退版本时,当需要彻底舍弃当前工作区的所有修改,并还原到回退版本的状态时可以使用 --hard 模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137853.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二蛋赠书三期:《C#入门经典(第9版)》

文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术…

做接口测试如何上次文件

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编…

CrossOver 23 正式发布:可在 Mac 上运行部分 DX12 游戏

CodeWeivers 公司于今年 6 月发布了 CrossOver 23 测试版&#xff0c;重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿&#xff0c;表示正式发布 CrossOver 23 稳定版&#xff0c;在诸多新增功能中&#xff0c;最值…

netty之数据读写源码阅读

数据读写 write 从client端的写开始看 client与服务端建立完connect后可以从future里拿到连接的channel对象。这里的channel是io.netty.channel.Channel对象。 调用其channel.writeAndFlush(msg);方法可以进行数据发送。 writeAndFlush会调用pipeline的writeAndFlush方法 …

Nacos内核设计之一致性协议(上)

Nacos一致性协议 Nacos技术架构 先简单介绍下Nacos的技术架构 从而对nacos有一个整体的认识 如图Nacos架构分为四层 用户层、应用层、核心层、各种插件 再深入分析下nacos一致性协议的发展过程及原理实现 为什么nacos需要一致性协议 Nacos是一个需要存储数据的一个组件 为了实…

uniapp合法域名配置

首先打开微信开发者平台 找到开发管理 打开开发设置 找到服务器域名>修改 request 写入域名前缀即可 > 完成 重启小程序即可 感谢观看

瑞芯微:基于RK3568的ocr识别

光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的过程。亦即将图像中的文字进行识别&#xff0c;并以文本的形式返回。OCR的应用场景 卡片证件识别类&#xff1a;大陆、港澳…

无涯教程-JavaScript - CONFIDENCE.NORM函数

描述 CONFIDENCE.NORM函数使用正态分布返回总体平均值的置信区间。 置信区间是一个值范围。您的样本均值x位于此范围的中心,范围为xCONFIDENCE.NORM。 语法 CONFIDENCE.NORM (alpha,standard_dev,size)争论 Argument描述Required/OptionalAlpha 显着性水平,用于计算置信度…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理2. 客流预测3. 百度地图API调用4. GUI界面设计1&#xff09;手绘地图导入2&#xff09;下拉菜单设计3&#xff09;复选框设计4&#xff09;最短路径结果输出界面…

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…

数据分析与可视化项目技术参考

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1. 考核…

科目二倒车入库

调整座位和后视镜 离合踩到底大腿小腿成130-140 上半身90-100 座椅高度能看到前方全部情况 后视镜调节到能看到后门把手&#xff0c;且后门把手刚好在后视镜上方边缘、离车1/3处。 保持直线&#xff1a; 前进&#xff1a; 车仪表盘中央的原点和地面上的黄线擦边&#xff…

zookeeper可视化工具ZooInspector用法

最近在做银行的项目&#xff0c;用到了thrift&#xff0c;rpc和zookeeper&#xff0c;所有应用都是注册到zookeeper上的&#xff0c;想知道哪些应用注册上了&#xff0c;就用到ZooInspector这个可视化的工具。 1&#xff0c;下载 链接&#xff1a;https://issues.apache.org/…

关于数据权限的设计

在项目实际开发中我们不光要控制一个用户能访问哪些资源&#xff0c;还需要控制用户只能访问资源中的某部分数据。 控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC&#xff0c;但是控制用户只能访问某部分资源&#xff08;即我们常说的数据权限&#xff09;使用R…

ABB COM0011 2RAA005844A0007J编码器模块

ABB COM0011 2RAA005844A0007J 编码器模块是用于测量和反馈旋转或线性位置信息的设备&#xff0c;通常用于自动化、机器控制和运动控制系统。以下是该编码器模块可能具备的产品功能&#xff1a; 位置测量&#xff1a;ABB COM0011 2RAA005844A0007J 编码器模块的主要功能是测量旋…

【Java 基础篇】Java 线程通信详解

多线程编程在实际应用中非常常见&#xff0c;但随之而来的问题是线程之间的通信。线程通信是多线程编程中一个至关重要的概念&#xff0c;它涉及到线程之间的信息传递、同步和协作。本篇博客将详细解释Java中的线程通信&#xff0c;包括什么是线程通信、为什么需要线程通信、如…

油猴Safari浏览器辅助插件:Tampermonkey for Mac中文版

油猴脚本Tampermonkey是一款油猴Safari浏览器辅助插件&#xff0c;是一款适用于Safari用户的脚本管理&#xff0c;能够方便管理不同的脚本。虽然有些受支持的浏览器拥有原生的用户脚本支持&#xff0c;但tampermonkey油猴插件将在您的用户脚本管理方面提供更多的便利&#xff0…

uni-app 新增 微信小程序之新版隐私协议

一、manifest.json中配置 "__usePrivacyCheck__": true 二、编写封装后的组件 <template><view class"privacy" v-if"showPrivacy"><view class"content"><view class"title">隐私保护指引</…

蓝桥杯每日一题2023.9.21

蓝桥杯2021年第十二届省赛真题-异或数列 - C语言网 (dotcpp.com) 题目描述 Alice 和 Bob 正在玩一个异或数列的游戏。初始时&#xff0c;Alice 和 Bob 分别有一个整数 a 和 b&#xff0c;有一个给定的长度为 n 的公共数列 X1, X2, , Xn。 Alice 和 Bob 轮流操作&#xff0…

恢复数据库 NBU ZDLRA Backup

Duplicate of specific PDB in LOCAL UNDO for specific tablespaces using Tape/ZDLRA Backup (Doc ID 2926039.1)​编辑To Bottom In this Document Goal Solution References APPLIES TO: Oracle Database - Enterprise Edition - Version 12.2.0.1 and later Information…