【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

一份值得收藏的 Git 异常处理清单

  • 2021-03-31
  • 本文字数:3214 字

    阅读完需:约 11 分钟

一份值得收藏的 Git 异常处理清单

前言


Git 作为一种分布式版本控制系统已经成为现在开发的宠儿,不仅应用在前端、后端、客户端等开发场景中,也成为各行业互联网企业分工协作的必备技能之一。


大家在使用过程中总会碰到这样那样的问题,本文主要针对以下经常发生的几种异常情况提供一些解决方案:


  1. 本地工作区文件恢复

  2. 远程分支删除后,删除本地分支与其关联

  3. 修改提交时的备注内容

  4. 修改分支名,实现无缝衔接

  5. 撤回提交

  6. 撤销本地分支合并

  7. 恢复误删的本地分支

  8. 不确定哪个分支有自己提交的 commit


(一)本地工作区文件恢复


大家都知道,一个文件夹中的文件如果被删掉了,那只有在垃圾箱里面找了。如果垃圾箱里面的也被删掉了,以笔者的常识在不借助工具的情况下怕是就找不到了,emmmm。。。


不过,关联了 Git 的文件和文件夹就不一样了,有了本地仓库和远程仓库的双重保护,找到一个被删除的文件也不过就分分钟,一个命令行的事情吧。


语法git checkout <filename/dirname>

命令git checkout 1.js


这一命令主要用于本地工作区文件的撤回,下图是一个工作区文件被删除后的完美恢复过程。



(二)远程分支删除后,删除本地分支及关联


为方便分支提交,一般情况下会用本地命令 git branch --set-upstream-to=origin/master master  建立本地分支与远程分支的关联,从 master 拉出的分支可以自动建立与远程已有分支的关联,这样可以很方便的使用 git pull  和  git push 拉取远程分支的代码和将本地分支提交到远程。


Git 远程分支删除之后,本地分支就无法成功推送到远程,想要重新建立与远程仓库的关联,就需要先删除其原本的与已删除的远程分支的关联。


如下图所示,需要删除的远程分支为 feature/test,使用 git push origin --delete feature/test 删除掉对应的远程分支之后,删除本地分支关联。



语法git branch --unset-upstream <branchname>

命令git branch --unset-upstream feature/test


删除掉关联关系之后,用 git branch -vv  命令可查看到本地分支与远程分支的关联关系如下图所示,可观察到 feature/test 分支已经没有关联的远程分支了。



(三)修改提交时的备注内容


平时提交代码很多时候因为军情紧急,会在刚提交的时候填写了自己不太满意的备注,但笔者本人有点强迫症,一定要把它改成想要的样子咋办。。。。,不要慌,还是有解决办法滴!


想要修改最近一次提交的“修改 xxx 功能”的备注:



语法git commit --amend

命令git commit --amend



使用 git log --pretty=oneline 查看内容,发现已经成功修改啦。需要注意的是此项命令会修改提交时的 commit-id,即会覆盖原本的提交,需要谨慎操作


(四)修改分支名,实现无缝衔接


开发中的大佬都是拥有极快手速的人,建了个分支一不小心打错了某个字母或者两个字母打反了,可能就与本意存在较大误差了,Git 提供一种已经拉取了分支,在上面开发了不少的内容,但后来发现原本拉的分支名字就有问题的修复方法。


例如,我们的想新建的分支名为 feature/story-13711,却写成了  feature/stor-13711:


语法git branch -m <oldbranch> <newbranch>

命令git branch -m feature/stor-13711 feature/story-13711



执行完之后发现文件的工作区已修改内容一点都没有变化,真正的实现了无痛过渡,皆大欢喜!


(五)撤回提交


日常工作中,可能由于需求变更、或者误操作等原因需要进行提交的撤回:


如下分析了各种原因撤销的场景,主要包括:


  • 已将更改交到本地存储,需要撤回提交

  • 用新的提交内容替换上一次的提交

  • 本地提交了错误的文件


已将更改提交到本地,需要撤回提交


语法git reset --soft [<commit-id>/HEAD~n>]

命令git reset --soft HEAD~1


命令执行完成后,查看文件变更记录,可发现如下图所示:



