Git 版本控制基本使用

1.Idea版本共计基本操作

公司使用Git作为代码版本管理工具,平时使用非常频繁这里简单整理方便后续学习查看

1.1 merge未推送回滚

我们代码merge操作后,并且没有推送到远端,本地项目发现有推送箭头,可以使用 Reset Current branch to Here… 将分支回退到merge之前。

image-20250325100530129

image-20250325100625229

注意:这是代码未推送到远端,既未push时候的操作。

1.2 merge推送到远端后回滚

我们代码如果推送到了远端,那么我们就需要强制回退了,需要使用 --force命令进行回退了,具体操作步骤如下

  • 我们首先使用 Reset Current branch to Here… ,回退时候会提示选择那种回退,我们选择 hard 类型,将本地分支代码指向要回退的提交处,并且我们这种回退需要跟其他同事沟通,因为回退会影响其他人的提交。我们 Reset 之后在项目上会发现本地版本落后远端代码,会提示可以下载远端代码。

    image-20250325100625229

    image-20250325100848651

    image-20250325101004128

  • 我们本地回退到要回退的提交点时,我们再通过git进行强制回退提交,在提交页面选择 Force push 的选项,然后进行提交,既本地代码将会覆盖远端代码,既回退操作。

    image-20250325095036582

    image-20250325100108838

    image-20250325100130528

1.3 部分代码合并

有很多时候,我们的需求可能只是修改一两个文件,或者很少的文件,修改后我们要合并到 UAT 或者 SIT 测试环境,此时我们从生产拉取的代码与生产 master 在其他文件有冲突,此时我们如果只想合并我们某一个或者几个提交,那么我们可以使用 Cherry-pick 功能进行基于commit 级别的合并,这样只会合并提交部分代码,避免了整个项目 merge 引起的冲突配置问题。具体操作如下:

  • 我们在业务分支进行代码修改,具体修改内容信息如下

    image-20250325101944646

  • 代码修改后,我们切换到要并入代码的分支

    image-20250325102033021

  • 切换之后我们点击左下角的git按钮,展示git提交目录信息,然后在左上角的搜索分支框中填入我们的业务分支索引信息既 CCMS 搜索到自己的业务分支

    image-20250325102325456

  • 双击之后,我们找到了刚刚提交的记录信息,ceshi 提交,然后我们右键选择 Cherry-pick 选项,即可检出我们的ceshi提交内容到当前分支,如果有冲突解决,没有冲突的话我们直接push 到远端即可完成代码的合并处理。

    image-20250325102532625

    image-20250325102604045

    image-20250325102646653

    image-20250325102705821

2. 客戶端基础操作

Git客戶端操作相对简单一些,我们在项目的目录打开客户端,shift + 右键,选择 git bash,可以观察当前项目是什么分支,然后可以使用客户端进行操作

image-20250325103105316

2.1 版本回退

使用命令行窗口我们同样可以实现代码版本操作,具体操作实现如下

  • 我们可以使用git logs,查看当前branch 的git 操作日志,从而获取我们的 commit id 信息,此处我们可以看到 ceshi 提交的版本信息

    git log
    

image-20250325104120528

  • 我们要回滚 ceshi 版本信息,那么我们就要获取测试之前的最后一版 commt id , 既 88f5559dcca3b243bb65b488c8cd0af82fe15965
    image-20250325104429309

  • 有了提交id之后,我们需要进行本地回滚操作既使用 git reset --hard commit-id 命令,执行之后,在 Idea中观察代码,发现分支也进行了本地回退。

    git reset --hard commit-id
    

    image-20250325104622583
    image-20250325104953085

  • 之后执行强制提交,执行命令 git push origin your-branch-name --force,执行此代码将本地回滚内容强制推送到远端服务中,出现如下提示既远端代码回滚推送成功

    git push origin your-branch --force
    

image-20250325105344081

2.2 代码合并追踪

我们有时候会发现,有一些代码不应该出现在一个分支上,比如我有一个分支 branch-A,修改了部分内容,进行了提交commit-A,然后合并到了 sit 上,那么我们的修改 commit-A 记录应该出现在 branch-Asit 上面,但是现在发现我们的 uat 分支也出现了 commit-A 修改的代码,那么这个代码就是被人错误的合并到了自己分支然后推送到 uat分支,要么就是被人直接错误合并到 uat 分支。

