当前位置: 首页 > news >正文

git命令——revert、reset

参考:如何在 Git 中重置、恢复,返回到以前的状态

使用git时,如果对刚刚提交的后悔了怎么办,如何撤销?

方法一:手动修改

你把新增的文件删了 或者 更改过的文件再改回来,然后再commit一次。这种方式不推荐,当修改量大的时候根本法没法搞,虽然git diff可以帮助我们在最近两次提交上做对比,但依然很难操作

方法二:使用reset命令

实际上,可以将reset其视为rollback(回滚”)- 将你的local environment指向以前的commit。 “本地环境”包括:local repository(本地存储库), staging area(暂存区域), and working directory(工作目录)。

下图是Git中的一系列提交记录。 Git中的分支可以想象成一个指向特定提交命名的可移动指针。 在这种情况下,我们的主分支指向commit链中最新的提交。

查看提交历史记录

$ git log --oneline
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line
View Code

试想如果我们回滚到先前的提交会发生什么? 简单 - 我们只需移动branch pointer(分支指针),Git提中reset命令就是为我们执行此操作的。 例如,如果我们想要将master重置为指向当前提交的两个提交,我们可以使用以下任一方法:

$ git reset 9ef9173
View Code

或者

$ git reset current~2
View Code

下图显示此操作的结果。 在此之后,如果我们在当前分支(master)上执行git log命令,我们将只看到一个提交。

$ git log --oneline
9ef9173 File with one line
View Code

git reset命令还包括一些列参数,这些参数允许你使用最终提交的内容更新本地环境的其他部分。 这些选项包括:

hard:重置repository中branch pointer的指向,使用commit的内容填充working directory ,以及重置staging area(暂存区域)。

soft:仅重置repository中branch pointer的指向。

mixed:(默认值)重置repository中branch pointer的指向。重置staging area(暂存区域)。

使用这些选项在目标环境中非常有用,例如git reset --hard <commit sha1 | reference>。 这会覆盖您尚未提交的任何本地更改。 实际上,它会重置(清除)staging area,并使用使用commit的内容填充working directory 。 在使用hard选项之前,请确保这是您真正想要做的事情,因为该命令会覆盖任何未提交的更改。

方法三:使用revert命令

git revert命令的净效果类似于reset,但其方法不同。 通常,reset的做法是移动分支指针到commit链其他位置,进而实现撤销更改。revert命令会在链的末尾添加新的提交以“取消”更改。 见下图,返回到只有两行的版本的一种方法是reset当前提交,即git reset HEAD~1。另一种转到两行版本的方法是添加一个删除三行版本的新提交 - 效果上等价于取消三行那个版本。 这可以使用git revert命令完成,例如:

$ git revert HEAD
View Code

由于这会添加一个新的提交,Git会提示commit消息:

Revert "File with three lines"
This reverts commit b764644bad524b804577684bf74e7bca3117f554.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       modified:   file1.txt
#
View Code

下图为revert操作后的commit链情况

如果我们执行git log,会看到之前的提交记录

$ git log --oneline
11b7712 Revert "File with three lines"
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line
View Code

当前工作目录内容是

$ cat <filename>
Line 1
Line 2
View Code

选择revert还是reset?

如果您已经将commit链推送到远端仓库(其他人可能已经提取代码并开始使用它),则revert是一种让他人获取更改的非常友好的方式。这是因为Git工作流很适合在分支结束时获取额外的提交,这是因为 Git 工作流可以非常好地在分支的末端添加提交,但是当有人 reset 分支指针之后,会导致一些分支再也看不见(如果你记得住那些分支的sha1,是可以在reset回来的。但是怎么可能有人记得住那么多sha1)。

使用Git时的一个基本规则:在本地存储库中进行这些类型的更改,reset、revert都没关系。但是,如果提交已经被推送到远程仓库而其他人可能正在使用它们的话,则不要做影响commit历史纪录的更改。

简而言之,如果你rollback,undo或rewrite其他人正在使用的commit链的历史记录,那么当他们尝试根据他们提取的原始链合并更改时,他们将会很头疼。 如果您必须对已经被推送并且正由其他人使用的代码进行更改,请在进行更改之前考虑进行通知,让他人有机会合并自己的更改。 然后他们可以在侵权操作后提取新的副本而无需合并。

你可能已经注意到,在我们完成reset后,原始提交链仍然存在。 我们移动分支指针并将代码重置为先前的commit,但它没有删除任何提交。 这意味着,只要我们知道分支指针的sha1,我们还能指回来。

git reset <sha1 of commit>

在替换commit时,我们在Git中执行的大多数其他操作中都会发生类似的事情。 创建新提交,并将分支指针移动到新的commit。 但旧的commit仍然存在。

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/9948459.html

相关文章:

  • 如何高效的使用 Git
  • opencv模板匹配有趣的链接
  • 好看的字体—方正粗倩
  • PAT 1041 Be Unique[简单]
  • 创建Cloudhbase维表
  • 新项目流程--安装yii框架
  • 我写的Angular相关的文章
  • 给Python新人练手准备的两个简单案例
  • js中的 substr方法与substring方法 不同
  • 程序猿生存指南-13 再见老潘
  • 小程序获取unionId以及手机号
  • 一道小编程题(自用)
  • eclipse中类和方法添加作者日期说明
  • Mongodb网页图形化管理工具,基于Spring Boot2.0,前端采用layerUI实现
  • 【小坑】awvs安装出现:database service cannot be started错误
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C语言笔记(第一章:C语言编程)
  • Javascript Math对象和Date对象常用方法详解
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • learning koa2.x
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python 反序列化安全问题(二)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Swift 中的尾递归和蹦床
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 入门到放弃node系列之Hello Word篇
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浏览器事件循环的本质
  • 找一份好的前端工作,起点很重要
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​ubuntu下安装kvm虚拟机
  • $.each()与$(selector).each()
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C语言)fread与fwrite详解
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .equals()到底是什么意思?
  • .NET DataGridView数据绑定说明
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net wcf memory gates checking failed
  • .net反编译工具
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @RestControllerAdvice异常统一处理类失效原因
  • @拔赤:Web前端开发十日谈