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

这是第 53 篇不掺水的原创,想获取更多原创好文,请扫 👆 上方二维码关注咱们吧~
本文首发于政采云前端团队博客:一份值得收藏的 Git 异常处理清单前端

前言

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

你们在使用过程当中总会碰到这样那样的问题,本文主要针对如下常常发生的几种异常状况提供一些解决方案:后端

  1. 本地工做区文件恢复缓存

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

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

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

  5. 撤回提交oop

  6. 撤销本地分支合并post

  7. 恢复误删的本地分支性能

  8. 不肯定哪一个分支有本身提交的 commit

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

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

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

语法git checkout <filename/dirname>

命令git checkout 1.js

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

1.png

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

为方便分支提交,通常状况下会用本地命令 git branch --set-upstream-to=origin/master master 创建本地分支与远程分支的关联,从 master 拉出的分支能够自动创建与远程已有分支的关联,这样能够很方便的使用 git pullgit push 拉取远程分支的代码和将本地分支提交到远程。

Git 远程分支删除以后,本地分支就没法成功推送到远程,想要从新创建与远程仓库的关联,就须要先删除其本来的与已删除的远程分支的关联。

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

2(1).png

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

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

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

2(2).png

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

平时提交代码不少时候由于军情紧急,会在刚提交的时候填写了本身不太满意的备注,但笔者本人有点强迫症,必定要把它改为想要的样子咋办。。。。,不要慌,仍是有解决办法滴!

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

3(1).png

语法git commit --amend

命令git commit --amend

3(2).png

使用 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

4.png

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

(五)撤回提交

平常工做中,可能因为需求变动、或者误操做等缘由须要进行提交的撤回:

以下分析了各类缘由撤销的场景,主要包括:

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

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

  • 本地提交了错误的文件

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

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

命令git reset --soft HEAD~1

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

5(2).png

文件变动记录与未提交以前的文件变动记录是一致的,只是撤销了 commit 的操做。

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

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

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

命令git reset --mixed HEAD~1

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

5(3).png

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

本地提交了错误的文件

本地将彻底错误的,本不该提交的内容提交到了仓库,须要进行撤销,可使用 --hard 参数

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

命令git reset --hard HEAD~1

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

5(4).png

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

(六)撤销本地分支合并

实际操做中,总会有不少的干扰,致使咱们合并了并不应合并的分支到目标分支上。解决这种问题的方式有两种,git resetgit revert。 reset 的语法和命令以前已经介绍过,不作赘述, revert 的语法和命令和 reset 一致。可是产生的实际效果会有不一样。

能够先来看下 revert 操做的实际效果,合并分支以后的效果以下图所示:

6(1).png

撤销合并:

语法git revert <commit-id>

命令git revert 700920

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

6(2).png

通过先后对比可知,revert 执行以后会在本来的记录中新增一条提交记录。

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

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

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

本地分支拉取以后,因为疏忽被删除,并且本地的分支并无被同步到远程分支上,此时想要恢复本地分支。

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

7(1).png

语法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 :

8(1).png

而后查看本地全部的分支:

8(2).png

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

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

命令git branch --contains 700920

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

8(3).png

总结

本文介绍的是实际工做场景中可能出现的几种异常状况及解决方式,但愿可以对你们有所帮助,不足之处敬请指正。实际上如今已经有不少 Git 操做对应的工具可使用,须要明白的是工具中的每一个操做等同于 Git 命令行的哪一个命令,会有什么样的结果,以免一些没必要要发生的错误。

参考文献

Git 错误集锦和修复方法

Git 中.gitignore的配置语法

git reset 和 git revert

推荐阅读

图解 HTTP 缓存

多是最全的 “文本溢出截断省略” 方案合集

图文并茂,为你揭开“单点登陆“的神秘面纱

招贤纳士

政采云前端团队(ZooTeam),一个年轻富有激情和创造力的前端团队,隶属于政采云产品研发部,Base 在风景如画的杭州。团队现有 50 余个前端小伙伴,平均年龄 27 岁,近 3 成是全栈工程师,妥妥的青年风暴团。成员构成既有来自于阿里、网易的“老”兵,也有浙大、中科大、杭电等校的应届新人。团队在平常的业务对接以外,还在物料体系、工程平台、搭建平台、性能体验、云端应用、数据分析及可视化等方向进行技术探索和实战,推进并落地了一系列的内部技术产品,持续探索前端技术体系的新边界。

若是你想改变一直被事折腾,但愿开始能折腾事;若是你想改变一直被告诫须要多些想法,却无从破局;若是你想改变你有能力去作成那个结果,却不须要你;若是你想改变你想作成的事须要一个团队去支撑,但没你带人的位置;若是你想改变既定的节奏,将会是“ 5 年工做时间 3 年工做经验”;若是你想改变原本悟性不错,但老是有那一层窗户纸的模糊… 若是你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的本身。若是你但愿参与到随着业务腾飞的过程,亲手推进一个有着深刻的业务理解、完善的技术体系、技术创造价值、影响力外溢的前端团队的成长历程,我以为咱们该聊聊。任什么时候间,等着你写点什么,发给 ZooTeam@cai-inc.com

相关文章
相关标签/搜索