git reset&git revert 使用

2023-05-16

前言

不管在工作还是个人开发的使用中,或多或少的我们都会接触到git的使用。但是,人非圣贤,总有犯错误的时候,写错代码,提交错误的代码也是在所难免的事情。

但是,不用着急!版本控制工具GIT在设计的时候就给开发者们设计了“后悔药”。当然,如果版本控制连这种功能都没有的话,也就可以淘汰了,好的,废话不多说,接下来就来介绍今天的主角:git resetgit revert的使用以及区别!

博主经历

我是因为在有一次工作的时候因为自己的粗心,在服务器上面修改代码准备验证,不小心将修改commit了(没有push到远程分支),然后。准备编译一个新的版本(编译版本的时候脚本会从远程pull代码),来确定问题的所在点,但是在远程分支上面,有人已经提交了问题所在的代码,这样导致我编译出来的版本因为我的本地commit导致了修改了正确的代码!因为已经commit了,脚本执行的git clean -df也不能清除!当时也没有仔细的看编译log。后面就重新回退了代码,重新pull服务器的代码重新编译,也算是没有出什么大问题,后来,就对git的代码回退总结了一下,记录分享!

共同点

大家都知道,这两个语句都是用来回退代码的,可以回退我们之前的提交。语法的格式为:

git revert <commit_id>
git reset --hard <commit_id>
git reset [--soft] <commit_id>

区别(重点)

两者之间的比较

虽然说git revertgit reset都是用来回退代码的,但是真正在功能上面名副其实回退代码的应该是git reset命令。当我们执行git revert之后,其实整个分支的节奏是向前的,也就是说会产生一次新的提交,只不过这次提交是与对应<commit_id>改动相反的提交,而且一般来说revert是‘回退’一次提交,例如:

git_revert1

git_revert2
从上面的测试可以看出,结果完全符合我们的预期,所以说revert只是功能上面实现了看起来的‘回退’代码,实际是通过新的提交来覆盖之前的修改,接下来我们看看reset是如何操作的:

git_reset1

git_resvet2

从上面的测试可以看出,结果完全符合我们的预期,所以说reset才是真正意义上面的代码回退,因为在执行过完git reset指令之后我们用git log去查看提交日志的时候,发现reset之前的提交已经不见了!实现了真正的代码回退,而且reset回退的是一个区间的的所有提交!

所以,如果我们要回退的是一个commit可能是很久以前的提交,那么肯定使用使用revert来进行操作的,但是如果我们是要回退最新一条的提交或者说是最新的提交到以前的一次提交,那么无疑选择reset是最便捷也更加优雅的方法!

git reset的使用参数作用比较

讲到这里,可能就会有疑问,既然reset直接把提交都删除掉了,那如果我reset错误了一个,那不是闯下了滔天大祸了啊!哈哈,你错了,不要紧,git是可以强行去恢复reset的内容的!

看上面的测试,我在reset的时候添加了–hard的参数,因为快速的reset不经过staged暂存,这种情况的话需要强行才能恢复reset过的内容,但是,如果我们不添加参数或者说添加–soft参数(这两种情况类似)的话,git会把reset操作之后的内容暂存起来,修改如下:

git reset --soft <commit_id>之后的git status:

$ git status .
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.md

在这种情况下面,如果我们需要确认我们的reset操作的话,我们需要执行git reset HEAD <file>...,执行完毕之后会变成下面不添加任何参数的这种情况,然后在执行git checkout .来取消reset产生的修改操作。
git reset <commit_id>之后的状态:

resonLei@resonLei-PC MINGW64 /d/new_website_ssh/my_website (master)
$ git reset 3c4abef54d2a63d0e3db440f6816085d27987b57
Unstaged changes after reset:
M       README.md

resonLei@resonLei-PC MINGW64 /d/new_website_ssh/my_website (master)
$ git status .
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

reset使用总结分析

总结:通过操作的日志可以看出,我们在执行玩reset操作之后,git会认为我们的代码回到了reset对应<commit_id>版本,但是,因为本地的代码是reset之前最新的,所以如果不添加–hard参数的话,通过git status .命令会出现有修改的情况,因为本地的代码跟reset之后的代码存在差异,系统没有直接删除这些内容,而是把这些内容当成了修改。当然,这个修改就是从reset对应<commit_id>reset之前的修改,如果你不需要reset的话,重新add然后commit就可以了,如果你依然执行reset之后的结果,执行git checkout .就可以了,下面为执行不带参数后的reset之后的git diff的结果:

resonLei@resonLei-PC MINGW64 /d/new_website_ssh/my_website (master)
$ git diff
diff --git a/README.md b/README.md
index 9eea745..7386e7f 100644
--- a/README.md
+++ b/README.md
@@ -21,4 +21,4 @@
 ### 聊天室模块
 &emsp;&emsp;使用中的建议聊天功能的实现,主要通过插入和读取数据库的建议操作,定时刷新来实现的,实现增量增加聊天数据!待学习完善!

