【工具】一份值得收藏的 Git 异常处理清单
本文首发于政采云前端团队博客:一份值得收藏的 Git 异常处理清单
https://www.zoo.team/article/git-exception
![](https://filescdn.proginn.com/d07017fd4b5d63cfd279201a13162471/345d9afdcbd8e9ce98de6b319c7109c2.webp)
前言
本地工作区文件恢复
远程分支删除后,删除本地分支与其关联
修改提交时的备注内容
修改分支名,实现无缝衔接
撤回提交
撤销本地分支合并
恢复误删的本地分支
不确定哪个分支有自己提交的 commit
(一)本地工作区文件恢复
语法:git checkout <filename/dirname>
命令:git checkout 1.js
这一命令主要用于本地工作区文件的撤回,下图是一个工作区文件被删除后的完美恢复过程。
![](https://filescdn.proginn.com/f79c0265c977cb4606a9b886cee4b559/a995eb566208091fb0830afd407dc3f7.webp)
(二)远程分支删除后,删除本地分支及关联
git branch --set-upstream-to=origin/master master
建立本地分支与远程分支的关联,从 master 拉出的分支可以自动建立与远程已有分支的关联,这样可以很方便的使用 git pull
和 git push
拉取远程分支的代码和将本地分支提交到远程。git push origin --delete feature/test
删除掉对应的远程分支之后,删除本地分支关联。![](https://filescdn.proginn.com/c215e00cd63da86829751e3ec83e6e4f/509f8285bdc15d4191e5ee9fd24a36be.webp)
语法:git branch --unset-upstream <branchname>
命令:git branch --unset-upstream feature/test
删除掉关联关系之后,用 git branch -vv
命令可查看到本地分支与远程分支的关联关系如下图所示,可观察到 feature/test 分支已经没有关联的远程分支了。
![](https://filescdn.proginn.com/8c7c80a16a908e757928ed1f734b179d/727103c372225076f0c92f2af8a0bcbe.webp)
(三)修改提交时的备注内容
![](https://filescdn.proginn.com/70103107a527889c75cbf1efc6ebf1b9/8d7f0e102f66a71138ea025d3304298d.webp)
语法:git commit --amend
git commit --amend
![](https://filescdn.proginn.com/a3bda243ce88669ee104e01f9a1950c3/dc69ca392638834b634fa078c0f9cc64.webp)
使用 git log --pretty=oneline
查看内容,发现已经成功修改啦。需要注意的是此项命令会修改提交时的commit-id,即会覆盖原本的提交,需要谨慎操作。
(四)修改分支名,实现无缝衔接
语法:git branch -m <oldbranch> <newbranch>
git branch -m feature/stor-13711 feature/story-13711
![](https://filescdn.proginn.com/89b6e1d1af2ddd19e7c110042de767df/5860f5082a135a3bb254279391b4c821.webp)
执行完之后发现文件的工作区已修改内容一点都没有变化,真正的实现了无痛过渡,皆大欢喜!
(五)撤回提交
已将更改交到本地存储,需要撤回提交
用新的提交内容替换上一次的提交
本地提交了错误的文件
已将更改提交到本地,需要撤回提交
语法:git reset --soft [<commit-id>/HEAD~n>]
命令:git reset --soft HEAD~1
命令执行完成后,查看文件变更记录,可发现如下图所示:
![](https://filescdn.proginn.com/0fc6541ec20fdbcc947c7812a0f367e1/8cae809445fac704eb56172d6de8953c.webp)
文件变更记录与未提交之前的文件变更记录是一致的,只是撤销了 commit 的操作。
用新的更改替换撤回的更改
语法:git reset --mixed [<commit-id>/HEAD~n>]
命令:git reset --mixed HEAD~1
命令执行完成后,查看文件变更记录,可发现如下图所示:
![](https://filescdn.proginn.com/eae24fd7f53391fa6c856cb1636c55e7/445d1a8f7d830075910d11ed10b4c85c.webp)
已变更的文件都未添加到暂存区,撤销了 commit 和 add 的操作。
本地提交了错误的文件
语法:git reset --hard [<commit-id>/HEAD~n>]
命令:git reset --hard HEAD~1
命令执行完成后,查看文件变更记录,可发现如下图所示:
![](https://filescdn.proginn.com/7931dec77e5666eef83d116d758713de/061982451dac3c6d328e8a45269116ec.webp)
已追踪文件的变更内容都消失了,撤销了 commit 和 add 的操作,同时撤销了本地已追踪内容的修改;未追踪的内容不会被改变。从上面的效果可以看到,文件的修改都会被撤销。-hard 参数需要谨慎使用。
(六)撤销本地分支合并
git reset
和 git revert
。reset 的语法和命令之前已经介绍过,不做赘述, revert 的语法和命令和 reset 一致。但是产生的实际效果会有不同。![](https://filescdn.proginn.com/c4a5c9712252907c97a39f0ca3bc7371/3c17eca37c1604ee2a4bb728f016c88d.webp)
语法:git revert <commit-id>
命令:git revert 700920
下图为执行命令后的效果:
![](https://filescdn.proginn.com/4161cc7cbfb457d57cb22f4bf3a421bf/dc792bfcdeceeb4ecc1c01195590e558.webp)
从需要提交到远程分支的角度来讲,reset 能够“毁尸灭迹”,不让别人发现我们曾经错误的合并过分支(注:多人协作中,需要谨慎使用);revert 则会将合并分支和撤回记录一并显示在远程提交记录上。
(七)恢复误删的本地分支
误删的分支为 feature/delete,使用 git reflog
命令可查看到该仓库下的所有历史操作,如下图所示:
![](https://filescdn.proginn.com/ba15b77f31753c19aafced07ac372ba2/4bf5c8330bbeeda8e284d1dd6189074f.webp)
语法:git checkout -b <branch-name> <commit-id>
命令:git checkout -b feature/delete HEAD@{2}
git reset --hard HEAD@{1}
即可实现硬性覆盖本地工作区内容的目的。git reflog
命令获取到的内容为本地仓库所有发生过的变更,可谓恢复利器,既可向前追溯,亦可向后调整,满满的时光追溯器的赶脚啊。。。(八)不确定哪个分支有自己提交的 commit
![](https://filescdn.proginn.com/404cf6e4c3d36e433162c08183c5c7e3/85050b9c331cece0302a7c011404b096.webp)
![](https://filescdn.proginn.com/f1e699515a3433d06fa3b76677ce5f66/546cb3d7c110d8d4aa7ab98fadfc2783.webp)
语法:git branch --contains <commit-id>
命令:git branch --contains 700920
命令执行后可以看到包含该问题提交的分支如下图所示,就可以很方便的在对应分支上修复内容啦。
![](https://filescdn.proginn.com/c8b4f789ded868713079804dbf84ec97/8573f655da8ade7c7e2ebb6ab2ec7c24.webp)
总结
本文介绍的是实际工作场景中可能出现的几种异常情况及解决方式,希望能够对大家有所帮助,不足之处敬请指正。实际上现在已经有很多 Git 操作对应的工具可以使用,需要明白的是工具中的每个操作等同于 Git 命令行的哪个命令,会有什么样的结果,以避免一些不必要发生的错误。
参考文献
Git 错误集锦和修复方法 (https://www.edureka.co/blog/common-git-mistakes/#pushed)
Git 中.gitignore的配置语法 (https://www.jianshu.com/p/ea6341224e89)
git reset 和 git revert (https://juejin.im/post/5b0e5adc6fb9a009d82e4f20)
欢迎关注「前端杂货铺」,一个有温度且致力于前端分享的杂货铺
关注回复「加群」,可加入杂货铺一起交流学习成长