文章目录
前言
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,已经变更的记录在缓存区也没有了。
简单理解就是该功能撤销了add
和commit
操作,回到了刚修改完文件的状态
(六)撤回提交的错误文件(强烈建议别用)
已经执行了add和commit操作,此时发现有个文件是不需要的,需要撤回
语法:git reset --hard [<commit-id>/HEAD~n>]
命令:git reset --hard HEAD~1
撤回最近一次的commit和add,已追踪文件的变更内容都消失了,比如有一个test1文件,修改了其中内容,新增了一个test2文件,此时把两个文件都提交了,如果执行了该命令,结果就是test1的修改记录没有了,新增的test2文件也消失了。
简单理解就是该功能撤销了add
和commit
操作,同时丢弃了这次修改内容,请谨慎使用
分支相关
(七)修改分支名,实现无缝衔接
我们想要新建的分支名为 branch1,却由于训练多年的麒麟臂,写成了 branch2
语法:git branch -m <oldbranch> <newbranch>
命令:git branch -m branch2 branch1
把写错的branch2分支名修改为branch1
(八)本地分支关联远程仓库分支
我想使用git pull origin branchName
和git push origin branchName
时,直接使用git pull
和git 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 pull
和 git 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 删除光标当前行