• Git进阶命令-reset


    之前有关Git,写过一片文章: Git五个常见问题及解决方法

    一、reset命令使用场景

    有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种情况有两种解决方法:

    解决方法1:修改错误内容,再次commit一次

    解决方法2:使用git reset 命令撤销这一次错误的commit

    第一种方法比较直接,但会多一次commit记录,同时并不是所有场景都可以这么做。

    所以建议使用第二种方法,因为错误的commit没必要保留下来。


    二、reset命令

    git reset 命令用于回退版本,可以指定退回某一次提交的版本。

    reset 命令的原理是根据 commitId 来恢复版本。

    因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。

    这里的版本和提交是一个意思,一个 commitId 就是一个版本

    命令格式如下:

    git reset [--soft | --mixed | --hard] [HEAD]
    

    常用命令

    # 回退所有内容到上一个版本
    git reset HEAD^
    
    # 回退test.txt这个文件的版本到上一个版本
    git reset HEAD^ test.txt
    
    # 向前回退到第3个版本
    git reset  HEAD~3
    
    # 回退到某个版本51363e6
    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,提交错了,需要撤回。

    同时这个时候呢,本地又新增修改了一些代码

    执行命令

    git reset d0eda46
    

    注意 这里的commitId不是提交代码2的,而是提交代码1的,因为我们想的是回到是1这个版本,别搞错了

    可以看出本地的代码和撤回的代码都在,且都在工作区。

    我们再来看下提交日志

    git log --oneline
    

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


    五、reset --soft

    soft和mixed差别并不大,无非就是一个回退到暂存区一个回退到工作区。

    我们来演示下,把上面三个文件重新提交一次

    $ git commit -a -m  '提交代码2'
    [feature ebb89a1] 提交代码2
    3 files changed, 5 insertions(+), 2 deletions(-)
    

    然后再来执行reset命令

    git reset --soft d0eda46
    

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


    六、reset --hardt

    这个命令和前面差别就非常大了,它不仅会丢弃错误commit提交的代码,而且本地没有commit的修改会被全部擦掉,关键是这种情况本地代码一旦擦掉是没有任何办法在找回来了。

    同样我们把上面的代码再次提交

    $ git commit -m  '提交代码3'
    [feature de970f2] 提交代码3
    3 files changed, 5 insertions(+), 2 deletions(-)
    

    然后再来执行reset命令

    git reset --hard d0eda46
    

    在看本地

    $ git status
    On branch feature
    nothing to commit, working tree clean
    
    

    在工作区和暂存区已经没有任何代码了,也就是如果这个时候你本地开发的代码没有提交,那就永远也找不回来了。

    那之前提交过的但又撤回的 提交代码3 的代码可以找回吗?

    这个是可以的。

    我们通过 git log --oneline 是找不回的。

    找不到 提交代码3 的记录了。 那怎么办呢?

    可以通过 git reflog 命令实现找回

    执行命令

    git reflog
    
    

    这里能找到 commit 提交代码3 的记录。那现在要做的就是撤回到当前提交的位置。

    执行命令

    git reset de970f2
    
    

    全部回来啦。

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



    声明: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!

  • 相关阅读:
    文本对比学习综述
    【网络安全】——sql注入之奇淫巧技bypass(持续更新中)
    layui 表格 展开
    YOLOv8改进 | 卷积模块 | 用DWConv卷积替换Conv【轻量化网络】
    【Java】基于SpringBoot创建Web页面并热更新
    【疯壳·嵌入式平板开发教程2】手把手教你做平板电脑-GPIO 驱动实验教程
    Zabbix Proxy分布式监控
    【奇葩问题】微信小程序 We分析 访问来源Top10的总比例为什么不止100%
    怎样将几个pdf合并?
    【Linux问题】This account is currently not available.
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/18084982