首页 > 其他分享 >使用 git reset 命令回退历史

使用 git reset 命令回退历史

时间:2024-09-28 10:23:36浏览次数:8  
标签:reset HEAD git -- 回退 commit 分支

基于:git reset 命令详解(一)—— Git 学习笔记 07

建议先阅读 Git 工作区、暂存区和版本库Git 分支本质及与 commit、HEAD、tag 的关系

简介

git reset命令是用来将当前 branch 重置到另外一个 commit 的,也就是用来回退到指定 commit,根据不同的参数,这个动作可能同时影响到 Index 以及 Working Directory。

先举个例子,来一个感性的认识。下面这两条命令让 hotfix 分支向后回退两个提交。

git checkout hotfix
git reset HEAD~2
这里写图片描述

hotfix 分支末端的两个提交现在变成了孤儿提交。下次 Git 执行垃圾回收的时候,这两个提交会被删除。如果你的提交还没有共享给别人,可以用git reset撤销这些提交。

reset 的作用

假设仓库历史是这样:

这里写图片描述

现在,假设我们运行git reset HEAD~(后面可能会跟不同的参数)。

1、移动 HEAD(--soft)

使用--soft参数时,reset 会移动 HEAD 的指向。这与改变 HEAD 自身不同(checkout 所做的),reset 移动 HEAD 指向的分支。这意味着如果 HEAD 设置为 master 分支(例如,你正在 master 分支上),运行git reset --soft 9e5e6a4将会使 master 指向 9e5e6a4。

这里写图片描述

使用reset --soft,仅仅会改变分支指向。

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

2、更新索引(--mixed)

git reset默认参数为--mixed,也就是git reset 9e5e6a4等价于git reset --mixed 9e5e6a4

如果运行git reset --mixed 9e5e6a4,除了像git reset --soft 9e5e6a4那样改变分支指向外,还会用 HEAD 指向的当前快照的内容来更新索引。

这里写图片描述
结合上图可知:此时依然会撤销一上次提交,但还会取消所有暂存。于是,我们回滚到了所有 git add 和 git commit 的命令执行之前。

3、更新工作目录(--hard)

如果使用 --hard 选项,reset 将会在 --mixed 的基础上,让工作目录和索引保持一致(不考虑忽略文件之类)。

这里写图片描述

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

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

总结

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

  1. 移动 HEAD 指向的分支(若指定了--soft,则到此停止);
  2. 重置 Index 以便和 HEAD 相匹配(若未指定--hard,则到此停止);
  3. 使工作目录和索引保持一致。

标签:reset,HEAD,git,--,回退,commit,分支
From: https://www.cnblogs.com/Higurashi-kagome/p/18437077

相关文章

  • 使用 Git 帮助文档
    聊聊如何更好地查阅官方文档。‍githelp学习某个工具,官方文档是少不了的,也是最权威的。我们可以使用githelp来查看帮助,该命令会列举出常用的命令和介绍:>githelpusage:git[--version][--help][-C<path>][-c<name>=<value>][--exec-path[=<path>]][-......
  • 2款.NET开源且免费的Git可视化管理工具
    Git是什么?Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。Git最初是由Linux开发者LinusTorvalds创建的,它具有高效、灵活、稳定等优点,如今已成为软件开发领域中最流行的版本控制系统之一。Git使用一种名为“仓库”的数据结构来保存代码......
  • GitHub每日最火火火项目(9.27)
    项目名称:localsend/localsend项目介绍:“localsend/localsend”是一个极具价值的开源项目。它为用户提供了一种跨平台的文件传输替代方案,可媲美AirDrop。在当今数字化时代,人们常常需要在不同操作系统的设备之间传输文件,但并非所有设备都能使用AirDrop。这个项目的出......
  • GitHub的使用
    文章目录一、什么是Git1.1、与其他版本控制系统的区别概念上的差异本地操作数据的完整性附加模型1.2、三种状态和基本Git工作流程Git的基本工作流程二、首次Git设置2.1、Git的安装(Linux)2.2、Git的安装(Windows)2.3、Git配置2.4、配置Git用户2.5、配置默认文本编辑器Emac......
  • Git之5-Gitee(远程仓库)
    我们之前讲的全是在本地电脑上进行的操作,那还不如不用版本控制工具,自己去控制。因此我们团队小组开发,一定要用到远程仓库,这样才能更好地进行版本控制。(不用远程仓库的话,那小组开发只能用同一个U盘,但这样又太荒谬了)。因此我们使用远程仓库gitee。1、注册与创建远程仓库常用......
  • Gitlab分支管理规范和提交代码规范
    gitlab分支管理规范分支说明:测试代码库共有三个分支,main分支、dev分支、release分支--main分支:存放运行稳定的最新代码,一般不直接将未审核的代码合入到main分支--dev分支:存放个人开发的用例脚本,可用于用例故障修复,新的用例开发等--release分支:对应上线的产品版本,在发布......
  • HelpLook VS GitBook,在线文档管理工具对比
    在线文档管理工具在当今时代非常重要。随着数字化时代的到来,人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享,人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协作能力。本篇文章将会聚......
  • git使用
    目录从无到有:如何将一个项目上传到远程仓库一、用户认证1.生成SSH密钥对2.将公钥添加到Gitee3.配置SSH代理二、上传1.在Gitee上创建仓库2.初始化本地项目为Git仓库3.添加文件到Git仓库4.添加远程仓库5.推送代码到远程仓库从有拉取:如何从远程仓库拉取一个项目1.......
  • SciTech-BigDataAIML-Github-
    GeneratinganewGPGkeyGeneratinganewGPGkeyIfyoudon'thaveanexistingGPGkey,youcangenerateanewGPGkeytouseforsigningcommitsandtags.TOCInthisarticleGeneratingaGPGkeyFurtherreadingSupportedGPGkeyalgorithmsGi......
  • [CERC2015] Digit Division 题解
    \(O(n^2)\)做法和大部分人最开始一样,我也想的是DP。设\(dp_i\)表示用前面\(i\)个字符拆分得到的答案。既然是统计方案数,我们肯定是根据前面的答案累加。考虑在\([1,i-1]\)中选择一个\(j\),如果\([j+1,i]\)的字符组成的数字能够被\(m\)整除,那么\(dp_i\)就可以累加......