那么我们应该如何查找到底是谁如何操作到 uat 分支上呢,如果是有人将代码合并到自己分支,然后再将代码 mergeuat ,那么我们找到此人自己分支观察git 提交记录即可,如果是直接合并到 uat ,那么直接观察 uat 分支即可

  • 我们首先要更新自己本地所有git引用信息

    # --all 获取所有远程仓库的最新引用
    # --prune 自动清理已删除的远程分支引用
    git fetch --all --prune
    
  • 我们首先找到对应的代码信息,比如为 WorkFlowJumpServiceImpl 类的 156行到176行信息为错误信息,那么我们在同目录中打开git窗口

    image-20250325110100179

    image-20250325110123259

    image-20250325110151023

  • 之后我们执行命令 git blame WorkFlowJumpServiceImpl.java -L 156,176 ,此时我们可以看到每行的 commit id

    git blame yourClass.java -L rowNumA,rowNumB
    

    image-20250325110333107

  • 之后我们需要确定哪些分支拥有这些 commit-id,此处为举例,正常新的业务应该只有 自己新增分支,合并测试分支 两个分支包含此提交,其他分支应该没有,如果有则证明该分支有人误操作合并此代码到此分支,此处我们找到对应分支查找提交记录即可,就可以知道代码是如何被提交到错误分支的,我们使用命令 git branch --contains commitId 即可观察哪些分支包含此提交

    # -a 参数显示本地 + 远程分支
    git branch -a --contains commitId
    

    image-20250325111439052

  • 找到包含的 分支 后,切换到问题分支,查看 git 操作记录,了解代码是如何添加到错误分支的,此处我们使用idea进行查看更加方便,此处为查询是否有uat代码合并到了业务分支。

    image-20250325151419681

2.3 生产Tag回退

我们在完整推送后端代码后需要新增一个记录Tag标签,标注此次上线内容,此Tag标签会作为回滚的标记点,作为未来回退版本依据。注意Tag不是一个brunch分支,只是一个当前提交点的一个镜像,Tag 不会随着 git commit 自动更新,它是静态的。Tag 通常用于标识“稳定版本”,例如软件发布的版本号。方便回溯版本。

我们只对master做Tag标记,具体格式为VyyyyMMdd.两位序列号 eg: master-V20250630.01

image-20250630141724912

填写此次上线的具体上线内容描述,之后会作为回滚的依据条件,方便后续回滚了解回滚详情

image-20250630141821401

新增Tag完毕之后的效果如下:

image-20250630142829089

如果上线发现需要回退,那么我们首先获取需要回退tag的最后提交commit-id,根据commit-id进行回退,我们可以使用如下命令获取commit-id

# --all 获取所有远程仓库的最新引用
# --prune 自动清理已删除的远程分支引用
git fetch --all --prune
# 展示信息
git show master-V20250630.01
# 或者
git rev-parse master-V20250630.01^{commit}

image-20250630142105016

之后我们切换分支到master,然后进行回退rollback操作,最后推送修改后master代码到远端即可

# 切换为master分支
git checkout master#  强制回退
git reset --hard 80a291da28650d62a48566942ae08a85eb2c6402# 推送到远端
git push origin master --force

注意:如果我们回退版本不确定,我们可以使用模糊命令查看Tag注释信息,可以快速定为到需要找到的版本Tag进行回滚

# 查找 master-V2025 开头的Tag信息 
git tag -l "master-V2025*" | xargs -I {} git show {}

image-20250703170009865

2.4 其他操作

如果我们在Cherry-pick 操作过程中,已经Cherry-pick完毕了,但是代码没有进行push 操作,发现选错了分支,那么我们可以使用 git cherry-pick --abort命令来取消Cherry-pick操作。

git cherry-pick --abort

同样的我们 merge操作发现选错了分支,并且没有push到远端,同样可以使用 git merge --abort 命令或者使用 idea 选择 git merge abort 操作进行回退

git merge --abort

image-20250325111909259

2.5 git命令总结

