https://blog.csdn.net/longintchar/article/details/81843048

1、三棵树。

此时如果我们运行 git status,会发现没有任何改动,因为现在三棵树完全相同。

修改文件

现在我们想要对文件进行修改然后提交它。我们将会经历同样的过程;首先在工作目录中修改文件。 我们称其为该文件的 v2 版本,并将它标记为红色。

如果现在运行 git status,我们会看到文件显示在 “Changes not staged for commit” 下面,并被标记为红色,因为该条目在索引与工作目录之间存在不同。 接着我们运行 git add 来将它暂存到索引中。

再次添加到索引

此时,由于 Index 和 HEAD 不同,若运行 git status 的话就会看到 “Changes to be committed” 下的该文件变为绿色 ——也就是说,现在预期的下一次提交与上一次提交不同。 最后,我们运行 git commit 来完成提交。

再次提交

现在运行 git status 会没有输出,因为三棵树又变得相同了。

切换分支或克隆的过程也类似。 当检出一个分支时,它会修改 HEAD 指向新的分支引用,将索引填充为该次提交的快照,然后将索引的内容复制到工作目录 中。

reset 的作用
在以下情景中观察 reset 命令会更有意义。

为了演示这些例子,假设我们再次修改了 file.txt 文件并第三次提交它。 现在的历史看起来是这样的:

第 1 步:移动 HEAD
reset 做的第一件事是移动 HEAD 的指向。 这与改变 HEAD 自身不同(checkout 所做的);reset 移动 HEAD 指向的分支。 这意味着如果 HEAD 设置为 master 分支(例如,你正在 master 分支上),运行 git reset 9e5e6a4 将会使 master 指向 9e5e6a4。

结合上图,我们理解一下发生的事情:它本质上是撤销了上一次 git commit 命令。 当你在运行 git commit 时,Git 会创建一个新的提交,并移动 HEAD 所指向的分支来使其指向该提交。 当你将它 reset 回 HEAD~(HEAD 的父结点)时,其实就是把该分支移回原来的位置,而不会改变索引和工作目录。

第 2 步:更新索引(–mixed)

接下来,reset 会用 HEAD 指向的当前快照的内容来更新索引。

如果指定 –mixed 选项,reset 将会在这里停止。 这也是默认行为,即如果没有指定任何选项(在本例中是 git reset HEAD~),reset 将会在这里停止。

现在再看一眼上图,理解一下发生的事情:它依然会撤销一上次提交,但还会取消所有暂存。 于是,我们回滚到了所有 git add 和 git commit 的命令执行之前。

第 3 步:更新工作目录(–hard)
如果使用 –hard 选项,reset 要做的的第三件事情就是让工作目录看起来像索引。

现在让我们回想一下刚才发生的事情:你撤销了最后的提交(git commit )、git add 和工作目录中的所有工作。

必须注意,–hard 标记是 reset 命令唯一的危险用法,它也是 Git 会真正地销毁数据的仅有的几个操作之一。其他任何形式的 reset 调用都可以轻松撤消,但是 –hard 选项不能,因为它强制覆盖了工作目录中的文件。

总结

reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

  1. 移动 HEAD 指向的分支 (若指定了 --soft,则到此停止);
  2. 重置 index 以便和 HEAD 相匹配 (若未指定 --hard,则到此停止);
  3. 使工作目录看起来像索引

转载于:https://www.cnblogs.com/igoodful/p/10685680.html

git之reset图解相关推荐

  1. Git很简单--图解攻略

    Git Git 是目前世界上最先进的分布式版本控制系统(没有之一) 作用 源代码管理 为什么要进行源代码管理? 方便多人协同开发 方便版本控制 Git管理源代码特点 1.Git是分布式管理.服务器和客 ...

  2. **Git本地仓库图解

    Git基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录 ...

  3. Git 重置reset,检出checkout和回滚revert(reverse)有什么区别?

    checkout主要用来用暂存区的内容覆盖工作区,达到撤销工作区修改.另一个是用来切换和创建分支. 参考文章:Git检出(checkout) revert(reverse)回滚(反做):撤销某个com ...

  4. git rebase/reset小计

    http://www.cnblogs.com/kym/archive/2010/08/12/1797937.html git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新 ...

  5. 记一次git硬reset导致的代码消失

    最近项目比较敢,心情烦躁,想取消一个commit,于是不知咋地鬼使神差地reset current brand to here,就这样 还点了hard 然后,辛苦写的代码就这样没有了... 此次反映出 ...

  6. git 忽略__pycache___图解git,用手绘图带你理解git中分支的原理和应用

    大家好,今天我们来聊git当中一个非常非常重要的特性,就是branch. git branch可以说是git当中最重要的概念了,甚至没有之一.因为git最重要的使用场景就是协同开发,大家一起在一个项目 ...

  7. git flow reset 3种详解

    git reset –mixed HEAD~2:保留源码 撤销提交 再次add提交即可 git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级. ...

  8. Git之Reset的三种模式

    前言 使用场景:当commit的内容有错误,需要回撤到之前的某个版本时. git reset一句话概括: git-reset - Reset current HEAD to the specified ...

  9. git pull远程master_github与Git实用操作图解之一

    1. git和github工具的联系 2. github创建Git 仓库 New repository -> repository name(仓库名称) ->Public(免费) -> ...

最新文章

  1. laravel homestead环境默认账号密码
  2. Java如何转换protobuf-net中的bcl.DateTime对象
  3. Java多线程学习九:如何正确关闭线程池?shutdown 和 shutdownNow 的区别
  4. 互联网+医疗考验无线部署 飞塔SAA同频部署模式巧妙化解
  5. 黑科技神器-uTools
  6. java实现排序的几种方法
  7. gg修改器偏移量修改_GG修改器偏移是怎么弄 | 手游网游页游攻略大全
  8. linux制作flash软件,Linux 下的三款 Flash 独立播放器
  9. 计算机技术在印刷中的应用,网络技术在印刷中的应用技巧
  10. opencv3和opencv4多线程内存泄漏问题
  11. 阿里云产品分析(PPT)
  12. SUN SPARC T4-4电源故障引起的宕机
  13. 边境的悍匪—机器学习实战:第一章 机器学习的基础知识
  14. 2、异常值(outliers)检测:业务法、Z-score、3σ准则、箱线图
  15. 开发软件的步骤是什么
  16. python编写英文字典_python如何制作英文字典
  17. 出书最多--map值排序
  18. Django 实现单点登录(SSO)
  19. 任天堂服务器维护12月1,任天堂明星大乱斗12月14日更新公告 1.2.0更新补丁说明...
  20. 安卓统一推送联盟,终于有消息了,统一推送时间表出炉

热门文章

  1. android中文字中间有超链接的实现方法
  2. ORA-19809: 超出了恢复文件数的限制
  3. 如何避免重构带来的危险
  4. Linux中如何配置IP
  5. 行情分析:下杀或不可持续,市场大概率继续震荡
  6. aws lambda使用_使用AWS Lambda安排Slack消息
  7. 浏览器获取浏览历史_浏览器历史的未来
  8. 裸奔的支付X聊天,你还敢用吗?
  9. 红旗linux桌面版反应慢,红旗Linux6.0桌面版使用感受
  10. colsure php_PHP Closure(闭包)类详解