-
+test git reset

可以看出来的是,本来test git reset这个字段在文件里面是存在的,在我reset到他不存在的地方的时候,git diff显示我们添加了这个字段,表示我们现在git的版本里面已经没有了这一字段,但是系统目前认为你修改了,这个时候你可以采取对应的操作执行即可!

git reset的提交恢复

讲到这里,大概能能够了解这两个命令的基本操作了。但是可能你又会问,如果我reset成功了!也就是使用了–hard参数之后的效果。那么如果现在我发现自己弄错了需要怎么办呢?
最简单的方法就是如果你的远程分支的代码还没更改的话,直接使用git pull就可以了!如果远程分支也跟本地修改的同步了,那么我们可以使用reset命令才重新的回退回去!但是重点就是你必须知道之前的commit id!知道的话直接reset回去就可以了,操作跟上面的基本一致!

PS.代码无价,不想加班,谨慎操作!如果有其他更好的方法回退,留言告知我吧!

远程分支的reset使用

如果要把本地reset之后的代码提交上去,如果直接使用git push命令是不行的,会提示以下的错误,

resonLei@resonLei-PC MINGW64 /d/new_website_ssh/my_website (master)
$ git push
To git.oschina.net:Mr.Lei/my_website.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@git.oschina.net:Mr.Lei/my_website.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这个时候我们需要在后面加上参数,例如:

git push --force

总结

讲到这里基本上revert跟reset我的理解就到这里了。掌握了这两个命令,可以说在git的世界里面也就不怕什么,大不了就会回退呗!谁用谁知道~~~~

最后再说说

几个GIT常用命令介绍

git show <commit_id>   查看对应的修改
git log -p filename    查看对应文件的修改历史日志
git chekcout .         撤销还没有添加的修改
git clean -df          清理工作目录,删除没有添加的文件等
git stash			   暂存工作内容,可以把修改了没有commit的内容保存起来
git stash pop		   等待工作完成之后可以把存起来的工作恢复

结束语

本文只代表个人见解,有很多不清楚和不正确的地方,欢迎纠正修改,共同进步!

我的个人网站,更多文章分享点击吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git reset&git revert 使用 的相关文章

  • 判断 Git 提交是否是合并/恢复提交

    我正在编写一个脚本 需要检查特定提交是否是合并 恢复提交 我想知道是否有 git 技巧 到目前为止我想到的 我绝对不想依赖这里的提交消息 是检查HASH 2看看我是否没有收到错误 是否有更好的方法 判断某个东西是否是合并很容易 这是不止一位
  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

    我有一个大项目 比方说A repo 其中有一个子文件夹来自B repo 当我提交时 我会遇到如下警告A repo warning adding embedded git repository extractor annotator serv
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • GitHub API:标记提交所属(与 git describe --tag 并行)

    我正在使用 GitHub API 进行实验octokit https github com octokit octokit rb红宝石 我的目标是能够提取提交 SHA 所属的 标签 现在我可以使用命令行轻松地执行此操作 gt git des
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • Git:如何变基到特定提交?

    我想变基到特定的提交 而不是另一个分支的 HEAD A B C master D topic to A B C master D topic 代替 A B C master D topic 我怎样才能做到这一点 您可以通过在您喜欢的提交上创
  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • 哪个是更智能的 git 协议,ssh 或 git(通过 ssh)或 https 协议?

    哪个高效 SSH 或 Git 文件压缩 我对 Git 的理解是 git 协议很智能 因为通信两端都有一个协议代理来压缩文件传输 从而通过有效地使用网络带宽来实现更快的克隆 From 我发现了以下说法 For secure authentic
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • .gitconfig 别名函数调用

    我在 gitconfig 中定义了以下别名 alias teamcity tc tc是我在我的中定义的一个shell函数 bashrc文件 由于某种原因 我收到以下错误 aafghani 03 git workday amirafghani
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • 使用终端时 Git 推送在总计后卡住了?

    我尝试将一些文件推送到Github 总大小只有22 2M 我不知道为什么它在总行之后卡住了 我读过推送到 Github 时 Git 推送挂起 https stackoverflow com questions 16906161 git pu
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My

