Git那些事系列:从业务场景到高级技巧的完整指南(三)

news2025/4/18 10:44:21

文件修改的记录居然没有了!!!

如何隐蔽的把一次修改记录搞丢!

大家好,有到了Git那些事系列了,近期笔者遇到了一个十分奇怪的事情,一个Git仓库的文件被莫名其妙的修改了,问题是,一点修改记录都没有!!!经过仔细的溯源,终于发现原来Git对文件的记录也不是万能,这里做个沉淀,供大家参考

配置文件被异常修改了

在一个岁月静好的一天,笔者使用一个开发分支测试环境做编包和部署,发布的时候突然报错,查看原因是某个配置文件异常,一些部署相关代码被删除了!
当然,这件事情看起来很离谱
但在多人频繁开发的项目团队
也很正常!

在这里插入图片描述

那就查查到底哪次提交修改了?

,顺便问问修改的同学,删除的背景是啥
然后!
居然没有找到该配置代码修改记录!!!
只找到两次该文件异常的修改记录
在这里插入图片描述
如上如所示,在下面红框这里,需要的配置代码还在,但在上面红框里面,配置代码已经没有了
同时,除了这两个红框的提交,中间的提交并没有对该配置代码所在的配置文件进行修改
然而,在上面的红框里面,没有该配置代码的修改变更记录
在这里插入图片描述
也就是说,这个文件的部分代码的变更

在某次提交的后,该文件的部分代码突然被删了,且修改记录没这部分代码

**
在这里插入图片描述
难道是Git的BUG?

到底什么时候会导致Git记录丢失呢?

第一种可能:文件删除后又重新进行添加

因为Git对文件的跟踪是连续的,当删除之后再次添加就会导致Git对该文件的跟踪失效,在这里的场景下,虽然,该文件的部分代码丢失没有记录,但该文件的另一部分修改被记录了(下图),所以,Git对整个文件的跟踪并没有丢失,所以并不是一个删除后又添加的场景
在这里插入图片描述

第二种可能:本地的修改未及时提交,导致被覆盖

这里就是本地的多次修改没有逐项提交,或者完整提交,导致中间部分修改没有修改记录,但在这里中间的修改记录指的是本地的修改记录。对于远端的提交记录来说,它们是连续的。所以也不是这种情况

第三种可能:Git reset强制修改

这是一个相对常用的一个命令,
git reset [--soft | --mixed | --hard] [HEAD]
简单做下介绍:

git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本

这里比较有意思的是三个参数:
hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
soft:重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
mixed:(默认)重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
如图所示:
在这里插入图片描述
这篇文章写的比较好:Git Reset 三种模式

使用场景:

hard:1.要放弃目前本地的所有改变時 2.真的想抛弃目标节点后的所有commit
soft:想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(比如解一个BUG的前前后后的提交,这里如果分支合并的场景用checkout – path效果一样)
mixed:(默认)那些提交还想好好看看,留一些,删一些,改一些,总之就是不确定的情况

**

当然,这个场景并不是无痕的,可以通过git reflog来查看Head或者分支的变化

下面是一个示例:

假设你的 Git 仓库有以下提交历史:

commit 1234567 (HEAD -> master)
Author: John Doe <johndoe@example.com>
Date:   Mon Jul 26 14:00:00 2021 -0500

    Add new feature

commit abcdefg
Author: John Doe <johndoe@example.com>
Date:   Fri Jul 23 10:00:00 2021 -0500

    Update README.md

commit 9876543
Author: John Doe <johndoe@example.com>
Date:   Wed Jul 21 16:00:00 2021 -0500

    Initial commit

现在你想回退到上一个提交,使用以下命令:

$ git reset HEAD~1

现在你的提交历史变成了这样:

commit abcdefg (HEAD -> master)
Author: John Doe <johndoe@example.com>
Date:   Fri Jul 23 10:00:00 2021 -0500

    Update README.md

commit 9876543
Author: John Doe <johndoe@example.com>
Date:   Wed Jul 21 16:00:00 2021 -0500

    Initial commit

然后你可以使用 git reflog 命令查看提交历史的变化:

$ git reflog
1234567 HEAD@{0}: reset: moving to HEAD~1
abcdefg HEAD@{1}: commit: Update README.md
9876543 HEAD@{2}: commit (initial): Initial commit

在这个示例中,git reflog 显示了 HEAD@{0},它是你最近的操作,即使用 git reset 回退到上一个提交。 HEAD@{1} 是回退之前的提交,即 abcdefg。

回到问题本身在笔者遇到的这个场景下,并没有发现异常的Git reset的操作
在这里插入图片描述

git reset HEAD是用来重置暂存区和工作区的,并没有重置HEAD

第四种可能:force push强制修改

git push --force origin master
这个也是一个偶尔会用到的命令,一般用来填坑,就是把本地的强制覆盖到远端,而远端的一些修改记录(本地没有的修改记录)就没有了,这样也会导致某个文件的修改记录不完善