--------------------------------------简单提交--------------------------------------
git add .
git commit -m 'commit message'
git push origin 'your brunch name'
--------------------------------------删除分支--------------------------------------
# 删除分支
git branch -d your-branch
# 如果该分支有未合并的更改,Git 会提示错误。若仍想强制删除该分支,可以使用 -D 参数:
git branch -D your-branch
# 推送删除到远程仓库
git push origin --delete your-branch--------------------------------------分支改名--------------------------------------
# 重命名分支
git branch -m SIT2-RULE-20250805-基础拖拽规则提取-lxc# 推送新分支并设置上游
git push origin -u SIT2-RULE-20250805-基础拖拽规则提取-lxc# 删除旧分支
git push origin --delete SIT2_NEW--------------------------------------代码回滚--------------------------------------
# 查看提交历史,找到上一个版本的commit_ID
git log# 切换到你想要回退的分支
git checkout your-branch# 将分支回退重置到commit-id版本
git reset --hard commit-id
git reset --hard 241d20a0d94090f97244a7f51cb69eee683ae5d8# 强制推送到远端仓库
git push origin your-branch-name --force--------------------------------------取消操作--------------------------------------
# pick 取消
git cherry-pick --abort# merge 取消
git merge --abort--------------------------------------代码合并追踪--------------------------------------
git blame youClass.java -L rowNumA,rowNumB
git branch --contains commitId--------------------------------------代码版本Tag管理--------------------------------------
# --all 获取所有远程仓库的最新引用
# --prune 自动清理已删除的远程分支引用
git fetch --all --prune# 项目发布后需要新增一个 tag, 格式为VyyyyMMdd.序列号 eg: master-V20250630.01,后续版本回滚依赖此Tag信息# 回滚操作获取tag分支最后提交的commit-id eg: 80a291da28650d62a48566942ae08a85eb2c6402
git rev-parse master-V20250630.01^{commit}
# 或者使用
git show master-V20250630.01# 切换为master分支
git checkout master#  强制回退
git reset --hard 80a291da28650d62a48566942ae08a85eb2c6402# 推送到远端
git push origin master --force# 删除标签,先删除本地然后删除远端
git tag -d master-20250627-image-tag
git push origin --delete tag master-20250627-image-tag# 模糊查询Tag注释信息
git tag -l "master-V2025*" | xargs -I {} git show {}

3. GitLab代码加解密

我们有这样一个需求,就是我们需要使用外围服务的gitlab进行代码开发,代码是公司的知识产权,我们不想外围获取我们的代码源码信息,那么我们就是需要将GitLab代码进行加密处理,此处简单记录一下方便后续使用。

我们使用的工具是 git-crypt 对提交的文件进行可配置化的加密解密,git-crypt 是一款开源的 Git 仓库加密工具,主要用于对敏感文件进行透明加密,确保只有持有密钥的用户才能访问加密内容,同时不影响非加密文件的正常读写。具体的操作步骤如下:

3.1 基础环境

我们需要准备Git环境,我将Git安装在了D盘的目录下,之后我们需要下载 git-crypt,并且将exe文件放置到Git的cmd目录中,下载地址在此

image-20250903092747522

下载后放置到我们的Git对应cmd目录中

image-20250903092919374

之后,我们下载我们 GitLab 测试的项目 git-crypt 到本地,导入到idea中

image-20250903093237301

3.2 准备git-crypt环境

我们打开GitBash,进入到导入项目的工作目录,执行初始化命令,因为我已经执行过一次所以有以下提示

# 初始化git-crypt
git-crypt init

image-20250903093516260

初始化之后我们要设置加密文件到本地磁盘中,协同开发的时候,该文件需要共享到他人,一定要需要保存好,具体操作如下

# 生成文件keyFile 到D:\crypt-key-file\ 目录中
git-crypt export-key /d/crypt-key-file/keyFile

image-20250903093825872

生成秘钥文件之后,我们需要设定具体哪些文件需要进行加密解密,此处我们需要在项目根目录生成一个 .gitattributes 文件,里面配置具体哪些文件需要进行加解密,语法为 : 文件名或文件范围 filter=git-crypt diff=git-crypt 配置规则示例如下所示:

# 将特定目录下 .java结尾文件加解密
src/main/java/cn/git/crypt/**/*.java filter=git-crypt diff=git-crypt
# 将Git开头文件加解密
Git* filter=git-crypt diff=git-crypt
# 将Git目录下所有文件加解密
Git/** filter=git-crypt diff=git-crypt

此处我们选择的配置为只加密固定目录下的全部java文件,项目目录如下所示

src/main/java/cn/git/crypt/**/*.java filter=git-crypt diff=git-crypt

image-20250903094458728

3.3 代码加密提交

