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

git reset和git revert的区别

前提条件

假设现在有三次提交到remote repository:

commit abf94bdf743e23737950c36bda381d2aba1803fc(HEAD -> master, origin/master)
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:36:39 2021 +0800

    feat add 3.go

commit 181cc7131acc18f248aba4638439054e886d695a
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:36:09 2021 +0800

    feat add 2.go

commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:35:16 2021 +0800

    feat add 1.go

git reset --hard 命令

git reset 重置的是HEAD指针,是把HEAD指向指定的commit,此指定的commit之后的所有提交都不存在,也不会留下任何的痕迹!!!!!!!!!
如,使用git reset --hard命令:

	git reset --hard 75cbe2918cb11e444be085da6890c6d3ecfd71eb #第一次提交的commit id,此时HEAD指针位于第一次提交的地方

使用git log查看提交日志时,如下:

	git log
	commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
	Author: ztenv <class7class@qmm.com>
	Date:   Tue Sep 21 16:35:16 2021 +0800

    feat add 1.go

此只仅仅重置了本地的HEAD,还需要将期强推到remote,如下:

	git push origin --force

上面的命令执行成功后,可以看到远端只能看到commit了一次,第2、3次的提交已经不存在了

特别注意:这种操作一但发生成,不可逆的(除非在队友没有更新的前提下使用他本地的repository恢复),也不会留下任何的痕迹!!!!总之,慎之又慎吧。

git revert 命令

git revert命令是用来**revert(恢复)**某一个commit提交的内容的(不会影响其他的commit),可以理解为是某一次commit的逆运算(即:把增加的删除、把删除的加回来,做一次commit的逆运算), git revert commit_id成功之后,会生产一次新的提交,并且commit_id的影响将不会存在于git revert之后的commit,但是在git revert之前的commit中还是能看得到commit_id的改动的(有点乱,。。。。。)

如果revert的commit被后续的commit所依赖,那么会产生编译错误,如:commit20依赖了commit5声明的变量,当revert commit5之后,就会导致commit20编译失败)

如上面提前条件所示,如果想删除 2.go而保留1.go和3.go,revert的命令如下:

	git revert 338bf3e30983d34074f37a18b3ff80ea9bca75f0  # 第二次commit的id

执行上面的命令后,已经revert(恢复)了第二次commit的影响(第二次commit增加了2.go,revert而进行逆运算——删除2.go),并且多了一次commit(现在有4次commit了),使用git log得到如下结果:

commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb (HEAD->master, origin/master)
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:40:39 2021 +0800

	Revert "feat add 2.go"
    This reverts commit 181cc7131acc18f248aba4638439054e886d695a

commit abf94bdf743e23737950c36bda381d2aba1803fc
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:36:39 2021 +0800

    feat add 3.go

commit 181cc7131acc18f248aba4638439054e886d695a
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:36:09 2021 +0800

    feat add 2.go

commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
Author: ztenv <class7class@qmm.com>
Date:   Tue Sep 21 16:35:16 2021 +0800

    feat add 1.go

git reset和git revert都是属于重新恢复工作区以及远程提交的方式,但这两种操作有着截然不同的结果:

git reset

是将之前的提交记录全部抹去,将 HEAD 指向自己重置的提交记录,对应的提交记录都不复存在;
在这里插入图片描述

git revert

操作是将选择的某一次提交记录 重做,若之后又有提交,提交记录还存在,只是将指定提交的代码给清除掉。
在这里插入图片描述


http://www.kler.cn/a/17050.html

相关文章:

  • 数字后端教程之Innovus report_property和get_property使用方法及应用案例
  • 详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
  • Nuxt 版本 2 和 版本 3 的区别
  • 2024/11/13 英语每日一段
  • MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • JDBC详解(三):使用PreparedStatement实现CRUD操作(超详解)
  • java基础入门-02-【面向对象】
  • Android开发 我的开源Android Log “日志狗”LogDog
  • 《通过十几轮数据进行模型训练,实现精确的无创血糖测量的演绎学习》阅读笔记
  • CC2642 读取和设置FEATURES
  • path/to/sdkmanager --install “cmdline-tools;latest“
  • k8s搭建教程
  • 内网渗透(六十一)之Kerberosating攻击
  • MySQL知识学习02(MySQL索引详解)
  • 【软考高级】2022年系统分析师综合知识
  • [java]云HIS运维运营分系统功能实现(springboot框架)
  • 【Java笔试强训 4】
  • 08-Vue技术栈之过度与动画
  • 如何使用CSS和JS实现一个响应式的滚动时间轴
  • 你最关心的4个零代码问题,ChatGPT 帮你解答了!
  • Python基础合集 练习22 (错误与异常处理语句2)
  • 【Spring6】| Spring6整合JUnit
  • 【Git】‘git‘ 不是内部或外部命令,也不是可运行的程序
  • 2016 ICPC合肥站 传递 HDU-5961(拓扑排序 / bitset / 暴力(可hack))
  • 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。