参考

https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86

https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified

https://git-scm.com/docs/git-reset

https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192

前言

在使用git的时候,我们一般提倡是不允许回滚。对于问题的追踪和项目的发展历程而言历史记录都是有用的。并且为了节省一点存储空间而丢失宝贵的代码信息是不值当的。但是我们开发中,肯定会遇到特殊情况需要回退。比如确实操作错了一步历史提交,导致仓库混乱污染或是内容丢失,我们需要回退到干净的一次提交,重新操作。

在git等所有的版本管理软件中,删除操作,只是增加一次记录,内容并不会被删掉,我们可以大胆的操作,这也符合版本仓库的逻辑。只有特殊情况才需要真正的删除,做这种操作的时候需要特别注意,因为一旦失误,无法挽回。

从历史记录中删除 参考 https://www.cnblogs.com/studywithallofyou/p/11772684.html https://www.cnblogs.com/studywithallofyou/p/11772844.html

工作流程

要想理解git reset,那么就要搞清楚git仓库管理流程:

我们修改完内容后,这些记录单单是保存在我们本地目录下,也就是工作目录。如果丢了,就是丢了,无法找回。与普通磁盘上的文件一样,除非到回收站找回。

这时,如果运行了add,那么内容就被记录到本地的暂存仓库,也就是index。这时如果删除文件,在暂存区的内容还存在,并没有丢失。

如下图,我们创建了一个文件4,这时文件4在本地。我们add到暂存仓库,然后删掉文件4,我们发现又多了一条记录删除记录,原来的4还存在,我们可以commit。原来的文件4并没有丢失。

运行commit之后,修改的内容就被保存到了仓库,修改了HEAD(HEAD就是指向当前仓库在哪一个提交历史,不特殊修改,都指向最新的一次提交)。这时运行git status发现目录是干净的。git里面需要提交仓库,暂存仓库和本地目录内容都完全一致,才是干净的,任何一个不一致都会有不同的提示。

比如上面的图,提交的仓库中没有文件4,暂存仓库中增加了4,所以显示绿色的提示内容,add了文件但是还没有commit。但是本次又删除了文件,本地目录中的内容与暂存仓库也不一样,所以提示红色的内容,因为算是警告,没有add的内容是会丢失的。

修改

add

commit

git reset的三个选择

理解了上面的流程,就可以理解git reset了。git reset就是分别逆向操作,也就是把HEAD(提交的仓库)回退到一个指定历史,把HEAD、index(暂存仓库)都回退到指定历史,把HEAD、index和本地目录的内容都回退到一个指定历史。

git reset --soft就是把HEAD回退到指定历史。运行后结果如下

也就相当于我们add了修改的文件,本地目录和暂存仓库都已经一致了,就等待commit。如果我们commit,可以再次填写commit记录,也就实现了git commit --amend的功能。

git reset --mixed就是把HEAD和index都回退到指定的历史。这个也是运行git reset不加参数时的默认规则。运行结果如下

相当于我们仅仅修改了文件,还没做任何处理。

git reset --hard这个是把HEAD、index和本地目录的内容都回退到指定的历史记录。做这一步操作的时候一定要小心,最好把所有的内容都提交,并且push到远程或是拷贝一份。因为这个操作会重置本地的内容到一个指定历史。

我们先运行git log,看到有三个提交历史

运行git reset --hard HEAD~

我们发现仓库是干净的,并且原来的3文件没了,运行git log参看

提交的历史记录也没有了。

这次是真的回退到了指定历史,所有的记录都不见了,我们可以开心的(真的吗?)在原来一个干净的分支上继续写代码了。

git reset --hard的后悔药

世上有没有后悔药我不知道,但是git作为一个先进的分布式管理器,却有无限可能。如果你一不小心,脑袋发热,运行了git reset --hard,但是发现不是你想要的,原来的记录也没了。怎么办?大脑瞬间充血,一片空白。不要慌,首先冷静下来,然后运行git reflog,这个命令是告诉你你的每一次对仓库操作的历史记录,如下

看一下最上面的几条,第一条告诉你当前在e86d948这个提交记录,通过reset切换过来的。对照上面的git log,可以发现这个是第二个提交历史,也就是我们git reset --hard HEAD~的时候回退的分支。第二条记录告诉我们当前是fc9fbc6分支,通过reset回退到这个分支的,我们可以参考上面的git log记录,这个就是我们想要回去的分支。好了,有了记录的哈希值,我们只需再运行一次git reset --hard,如下

查看一下git log

回来了。

git不会删除任何已经提交到版本库的内容,除非你非要专门特殊这样做,并且为了再给你一次机会,像git reset这样,就算你明确说明不要了,它也不会立马删除,除非超过一定时间或是你主动运行git gc等操作,把无用的,没有关联的内容删掉。不然,那条记录还是在本地仓库,只不过它没有被载入历史的长河中。