环境设置好后,我们现在修改代码进行提交,观察一下代码在git环境是否已经进行加密。我们修改了三个文件两个在crypt目录下(既配置加密的目录),Test文件没有在目录下

image-20250903094838592

我们执行 git-crypt status / git-crypt status -f 命令可以看到哪些文件提交会被加密,哪些不会。

注意:只有在文件被修改并重新添加到暂存区时,才会被git-crypt status 命令扫描。

# 我们使用git-crypt status即可
# git-crypt status -f
git-crypt status

git-crypt status -f 与 git-crypt status 的区别

  • git-crypt status:显示详细的状态信息,列出所有受管理的文件及其当前状态(加密/解密),提供更完整的输出信息。

  • git-crypt status -f:

    -f 参数表示 “fast” 或 “force” 模式,提供更简洁的输出,通常只显示文件列表。执行速度更快,不进行详细的状态检查,主要用于快速查看哪些文件被 git-crypt 管理。

执行效果如下:

image-20250903095653277

之后我们提交修改代码到远程服务

image-20250903095811360

3.4 查看GitLab

我们登录我们GitLab账号,进入到加密项目对应文件中查看三个修改文件,具体结果如下,发现配置的目录下两个文件都已经加密,Test文件未加密

image-20250903100041099

image-20250903100112162

image-20250903100129135

3.5 GitLab代码解密

首先需要解密的电脑上同样需要安装Git工具以及git-crypt工具,安装步骤与加密步骤一致。同时解密需要使用我们之前的加密秘钥文件 keyFile,我们先将GitLab中的加密项目克隆到本地

image-20250903100511417

image-20250903100614366

然后进入到克隆的git-crypt 项目中,发现文件被加密了

image-20250903100803833

之后我们需要进入到仓库根目录,执行解密操作

# 注意 后面的目录修改成自己放置keyFile文件的目录地址
git-crypt unlock /d/crypt-key-file/keyFile

image-20250903101145357

执行后我们再查看代码部分,文件成功解密成功

image-20250903101229587

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

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

相关文章

Spring Boot 与前端文件下载问题:大文件、断点续传与安全校验

前言在企业级 Spring Boot 项目中,文件下载 是非常常见的功能场景:用户下载报表、合同、发票 PDF下载图片、音视频资源系统导出大规模 Excel/CSV 数据然而,很多开发者在实现文件下载时,会遇到 下载失败、文件损坏、性能瓶颈、断点…

主板硬件研发基础--HDMI工作原理

HDMI 接口 技术原理:HDMI 接口采用 TMDS 技术传输数字信号,不仅可以传输高清视频信号,还能同时传输多声道音频信号。它支持 EDID 和 DDC2B,设备之间能够自动协商并选择最合适的视频 / 音频格式,实现 “即插即用” 功能。 接口类型:常见的有标准 HDMI 接口、Mini-HDMI 接口…

`Object.groupBy`将数组中的数据分到对象中

Object.groupBy 将一个对象或者数组的元素按照规则分组, 返回一个新对象, Object.groupBy(items, callbackFn) items:要分组的对象或数组(通常是数组)。 callbackFn(element, index, array):回调函数&#…

反序列化漏洞详解

用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技…

SQL数据分析原代码--创建表与简单查询

CREATE TABLE:创建表,定义字段名、类型、注释INSERT INTO:插入数据,支持单条或批量插入SELECT:查询数据,*表示所有字段,AS可起别名,DISTINCT去重WHERE:条件筛选&#xff…

k8s查询ServiceAccount有没有列出 nodes 的权限

要检查 ServiceAccount xxxxxx:default 是否具有列出 nodes 的权限,可以使用以下方法:1. **使用 kubectl auth can-i 命令**这是最直接的方法,可以检查特定用户或 ServiceAccount 是否具有特定权限:kubectl auth can-i list nodes…

调试Python程序时,控制台一直打印SharedMemory read faild

from tkinter import filedialog filedialog.askopenfilename()在使用 tkinter 时,只要一处罚,控制台就不停打印 SharedMemory read faild ,虽然能用,但是大大的破坏了调试体验,看到如下的提示,你说烦不烦&…

QRCode React 完全指南:现代化二维码生成解决方案

前言 在数字化时代,二维码已经成为连接线上线下的重要桥梁。无论是分享链接、支付码、还是身份验证,二维码都扮演着不可或缺的角色。qrcode.react 是一个专门为 React 应用设计的二维码生成库,它能够快速、灵活地生成各种样式的二维码&#…

