Git进阶下令-reset

打印 上一主题 下一主题

主题 817|帖子 817|积分 2451


一、reset下令使用场景

有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种环境有两种解决方法:
解决方法1:修改错误内容,再次commit一次
解决方法2:使用git reset 下令打消这一次错误的commit
第一种方法比较直接,但会多一次commit记录,同时并不是全部场景都可以这么做。
所以建议使用第二种方法,因为错误的commit没必要保留下来。

二、reset下令

git reset 下令用于回退版本,可以指定退回某一次提交的版本。
reset 下令的原理是根据 commitId 来恢复版本。
因为每次提交都会天生一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。
   这里的版本和提交是一个意思,一个 commitId 就是一个版本
  下令格式如下:
  1. git reset [--soft | --mixed | --hard] [HEAD]
复制代码

常用下令
  1. # 回退所有内容到上一个版本
  2. git reset HEAD^
  3. # 回退test.txt这个文件的版本到上一个版本
  4. git reset HEAD^ test.txt
  5. # 向前回退到第3个版本
  6. git reset  HEAD~3
  7. # 回退到某个版本51363e6
  8. git reset 51363e6
复制代码

   注意:对于已经 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,提交错了,需要撤回。
同时这个时候呢,本地又新增修改了一些代码




实行下令
  1. git reset d0eda46
复制代码
注意 这里的commitId不是提交代码2的,而是提交代码1的,因为我们想的是回到是1这个版本,别搞错了




可以看出本地的代码和撤回的代码都在,且都在工作区。
我们再来看下提交日志
  1. git log --oneline
复制代码




可以看到 提交代码2 的提交记录已经没有了。

五、reset --soft

soft和mixed差别并不大,无非就是一个回退到暂存区一个回退到工作区。
我们来演示下,把上面三个文件重新提交一次
  1. $ git commit -a -m  '提交代码2'
  2. [feature ebb89a1] 提交代码2
  3. 3 files changed, 5 insertions(+), 2 deletions(-)
复制代码

然后再来实行reset下令
  1. git reset --soft d0eda46
复制代码



可以看出撤回的都返回在暂存区。

六、reset --hardt


这个下令和前面差别就非常大了,它不但会丢弃错误commit提交的代码,而且本地没有commit的修改会被全部擦掉,关键是这种环境本地代码一旦擦掉是没有任何办法在找回来了。
同样我们把上面的代码再次提交
  1. $ git commit -m  '提交代码3'
  2. [feature de970f2] 提交代码3
  3. 3 files changed, 5 insertions(+), 2 deletions(-)
复制代码

然后再来实行reset下令
  1. git reset --hard d0eda46
复制代码

在看本地
  1. $ git status
  2. On branch feature
  3. nothing to commit, working tree clean
复制代码
在工作区和暂存区已经没有任何代码了,也就是如果这个时候你本地开发的代码没有提交,那就永久也找不回来了。
那之前提交过的但又撤回的 提交代码3 的代码可以找回吗?
这个是可以的。
我们通过 git log --oneline 是找不回的。




找不到 提交代码3 的记录了。 那怎么办呢?
可以通过 git reflog 下令实现找回
实行下令
  1. git reflog
复制代码




这里能找到 commit 提交代码3 的记录。那现在要做的就是撤回到当前提交的位置。
实行下令
  1. git reset de970f2
复制代码



全部回来啦。
注意 牢记!!!工作区有未提交的代码时不要用这个下令,因为工作区会回滚,你没有提交的代码就再也找不回了。

   文章转载自:雨点的名字
  原文链接:https://www.cnblogs.com/qdhxhz/p/18084982
  体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表