git回退之git reset的更多相关文章

  1. 学Git,用Git ③

    不知道我前面是否将git讲清楚了,这里再稍微总结一下git的一个重要功能用法,同时增加两个很实用的git使用技巧. 1.git"读档"与git"回退" 我发现我 ...

  2. [原]git的使用(一)---建立本地仓库、add和commit、status和git diff、版本回退使用git reset

    在window下已经安装了git的环境 1.建立本地仓库 mkdir   test     #建立test目录 cd   test        #进入目录 git  init           # ...

  3. Git命令之回退篇 git revert git reset

    Git command之回退篇 欲练回退 必先了解:HEAD.index.WorkingCopy HEAD: 当前所在的分支版本顶端的别名,也就是最新的一次commit. git commit 之后与 ...

  4. Git回退---reset和revert

    今天学习了git回退的两个命令,现在总结一下: 1.git reset 如果想回退错误的提交C和D,只要把指针移到B上 git reset --hard a0fvf8 而这时候,远程仓库的指针还在D上 ...

  5. Git 中的回退操作:reset 和 revert

    Git 中回退有 reset 和 revert,这两个的区别就是是否保留更改记录 假设当前的提交情况是:A <- B <- C <- D <- HEAD,如下图: 当前是 D, ...

  6. 『现学现忘』Git后悔药 — 31、reset版本回退命令总结

    目录 1.--soft回退说明 2.--mixed回退说明 3.--hard回退说明 4.总结 在Git中进行版本回退需要使用git reset命令. 以前面文章中的示例为例,当我准备在V4版本,回退 ...

  7. git 远程仓库版本的回退以及git reset 几种常用方式记录

    由于 github push 了两个比较潦草的commit, 自己很不满意,又不想重新开vpn进行上传,所以找了一下相关的教程. 最后研究了一下,原理为先在本地还原到你想要的commit,然后强制pu ...

  8. 代码回滚:git reset、git checkout和git revert区别和联系

    git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...

  9. git reset、git checkout和git revert的区别

    这三个git命令都是用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于commit层面,还可以作用于file层面Reset在commit层面,reset通过移除当前分支的一些节点来实现版本回滚; ...

随机推荐

  1. JDK8 Optional操作学习

    介绍 Optional是JDK8中提供用于包含未知对象的工具类,即可以利用Optional包装对象来避免繁琐的空指针检查,以及NullPointException的处理,在Optional中,用val ...

  2. Vue-cli父子组件之间传参

    一.父传子( 先写父组件 父组件 <template> <子组件 :子组件的变量名='父组件的变量'> </子组件> //子组件的变量名前的冒号千万别丢了有和没有是 ...

  3. 约瑟夫环问题详解(java版)

    1 什么是约瑟夫环问题? 约瑟夫,是一个古犹太人,曾经在一次罗马叛乱中担任将军,后来战败,他和朋友及另外39个人躲在一口井里,但还是被发现了.罗马人表示只要投降就不死,约瑟夫想投降,可是其他人坚决不同 ...

  4. go-异常处理-error-panic-recover

    Go语言的函数可以一次返回多个结果.这就为我们温和地报告错误提供了语言级别的支持. func readFile(path string) ([]byte, error) { file, err := ...

  5. 第三方应用 flashfxp,filezilla提权

    filezilla 提权 filezilla 开源的ftp服务器 默认监听14147端口 默认安装目录下有个敏感文件 filezillaserver.xml(包含用户信息) filezillaserv ...

  6. IDEA配置tomcat报错

    昨晚想Eclipse转IDEA,谁知道在tomcat就卡住了,难受.今天一下就解决了,记录一下(没有保存错误信息的截图[/敲打]). 问题描述: 运行的时候tomcat卡在Deployment of ...

  7. Leetcode Tags(8)Binary Search

    一.475. Heaters 输入: [1,2,3],[2] 输出: 1 解释: 仅在位置2上有一个供暖器.如果我们将加热半径设为1,那么所有房屋就都能得到供暖. 输入: [1,2,3,4],[1,4 ...

  8. django-MVT设计模式

    MVT:Models.Views.Templates Model:封装数据库,对数据库进行访问,对数据进行增删查改等. View:业务逻辑的一些操作. Templates:展示. 而MVC主要的流程如 ...

  9. background-origin背景图片定位

    语法 background-origin: padding-box|border-box|content-box; background-Origin属性指定background-position属性 ...

  10. day3------基本数据类型int, bool, str,list,tuple,dict

    基本数据类型(int, bool, str,list,tuple,dict) 一.python基本数据类型 1. int  整数. 主要用来进行数学运算 2. str  字符串, 可以保存少量数据并进 ...