git常见异常处理

前言

Git 在工作中用的很多了,但是很多小伙伴都是会一些基本的提交流程,当使用过程中遇到问题的时不知怎么解决,或者查到的命令还不敢使用。本文主要针对以下经常发生的几种异常情况提供一些解决方案:

提交到缓存区之前

只是修改了本地代码,还未执行git add 添加到缓存区

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

当想撤销某个文件的修改,或者某个文件被无意中删除了且清空了回收站,此时想要找回文件

语法git checkout <filename/dirname>

命令git checkout 1.js

撤回回工作区1.js文件的修改

命令git checkout .

撤回工作区所有文件的修改

提交到缓存区之后,还未提交到本地仓库

已经执行git add,还未执行git commit提交到本地仓库

(二)撤销缓存区操作

各位大佬都是拥有极快手速的人,很容易一个git add .把代码全部提交到缓存区了,但是突然想起少加了个注释,身为拥有强迫症的大家,这时候肯定不会选择继续commit,而且撤回修改后重新add

语法git restore --staged <filename/dirname> / git reset HEAD <filename/dirname>

命令git restore --staged 1.js / git reset HEAD 1.js

撤回回缓存区1.js文件的修改,但不会撤销文件的更改

命令git restore --staged . / git reset HEAD .

撤回工作区所有文件的修改

简单理解就是该功能只能撤销add操作

提交到本地仓库,还未提交到远程仓库

已经执行git commit,还未执行git push提交到远程仓库

(三)修改本地仓库提交信息

已经执行了add和commit操作,此时想修改commit提交信息,有两种方式

语法git commit --amend

命令git commit --amend -m "新的提交信息"

此命令可以直接把上个commit信息替换为新的提交信息

命令git commit --amend

此命令会用vim打开上次的commit文件,在里面用vim命令修改

简单理解就是该功能只能修改commit操作的备注信息

还有种情况就是commit了,但是发现有个文件还没保存该怎么处理,此时可以保存后执行git add提交刚漏掉的文件,然后执行git commit --amend --no-edit即可把这次提交合并到上一次中。

(四)撤回本地仓库的提交

已经执行了add和commit操作,此时想撤回commit提交

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

命令git reset --soft HEAD~1

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

简单理解就是该功能只是撤销了commit操作

(五)撤回本地仓库和缓存区的提交

已经执行了add和commit操作,此时回到add前的状态,修改后再重新提交

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

命令git reset --mixed HEAD~1

撤回最近一次的commit和add,已经变更的记录在缓存区也没有了。

简单理解就是该功能撤销了addcommit操作回到了刚修改完文件的状态

(六)撤回提交的错误文件(强烈建议别用)

已经执行了add和commit操作,此时发现有个文件是不需要的,需要撤回

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

命令git reset --hard HEAD~1

撤回最近一次的commit和add,已追踪文件的变更内容都消失了,比如有一个test1文件,修改了其中内容,新增了一个test2文件,此时把两个文件都提交了,如果执行了该命令,结果就是test1的修改记录没有了,新增的test2文件也消失了。

简单理解就是该功能撤销了addcommit操作同时丢弃了这次修改内容请谨慎使用

分支相关

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

我们想要新建的分支名为 branch1,却由于训练多年的麒麟臂,写成了 branch2

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

命令git branch -m branch2 branch1

把写错的branch2分支名修改为branch1

(八)本地分支关联远程仓库分支

我想使用git pull origin branchNamegit push origin branchName时,直接使用git pullgit push,那么就需要和远程仓库关联

语法git branch --set-upstream-to=<remoteName/branchName

命令git branch --set-upstream-to=origin/branch1

通过 git branch -vv 查看分支的关联关系,可以看到本地分支和远程仓库origin的branch1分支已经关联

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

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

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

假设删除的远程分支为 branch1,使用 git push origin --delete branch1 删除掉对应的远程分支之后,再删除本地分支关联。

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

命令git branch --unset-upstream branch1

删除掉关联关系之后,用 git branch -vv 命令可查看到本地分支与远程分支已经没有关联了

(十)恢复误删除的本地分支

本地分支拉取之后,由于疏忽被删除,而且本地的分支并没有被同步到远程分支上,此时想要恢复本地分支。误删的分支为 test,使用 git reflog可查看到该仓库下的所有历史操作,如下所示(#为备注):

# 从test切换到master
d1dda63 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from test to master
# 提交了 测试000
9b3003d HEAD@{1}: commit: 测试000
# 从master切换到test
d1dda63 (HEAD -> master, origin/master) HEAD@{2}: checkout: moving from master to test
# 合并了test代码
d1dda63 (HEAD -> master, origin/master) HEAD@{3}: merge test: Fast-forward
# 从test切换到master
48a61f7 HEAD@{4}: checkout: moving from test to master

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

命令git checkout -b test HEAD@{1}

该命令会创建一个test分支并切换到该分支,然后命令执行完成后,这里可以看到最近一次test分支快照是 HEAD@{2} (# 从master切换到test),这里我们执行命令后即从 master 分支拉取 test分支的内容,但是仍然缺少没有同步远程仓库,而存在本地仓库的新提交HEAD@{1}(# 提交了 测试000),想要将文件内容恢复到最新的提交内容,使用命令 git reset --hard HEAD@{1} 即可实现硬性覆盖本地工作区内容的目的。git reflog 命令获取到的内容为本地仓库所有发生过的变更,非常好用。

Git 工具

网上一些 Git 工具很多,推荐一个SourceThree,个人建议使用 Git 命令,防止技能慢慢蜕化了。

SourceThree 下载地址:https://www.sourcetreeapp.com/

vim 常用命令

使用 Git 的时候,偶尔会对 Vim 中对 shell 脚本进行简单操作,为了节约时间,列出几个常用的 vim 快捷命令。

  • a,i,r,o,A,I,R,O 进入编辑模式
  • :q 一般退出
  • :q! 退出不保存
  • :wq 保存退出
  • yy 复制当前行的内容
  • ZZ 保存离开
  • dd 删除光标当前行
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值