文件变更记录与未提交之前的文件变更记录是一致的,只是撤销了 commit 的操作。


用新的更改替换撤回的更改


提交之中可能有些地方需要优化,我们可以撤销本次的 commit 以及文件暂存状态,修改之后再重新添加到暂存区进行提交。


语法git reset --mixed [<commit-id>/HEAD~n>]

命令git reset --mixed HEAD~1


命令执行完成后,查看文件变更记录,可发现如下图所示:



已变更的文件都未添加到暂存区,撤销了 commit 和 add 的操作。


本地提交了错误的文件


本地将完全错误的,本不应提交的内容提交到了仓库,需要进行撤销,可以使用 --hard 参数


语法git reset --hard [<commit-id>/HEAD~n>]

命令git reset --hard HEAD~1


命令执行完成后,查看文件变更记录,可发现如下图所示:



已追踪文件的变更内容都消失了,撤销了 commit 和 add 的操作,同时撤销了本地已追踪内容的修改;未追踪的内容不会被改变。从上面的效果可以看到,文件的修改都会被撤销。-hard  参数需要谨慎使用


(六)撤销本地分支合并


实际操作中,总会有很多的干扰,导致我们合并了并不该合并的分支到目标分支上。解决这种问题的方式有两种,git reset 和 git revert。reset 的语法和命令之前已经介绍过,不做赘述, revert 的语法和命令和 reset 一致。但是产生的实际效果会有不同。


可以先来看下 revert 操作的实际效果,合并分支之后的效果如下图所示:



撤销合并:


语法git revert <commit-id>

命令git revert 700920


下图为执行命令后的效果:



经过前后对比可知,revert 执行之后会在原本的记录中新增一条提交记录。


reset 如上 “本地文件撤销” 例子所述,会删除掉原本已有的提交记录,在合并分支中,会删除原本合并分支的记录。revert 则有不同,会保留原本合并分支的记录,并在其上新增一条提交记录,便于之后有需要仍然能够回溯到 revert 之前的状态。


从需要提交到远程分支的角度来讲,reset 能够“毁尸灭迹”,不让别人发现我们曾经错误的合并过分支(注:多人协作中,需要谨慎使用);revert 则会将合并分支和撤回记录一并显示在远程提交记录上。


(七)恢复误删的本地分支


本地分支拉取之后,由于疏忽被删除,而且本地的分支并没有被同步到远程分支上,此时想要恢复本地分支。


误删的分支为 feature/delete,使用 git reflog 命令可查看到该仓库下的所有历史操作,如下图所示:



语法git checkout -b <branch-name> <commit-id>

命令git checkout -b feature/delete HEAD@{2}


命令执行完成后,分支恢复到 HEAD@{2} 的快照,即从 master 分支拉取 feature/delete 分支的内容,仍然缺少“新增 xxx 文件”的提交,直接将文件内容恢复到最新的提交内容,使用命令 git reset --hard HEAD@{1} 即可实现硬性覆盖本地工作区内容的目的。git reflog 命令获取到的内容为本地仓库所有发生过的变更,可谓恢复利器,既可向前追溯,亦可向后调整,满满的时光追溯器的赶脚啊。。。


(八)不确定哪个分支有自己提交的 commit


工作中会经常碰到一种场景,某个提交先后合并到了各个分支上,但后来发现提交的这个修改是有问题的,需要排查到底哪个分支包含这个提交,然后将其修复掉。


需要先确定有问题的提交的 commit-id :



然后查看本地所有的分支:



可以看到本地有 4 个分支,本地的分支数量非人为控制的,在使用状态的分支直接删掉也不合适,分支数量达到一定程度,一个一个分支查找也不现实。Git 提供了一种能够直接通过 commit-id 查找出包含该内容分支的命令。


语法git branch --contains <commit-id>

命令git branch --contains 700920


命令执行后可以看到包含该问题提交的分支如下图所示,就可以很方便的在对应分支上修复内容啦。



总结


本文介绍的是实际工作场景中可能出现的几种异常情况及解决方式,希望能够对大家有所帮助,不足之处敬请指正。实际上现在已经有很多 Git 操作对应的工具可以使用,需要明白的是工具中的每个操作等同于 Git 命令行的哪个命令,会有什么样的结果,以避免一些不必要发生的错误。


