Git 进阶命令 -reset
一、reset 命令使用场景
有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种情况有两种解决方法:
解决方法 1:修改错误内容,再次 commit 一次
解决方法 2:使用 git reset 命令撤销这一次错误的 commit
第一种方法比较直接,但会多一次 commit 记录,同时并不是所有场景都可以这么做。
所以建议使用第二种方法,因为错误的 commit 没必要保留下来。
二、reset 命令
git reset 命令用于回退版本
,可以指定退回某一次提交的版本。
reset 命令的原理是根据 commitId 来恢复版本。
因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。
这里的版本和提交是一个意思,一个 commitId 就是一个版本
命令格式如下:
常用命令
注意:对于已经 push 的 commit,也可以使用 reset 命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f 来覆盖被 reset 的 commit。
这里非常需要注意,因为 git push -f
是一个非常危险的命令。
如果在 git push -f 之前有其他同事 push 新代码。那么同事提交代码会丢失。
所以这里一定要注意 git push -f 之前要先 git pull 拉下是否有新提交代码。
三、reset 参数有哪些?
option 参数的选项有以下几种
git reset --mixed
:此为默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。
git reset --soft
:回退到某个版本 。将撤回的代码,存放到暂存区。同时会保留本地未提交的内容。
git reset --hard
:彻底回退到某个版本,丢弃将撤回的代码,本地没有 commit 的修改会被全部擦掉。(慎用
)
下面对这三种参数分别一一通过示例演示
四、reset --mixed
默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。
在代码提交后,我发现这次提交也就是 commitId 为 7812249,提交错了,需要撤回。
同时这个时候呢,本地又新增修改了一些代码
执行命令
注意
这里的 commitId 不是提交代码 2 的,而是提交代码 1 的,因为我们想的是回到是 1 这个版本,别搞错了
可以看出本地的代码和撤回的代码都在,且都在工作区
。
我们再来看下提交日志
可以看到 提交代码2
的提交记录已经没有了。
五、reset --soft
soft 和 mixed 差别并不大,无非就是一个回退到暂存区一个回退到工作区。
我们来演示下,把上面三个文件重新提交一次
然后再来执行 reset 命令
可以看出撤回的都返回在暂存区。
六、reset --hardt
这个命令和前面差别就非常大了,它不仅会丢弃错误 commit 提交的代码,而且本地没有 commit 的修改会被全部擦掉,关键是这种情况本地代码一旦擦掉是没有任何办法在找回来了。
同样我们把上面的代码再次提交
然后再来执行 reset 命令
在看本地
在工作区和暂存区已经没有任何代码了,也就是如果这个时候你本地开发的代码没有提交,那就永远也找不回来了。
那之前提交过的但又撤回的 提交代码3
的代码可以找回吗?
这个是可以的。
我们通过 git log --oneline
是找不回的。
找不到 提交代码3
的记录了。 那怎么办呢?
可以通过 git reflog 命令实现找回
执行命令
这里能找到 commit 提交代码3
的记录。那现在要做的就是撤回到当前提交的位置。
执行命令
全部回来啦。
注意
切记!!!工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了。
文章转载自:雨点的名字
评论