简单的GIT操作学习记录

发布于:2025-09-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到