头图:Unsplash

作者:Jocelyn

原文:https://mp.weixin.qq.com/s/GKdhcb0ekirjg4jEwERizA

原文:一份值得收藏的 Git 异常处理清单

来源:政采云前端团队 - 微信公众号 [ID:Zoo-Team]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-03-31 23:377433

评论 1 条评论

发布
用户头像
总结的很好,不过这些都是git的正常操作,怎么就是异常处理呢
2021-04-03 23:09
回复
没有更多了
发现更多内容

基于云原生的物联大数据智能服务

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

网易数帆汪源:低代码仍然被“误会”,市场明年会迎拐点

B Impact

聊一聊适配器模式

Java 设计模式 适配器模式

日常开发中,程序员如何提升技术?这13个点一定要做到!

Java你猿哥

Java ssm java基础 日常开发 java 编程

开发者反响热烈,阿里云免费试用产品增至 80 多款!

云布道师

阿里云

NineData:高效高质量的Redis可视化管理工具

NineData

数据库 redis 开发工具 Redis 可视化工具 NineData

AIGC背后的技术分析 | 基于规则产生式的推理

TiAmo

推理 AIGC 规则产生

新能源汽车品牌加速出海 赛力斯“硬实力”助力全球化布局

科技热闻

日常开发中,程序员如何提升技术?这13个点一定要做到!

程序员小毕

Java 程序员 程序人生 后端 架构师

记录内网Docker启动Stable-Diffusion遇到的几个坑

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

C语言编程—数据类型

智趣匠

TiKV 新架构:Partitioned Raft KV 原理解析

PingCAP

MySQL 数据库 TiDB

从腾讯XR、Meta、迪士尼裁员先砍元宇宙,谈应对不确定新业务

B Impact

SecureCRT中文乱码怎么办?解决 SecureCRT中文乱码方法

Rose

SecureCRT下载 SecureCRT激活版 SecureCRT许可证 SecureCRT中文乱码

清华大佬首推"中高级Java程序员进阶小册",程序员架构进阶必备

Java你猿哥

Java 算法 Spring Boot JVM java面试

ZBrush 2023 v2023.1.1最新激活版下载 三维数字雕刻和绘画

Rose

ZBrush 2023安装教程 ZBrush 2023下载地址 ZBrush 2023破解版 角色建模 特效制作

一不小心,穿越到未来银行

脑极体

生成式AI

浅克隆和深克隆有什么区别?

javacn.site

java面试

一个同事喜欢查别人的BUG,截图发工作大群,还喜欢甩锅怎么办?

Java你猿哥

Java 程序员 ssm 编码 java编程

SVN管理工具Cornerstone入门教程

Rose

cornerstone 4破解 SVN管理 Cornerstone教程 Mac版Cornerstone许可证

CrossOver 让你在Mac上轻松运行 PC 游戏

Rose

虚拟机 CrossOver2023 Mac电脑运行win CrossOver Mac下载

揭秘RLHF;可商用开源LLM列表;领域编译器的前世今生

OneFlow

人工智能 深度学习 RLHF

BitKeep崛起:千万用户的信任,终点还未到来

EOSdreamer111

PullTube for Mac使用技巧:快速导出铃声、缩略图和短片

Rose

Mac视频下载器 PullTube下载 PullTube使用教程

IDP 与 DevOps平台:相似之处与关键差异

SEAL安全

IdP 平台工程 内部开发者平台

涨薪40K!来自阿里内部绝学的“微服务架构手册”

Java你猿哥

架构 微服务 微服务架构 ssm 架构师

依赖反转和依赖注入:提高程序的可维护性和可扩展性

Jack

小白白也能学会的 PyQt 教程 —— 自定义组件 Switch Button

繁依Fanyi

MySQL触发器Trigger加载以及目前局限

GreatSQL

MySQL greatsql greatsql社区

探究 JavaScript 前端热点面试题(三):让你在面试中游刃有余!

控心つcrazy

涅槃重生,BitKeep如何闯出千万用户新起点

鳄鱼视界

一份值得收藏的 Git 异常处理清单_语言 & 开发_政采云前端团队_InfoQ精选文章