工作中常见的 Git 异常处理方案
一份值得收藏的 Git 异常处理清单
前言
-
本地工作区文件恢复
-
远程分支删除后,删除本地分支与其关联
-
修改提交时的备注内容
-
修改分支名,实现无缝衔接
-
撤回提交
-
撤销本地分支合并
-
恢复误删的本地分支
-
不确定哪个分支有自己提交的 commit
(一)本地工作区文件恢复
语法:git checkout <filename/dirname>
命令:git checkout 1.js
这一命令主要用于本地工作区文件的撤回,下图是一个工作区文件被删除后的完美恢复过程。
(二)远程分支删除后,删除本地分支及关联
git branch --set-upstream-to=origin/master master
建立本地分支与远程分支的关联,从 master 拉出的分支可以自动建立与远程已有分支的关联,这样可以很方便的使用
git pull
和
git push
拉取远程分支的代码和将本地分支提交到远程。
git push origin --delete feature/test
删除掉对应的远程分支之后,删除本地分支关联。
语法:git branch --unset-upstream <branchname>
命令:git branch --unset-upstream feature/test
删除掉关联关系之后,用 git branch -vv
命令可查看到本地分支与远程分支的关联关系如下图所示,可观察到 feature/test 分支已经没有关联的远程分支了。
(三)修改提交时的备注内容
语法:git commit --amend
git commit --amend
使用 git log --pretty=oneline
查看内容,发现已经成功修改啦。需要注意的是此项命令会修改提交时的commit-id,即会覆盖原本的提交,需要谨慎操作。
(四)修改分支名,实现无缝衔接
语法: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 的操作。
用新的更改替换撤回的更改
语法:git reset --mixed [<commit-id>/HEAD~n>]
命令:git reset --mixed HEAD~1
命令执行完成后,查看文件变更记录,可发现如下图所示:
已变更的文件都未添加到暂存区,撤销了 commit 和 add 的操作。
本地提交了错误的文件
语法:git reset --hard [<commit-id>/HEAD~n>]
命令:git reset --hard HEAD~1
命令执行完成后,查看文件变更记录,可发现如下图所示:
已追踪文件的变更内容都消失了,撤销了 commit 和 add 的操作,同时撤销了本地已追踪内容的修改;未追踪的内容不会被改变。从上面的效果可以看到,文件的修改都会被撤销。-hard 参数需要谨慎使用。
(六)撤销本地分支合并
git reset
和
git revert
。reset 的语法和命令之前已经介绍过,不做赘述, revert 的语法和命令和 reset 一致。但是产生的实际效果会有不同。
语法:git revert <commit-id>
命令:git revert 700920
下图为执行命令后的效果:
从需要提交到远程分支的角度来讲,reset 能够“毁尸灭迹”,不让别人发现我们曾经错误的合并过分支(注:多人协作中,需要谨慎使用);revert 则会将合并分支和撤回记录一并显示在远程提交记录上。
(七)恢复误删的本地分支
误删的分支为 feature/delete,使用 git reflog
命令可查看到该仓库下的所有历史操作,如下图所示:
语法:git checkout -b <branch-name> <commit-id>
命令:git checkout -b feature/delete HEAD@{2}
git reset --hard HEAD@{1}
即可实现硬性覆盖本地工作区内容的目的。
git reflog
命令获取到的内容为本地仓库所有发生过的变更,可谓恢复利器,既可向前追溯,亦可向后调整,满满的时光追溯器的赶脚啊。。。
(八)不确定哪个分支有自己提交的 commit
语法:git branch --contains <commit-id>
命令:git branch --contains 700920
命令执行后可以看到包含该问题提交的分支如下图所示,就可以很方便的在对应分支上修复内容啦。
总结
本文介绍的是实际工作场景中可能出现的几种异常情况及解决方式,希望能够对大家有所帮助,不足之处敬请指正。实际上现在已经有很多 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)