xxe外部实体注入漏洞

https://owasp.org/www-project-top-ten XXE基础 xxe外部实体注入 外部实体 xml(用于传输和存储数据) html(用于显示数据) 注入: SQL注入:用户输入数据被当做代码执行 1输入点 2.输入数据可以结合到数据库…

ros2获取topic信息解析

ros2 ros_discovery_info topic 发布逻辑疑问: 在运行ros2 topic info -v /topic时,运行的是p3,如何与p1进程通讯的呢? 进程间理论上应该是IPC

FFmpeg合成mp4

本章主要介绍如何使用FFmpeg来将一个音频文件和一个视频文件合成一个MP4文件,以及在这个过程中我们如何对编码过程进行封装以及sample_rate 重采样的过程(由于提供的音频文件的编码类型为S16,所以我们需要转化为MP4支持的FLTP浮点类型&#x…

第十九章 使用LAMP架构部署动态网站环境

第十九章 使用LAMP架构部署动态网站环境 文章目录第十九章 使用LAMP架构部署动态网站环境一、安装Httpd服务1、安装httpd服务2、启动httpd服务3、设置允许通过防火墙4、验证http服务是否成功二、安装Mariadb服务1、安装Mariadb服务2、启动Mariadb服务三、安装PHP服务1、列出可用…

Selenium应用中的核心JavaScript操作技巧

Selenium是一款强大的浏览器自动化测试工具,其操作浏览器的能力部分来自于其内嵌的JavaScript执行引擎。这使得Selenium不仅能够模拟用户在浏览器中的各种操作,还能执行复杂的JavaScript脚本,以实现更为精细的控制。本文将探讨如何通过Seleni…

《Linux 基础指令实战:新手入门的命令行操作核心教程(第一篇)》

前引:当你第一次面对 Linux 系统中那片闪烁着光标、只有黑白字符的终端界面时,或许会和很多初学者一样感到些许茫然:这些由字母和符号组成的 “指令” 究竟该如何输入?它们又能完成哪些神奇的操作?其实,Lin…

03.【Linux系统编程】基础开发工具1(yum软件安装、vim编辑器、编辑器gcc/g++)

目录 1. 软件包管理器 1.1 什么是软件包 1.2 Linux软件生态 1.3 yum具体操作 1.3.1 查看软件包 1.3.2 安装软件 1.3.3 卸载软件 1.3.4 注意事项(测试网络) 1.3.5 yum指令集总结 1.4 yum源目录、安装源 2. Vim编辑器的使用 2.1 Linux编辑器-vim使用 2.2 vim的基本概…

3DMAX自动材质开关插件AutoMaterial安装和使用方法

3DMAX自动材质开关AutoMaterial,是一个3dMax脚本插件,它根据材质编辑器中当前活动的材质自动将材质应用于3dMax中新创建的对象,也适用于您复制的没有材质的对象。它作为一个开关,可以绑定到按钮或菜单来打开和关闭它。该工具的创建…

Linux内核调优实战指南

内核调优通常通过修改内核运行时参数来实现,这些参数的配置文件是 Linux 系统中核心的性能调整点。 内核调优配置文件名称 /etc/sysctl.conf: 这是最传统和主要的内核参数配置文件。系统启动时或手动执行 sysctl -p 命令时会读取并应用其中的设置。/etc/sysctl.d/*.…

Java基础常见知识点

Java 中 和 equals() 的区别详解_java中与equals的区别及理解-CSDN博客https://blog.csdn.net/m0_64432106/article/details/142026852深入理解Java中方法的参数传递机制 - 悟小天 - 博客园https://www.cnblogs.com/sum-41/p/10799555.html浮点型精度是什么意思?为…

OD C卷 -【高效货运】

文章目录高效货运高效货运 货车的额定载货量为wt;货物A单件重量为wa,单件运费利润为pa;货物B单件重量wb,单件运费利润为pb;每次出车必须包含A、B货物,且单件货物都不可分割,总重量达到额定的载货量wt;每次出车能够获取…

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据 1. 手动解压并读取文件内容 file_path <- “K:/download/geo/raw_data/GEO/GSE32967_series_matrix.txt.gz” 使用latin1编码读取文件所有行 con <- gzfile(file_path, “r”) all_…