git回退之git reset
参考
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的更多相关文章
- 学Git,用Git ③
不知道我前面是否将git讲清楚了,这里再稍微总结一下git的一个重要功能用法,同时增加两个很实用的git使用技巧. 1.git"读档"与git"回退" 我发现我 ...
- [原]git的使用(一)---建立本地仓库、add和commit、status和git diff、版本回退使用git reset
在window下已经安装了git的环境 1.建立本地仓库 mkdir test #建立test目录 cd test #进入目录 git init # ...
- Git命令之回退篇 git revert git reset
Git command之回退篇 欲练回退 必先了解:HEAD.index.WorkingCopy HEAD: 当前所在的分支版本顶端的别名,也就是最新的一次commit. git commit 之后与 ...
- Git回退---reset和revert
今天学习了git回退的两个命令,现在总结一下: 1.git reset 如果想回退错误的提交C和D,只要把指针移到B上 git reset --hard a0fvf8 而这时候,远程仓库的指针还在D上 ...
- Git 中的回退操作:reset 和 revert
Git 中回退有 reset 和 revert,这两个的区别就是是否保留更改记录 假设当前的提交情况是:A <- B <- C <- D <- HEAD,如下图: 当前是 D, ...
- 『现学现忘』Git后悔药 — 31、reset版本回退命令总结
目录 1.--soft回退说明 2.--mixed回退说明 3.--hard回退说明 4.总结 在Git中进行版本回退需要使用git reset命令. 以前面文章中的示例为例,当我准备在V4版本,回退 ...
- git 远程仓库版本的回退以及git reset 几种常用方式记录
由于 github push 了两个比较潦草的commit, 自己很不满意,又不想重新开vpn进行上传,所以找了一下相关的教程. 最后研究了一下,原理为先在本地还原到你想要的commit,然后强制pu ...
- 代码回滚:git reset、git checkout和git revert区别和联系
git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...
- git reset、git checkout和git revert的区别
这三个git命令都是用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于commit层面,还可以作用于file层面Reset在commit层面,reset通过移除当前分支的一些节点来实现版本回滚; ...
随机推荐
- React学习系列之(1)简单的demo(React脚手架)
1.什么是React? React是一个一个声明式,高效且灵活的用于构建用户界面的JavaScript库.React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 ...
- CSAPP: 位操作实现基本运算
目录 实验要求 实现代码 1.pow2plus1 2.pow2plus4 3.bitXor 4.tmin 5.isTmax 6.allOddBits 7.negate 8.isAsciiDigit 9 ...
- 使用docker-compose部署nginx+gunicorn+mariadb的django应用
目录 1. docker-compose 项目的组织目录 2. 构建 mysql 容器 3. 构建 django-blog 容器 4. 构建 nginx 容器 5. docker-compose.ya ...
- F#周报2019年第43期
新闻 F# eXchange 2020--征文通知 FSSF在忙什么?2019年第三季度版本 Miguel强烈推荐使用TensorFlow.NET 运行在ASP.NET Core 3上的SAFE-Bo ...
- 一个简洁漂亮的jQuery拖放排序插件DDSort
拖放排序是WEB应用中常见的功能.虽然网上有很多别人已经造好的轮子,但是就我个人而言,没事就喜欢研究原理,自己造轮子,不管强大与否,简洁够用就是我的目标,再一个就是自己写的东西,应用起来得心应手,修改 ...
- JavaScript Array返回值以及是否改变原数组。
1. push:最后一位新增://改变原数组 arr.push("123"); 返回值是数组的长度: var b = ...
- 你不知道的DIV+CSS的命名规则
搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前比较好的CSS+DIV的命名规则 1DIV CLASS或者ID 页头:header 登录条 ...
- 音视频入门-11-PNG文件格式详解
* 音视频入门文章目录 * PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节 ...
- 第一章、Python环境搭建
一.安装Python解释器 Windows下 Python开发环境搭建 1.官网下载: https://www.python.org/downloads/ 2.选择对应的版本 3.双击运行 4.选 ...
- PHP的陷阱
PHP的陷阱 写代码的时候有个疑惑,那就是数组下标不存在的时候就会挂掉Undefined Index XXXX,这是对的,但是有时候他就不报错,这又是矛盾的. 请看下面的例子: $json_raw = ...