随机推荐

  • pyspark MLlib基本使用

    MLib 基本概念 MLib其实就是将数据以RDD的形式进行表示 xff0c 在分布式数据集上调用各种算法 使用方法 MLlib中包含能够在集群上运行良好的并行算法 xff0c 如kmeans 分布式RF 交替最小二乘等 xff0c 这能够
  • 一个启动模式为singleTop的activity,如果再次启动会发生什么? 面试官想问的是 onNewIntent()

    Activity有一个 onNewIntent Intent intent 回调方法 xff0c 该方法我们几乎很少使用 xff0c 导致已经将其忽略掉 该方法的官方解释如下 xff1a This is called for activit
  • c++ 中的重载全局new,delete

    最近做一个小项目 xff0c 对c 43 43 又有很多新的理解 实在不的不让人发出感叹 xff0c c 43 43 太强大了 xff0c 绝对不是一朝一夕就可以领悟她的内涵的 首先我们要清楚 xff0c 为什么我们要重载new xff0c
  • 解决AndroidStudio报错问题:Missing essential plugin

    前言 xff1a 今天下载了Android4 2 0Canary14最新版 xff0c 打开时突然报了一个错 xff0c 1 错误现象 xff1a AndroidStudio 无法正常打开 xff0c 打开之后弹出报错窗口显示 xff1a
  • java使用ftp上传文件出现false()

    http blog csdn net beyondlpf article details 9343781这是我解决的的原文地址解析原因 在项目中使用commons net jar实现FTP文件的下载 xff0c 在windows xp上运行
  • keil5在原有工程上修改工程名

    1 在工程文件目录中 xff0c 将1 uvoptx和1 uvprojx名字改成2 uvoptx和second uvprojx 2 其他1 uvoptx文件统统删除 3 打开second uvproj 4 点击 xff0c 在弹出的界面上
  • Systemd 入门教程:命令篇

    原文 xff1a http www ruanyifeng com blog 2016 03 systemd tutorial commands html 一 由来 历史上 xff0c Linux 的启动一直采用init进程 下面的命令用来启
  • 数据分位值计算shell脚本

    数据 sort n perl e 39 64 tp 61 500 75 9 97 99 995 999 64 l 61 lt gt for i 61 0 i lt 64 tp i 43 43 d 61 64 tp i printf 34 T
  • ssh服务器拒绝了密码 请再试一次

    可能原因是 xff1a 第一种情况 xff1a 可能是服务器的密钥改变了 xff0c 然后服务器内部的认证authorized keys变化了 xff0c 可以删除里边你的公钥 xff0c 再重新认证登录下试试 第二种情况 xff1a 21
  • win7频繁提示资源管理器已停止工作解决办法

    今天上班打开电脑 xff0c 总是弹出windows资源管理器已停止工作 xff0c 点击下方的 重新启动 xff0c 又恢复正常 xff0c 但是不一会出现这个问题 xff0c 如此反复 xff0c 差不多一分钟左右出现一次 xff0c
  • Eclipse中在项目右键菜单点击->Maven->Update Projects时,JDK总是切回 1.5

    Maven问题总结 xff1a Eclipse中项目右键菜单中点击Maven gt Update Projects时JDK被重置 Eclipse中在项目右键菜单点击 gt Maven gt Update Projects时 xff0c JD
  • tomcat 日志log4j,slf4j,logback冲突

    问题描述 xff1a 启动tomcat xff0c 发现tomcat无法启动 xff0c catalina out有如下错误日志 xff1a INFO localhost startStop 1 org apache catalina co
  • 详解软件项目管理流程的每一步

    一 项目启动 xff08 项目开工会 xff09 了解项目干系人及其利害关系 所有项目组成员是否到位 xff0c 如到位则拿到项目开发人员的简历 xff0c 详细了解每个开发人员的情况 xff08 可能会组织到客户方面试 xff09 根据项
  • 如何在 CentOS / RHEL 上设置 SSH 免密码登录

    前提配置 xff1a 使用root登录修改配置文件 xff1a etc ssh sshd config xff0c 将其中三行的注释去掉 xff0c 如下 xff1a 然后重启ssh服务 xff1a service sshd restart
  • 进阶问题

    1 用户态和内核态是什么 xff1f 区别在哪 xff1f 2 nginx为什么如此高效 xff1f 为什么http服务不采用nginx同样的策略 xff1f 3 一次完整的http请求的完整过程是什么 xff1f 七层协议每层做了什么 x
  • 跨跳板机登陆服务器shell脚本

    expect shell 自动越过跳板机登陆服务器 span class token comment usr bin expect f span span class token keyword set span password span
  • NSParagraphStyle详解

    NSParagraphStyleAttributeName 段落的风格 xff08 设置首行 xff0c 行间距 xff0c 对齐方式等 xff09 NSMutableParagraphStyle paragraphStyle 61 NSM
  • 程序员5种编程入门方法,如何快速学会一门编程语言?

    程序员要掌握一门语言 xff0c 还是一定要掌握多门语言 xff1f 对于这个问题 xff0c 公说公有理 xff0c 婆说婆有理 然而现实技术更新太快 xff0c 掌握一门编程语言都不容易 同时精通多门语言又谈何容易呢 xff1f 但是
  • android4.0默认界面旋转180

    http my eoe cn 876641 archive 22638 html android4 0默认启动画面和正常显示旋转了180度 xff0c 即为倒立的 原来是屏输出为倒的 xff0c 查找得知可以做旋转 xff1a 步骤 xff
  • git reset&git revert 使用

    前言 不管在工作还是个人开发的使用中 xff0c 或多或少的我们都会接触到git的使用 但是 xff0c 人非圣贤 xff0c 总有犯错误的时候 xff0c 写错代码 xff0c 提交错误的代码也是在所难免的事情 但是 xff0c 不用着急