当然,这个场景也不是无痕的,可以通过git reflog来查看

例如,假设你在本地仓库中执行了以下操作:

$ git add main.js
$ git commit -m "Add new feature"
$ git push --force

然后,你执行了 git reflog 命令,可以看到类似以下的输出:

$ git reflog
7b1c3f9 (HEAD -> master) HEAD@{0}: push: forced-update
a3b2e8d HEAD@{1}: commit: Add new feature

回到这个问题,根据上一章的截图,也没有看到push --force的操作在这里插入图片描述

第五种可能:Merge的脏提交

代码合并是一个老生常谈的点,也是绝大部分出现问题的根因

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
    [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
    [--[no-]allow-unrelated-histories]
    [--[no-]rerere-autoupdate] [-m <msg>] [<commit>…​]
git merge --abort
git merge --continue

这里的-s,和-X都是一个策略,具体可以参考:Git 合并策略选项和示例

同时,由于Merge中,可能会有冲突,这就导致在这个中间状态如果增加了一部分额外的修改,并不会被记录进来,而且如果额外的修改就在这个冲突的文件里面的话,确实可能会出现,文件有修改记录,但额外代码没有修改记录

针对这次问题,会不会是这个原因呢?

首先,git的操作是比较复杂的,仅仅是看git log是看不出来的。如果要查看这种无记录的修改,得分析下每次push产生的最新版本里,文件是否已经被改坏,从而查到是哪次push有问题

git show abc123:xxx.go

这里的push比较多,而且是多分支的,所以排查起来会比较慢

这里有两种情况
1.某次合并时,两个父节点,一个父节点对问题代码有删除,一个父节点对问题代码没有删除
在这里插入图片描述
这种一般是正常的合并

2.某次合并时,两个父节点,两个父节点对问题代码都没有修改,但合并后却删除了,那问题就在这里了在这里插入图片描述
经过笔者多分支一次一次push的回溯,终于找到了这个疑似的合并
本地复现一下:
git checkout 93f13bqqa1 && git merge 8f9c013f8e
在这里插入图片描述
发现该文件确实需要解冲突,但丢失的代码其实不在解决冲突的范围内

那在解冲突的时候,顺手把丢失的代码删除下,是不是就没有记录了?
在这里插入图片描述
解完冲突后,git add和git commit之后,发现删除的diff确实没有了:
在这里插入图片描述
在这里插入图片描述

看来是合并的时候,解决冲突的时候误删了一些代码
好吧

问题解决

这里给出的经验:
1.合并是一个容易出问题的地方
2.合并的冲突解决是一个容易出问题的地方
3.避免冲突的方案是分支快拉快合,避免分支长时间不合入(一周以上)
4.每次合并不要进行大量代码修改,每次拉分支只做一件事
5.每一次记录的修改都能找到问题的点,只是比较麻烦。。。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1、SpringBoot_快速入门

一、SpringBoot 概述 文档下载地址&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/ 1.SpringBoot介绍 概述&#xff1a;SpringBoot 开发团队认为Spring操作太繁琐了&#xff0c;目的在于简化开发配置&#xff0c;能够快速搭建开发环境&#xff0c;…

25422-2010 草地潜松犁 阅读笔记

声明 本文是学习GB-T 25422-2010 草地潜松犁. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了草地潜松犁(以下简称潜松犁)的技术要求、试验方法、检验规则、标志、包装与贮存。 本标准适用于在草地上进行不翻垡松土、切根等项作…

RK3588 VDD_CPU_BIG0/1 电源PCB设计注意事项

RK3588 VDD_CPU_BIG0/1 电源PCB设计 1、如图1所示的滤波电容&#xff0c;原理图上靠近 RK3588的VDD_CPU_BIG电源管脚绿线以内的去耦电容务必放在对应的电源管脚背面&#xff0c;电容GND PAD尽量靠近芯片中心的GND管脚放置&#xff0c;如图2所示。其余的去耦电容尽量摆放在3588…

python学习--特殊方法和属性

名称描述特殊属性dict获得类对象或实例对象所绑定的所有属性和方法的字典特殊方法len()通过重写_len_()方法&#xff0c;让内置函数len()的参数可以是自定义的类型特殊方法add()通过重写_add_()方式&#xff0c;&#xff0c;可使自定义对象有‘’的功能特殊方法new()用于创建对…

overleaf杂谈-Springer文献格式问题

目录 overleaf写作问题记录1.Latex中的%问题&#xff08;文本变成灰色&#xff09;2.Springer文献格式问题2.1 新建reference.bib2.2 谷歌学术搜索文章并引用2.3 复制BibTex2.4 复制进reference.bib2.5 在sn-article.tex的\end{document}前添加语句2.6 引用文献2.7 Springer模板…

视频下载器助手:如何把微信视频号的视频下载下来

随着移动互联网的飞速发展&#xff0c;短视频已深入人心&#xff0c;成为我们生活中不可或缺的一部分。我们常常在各种社交平台上发现有趣、有价值的视频内容&#xff0c;但不知道如何把微信视频号的视频下载下来并保存到本地手机相册 今天&#xff0c;我为大家带来了一款实用…

C语言每日一题(11):杨辉三角

文章主题&#xff1a;求两个数二进制中不同位的个数&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&a…

SAP ABAP端实现解析具有深层结构的文件内容(类似SAP PO中的FCC功能)

前言 日本项目经常需要通过PI或者CPI去解析一些文件内容&#xff0c;如果只是扁平结构的&#xff0c;不涉及头行结构的话&#xff0c;在PI中可以FCC&#xff08;File Content Conversion&#xff09;进行解析转换&#xff0c;在CPI中可以使用groovy脚本进行解析转换&#xff0…

如何试用 Vectorizer.AI 将位图转换为矢量图

Vectorizer.AI 是一个使用人工智能技术将位图转换为矢量图的在线工具。它支持 JPEG、PNG、BMP 和 GIF 格式的位图&#xff0c;最大像素为 2 万像素&#xff0c;最大文件大小为 30 MB。Vectorizer.AI 目前处于测试阶段&#xff0c;完全免费使用。 要试用 Vectorizer.AI&#xf…

【微服务】spring 控制bean加载顺序使用详解

目录 一、前言 二、使用order注解控制顺序 2.1 order 注解使用示例 2.2 order注解顺序失效问题 2.2.1 order失效问题解决办法 2.3 实现Ordered接口 三、使用dependon注解控制顺序 四、AutoConfiguration注解控制bean加载顺序 4.1 AutoConfigureBefore 操作演示 4.2 A…

进程与线程的记忆方法

有很多人经常会分不清进程与线程的关系&#xff0c; 嗯。。。。。。可能只有我自己记不清吧 举个例子&#xff1a; 进程&#xff1a;登录一个qq号&#xff0c;就是一个进程。 线程&#xff1a;同时打开多个窗口聊天&#xff0c;就是多个线程。 每次记忆完&#xff0c;过了一段…

Python函数绘图与高等代数互融实例(六): 条形图|直方图|饼状图|并列柱状图

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…

SQLAlchemy中filter函数的使用

目录 filter过滤数据 方法及使用示例 基本过滤 多个条件的过滤 模糊查询 IN查询 空值和非空值 代码演示 代码刨析 filter过滤数据 在SQLAlchemy中&#xff0c;filter 方法用于在查询中对数据进行过滤&#xff0c;以获取符合特定条件的记录。这方法允许你构建 SQL 查询中…

LeetCode-热题100-笔记-day32

二分查找 今日刷到二分查找&#xff0c;以前做过的题忘的一干二净&#xff1b;庆幸自己用新的方法做了出来两道“中等”题&#xff1b;&#xff08;我都能做出来我认为应该标“简单”&#xff09;由于之前题的难度基本在抄答案&#xff0c;所以停更几天。今天没抄答案就更新一…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…

asisctf 2023 web hello wp

hello 开题&#xff0c;直接给了源码。 <?php /* Read /next.txt Hint for beginners: read curls manpage. */ highlight_file(__FILE__); $url file:///hi.txt; if(array_key_exists(x, $_GET) &&!str_contains(strtolower($_GET[x]),file) && !str_c…

节日灯饰灯串灯出口欧洲CE认证办理

灯串&#xff08;灯带&#xff09;&#xff0c;这个产品的形状就象一根带子一样&#xff0c;再加上产品的主要原件就是LED&#xff0c;因此叫做灯串或者灯带。2022年&#xff0c;我国灯具及相关配件产品出口总额超过460亿美元。其中北美是最大的出口市场。其次是欧洲市场&#…

ICML 2017: 基于卷积的Seq2Seq解决方案

一.文章概述 通常而言&#xff0c;Seq2Seq解决方案一般都采用循环神经网络&#xff0c;但在本文&#xff0c;作者提出了基于卷积神经网络的解决方案ConvS2S。基于卷积神经网络的方案有两大优势&#xff1a;计算并行化更高&#xff0c;优化更容易&#xff08;非线性的数量是固定…

AndroidStudio无法查看Compose重组次数?

印象中是一开始使用AndroidStudio LayoutInspector想查看Compose重组次数的时候&#xff0c;一开始折腾了下后来忘了这茬事了&#xff0c;最近&#x1fa9c;到期了&#xff0c;家里又换了台新的mac mini又看到这个问题&#x1f60a;&#xff0c;就想着给大家整理了一下解决方法…

Python+requests+unittest+excel实现接口自动化测试框架

一、框架结构&#xff1a; 工程目录 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if heade…