revert_revert之后后悔了 - CSDN
精华内容
参与话题
  • 在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。 二、背景...

    2019/7/27 修改更新

    一、问题描述

    在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。

    二、背景知识

    git的版本管理,及HEAD的理解

    使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:
    这里写图片描述

    三、解决方法

    方法一:git reset

    原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:
    这里写图片描述
    适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

    具体操作:

    1. 查看版本号:
    可以使用命令“git log”查看:
    在这里插入图片描述
    也可以在github网站上查看:
    这里写图片描述
    2. 使用“git reset --hard 目标版本号”命令将版本回退:
    这里写图片描述
    再用“git log”查看版本信息,此时本地的HEAD已经指向之前的版本:
    在这里插入图片描述
    3. 使用“git push -f”提交更改:
    此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧:
    这里写图片描述
    所以我们要用“git push -f”强制推上去,就可以了:
    这里写图片描述
    在github图形化界面上看,远程库的HEAD也已经指向目标版本:
    这里写图片描述

    回退成功!

    方法二:git revert

    原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
    这里写图片描述
    适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

    具体操作:

    举个例子,现在库里面有三个文件:READ.md、text.txt、text2.txt。
    在这里插入图片描述
    1. 查看版本号:
    可以通过命令行查看(输入git log):
    如图,最近的两个版本分别叫:“add text.txt”(即新增了文件text.txt)、“add text2.txt”(新增了文件text2.txt)。这个时候我们不需要text.txt这个文件了,那就是说不想要“add text.txt”那个版本的操作,那可以通过反做“add text.txt”这个版本来实现。
    在这里插入图片描述
    也可以通过github网站图形化界面查看版本号:
    在这里插入图片描述
    2.使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
    (1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为8b89621的版本:

    git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
    

    注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
    (2)提交,使用“git commit -m 版本名”,如:

    git commit -m "revert add text.txt" 
    

    此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本,该版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:
    在这里插入图片描述
    3.使用“git push”推上远程库:

    git push
    

    查看github上显示的远程库版本信息:
    在这里插入图片描述
    此时查看仓库的文件,剩下两个:READ.md、text2.txt
    在这里插入图片描述

    反做成功!

    展开全文
  • 三步学会reset和revert回滚,撤销revert

    千次阅读 2018-12-06 17:58:45
    revert  $ git revert commit id $ git commit $ git push  reset 慎用 $ git reset --hard comm...

                                                          revert 

    $ git revert commit id

    $ git commit

    $ git push


                                                         reset 慎用


    $ git reset --hard commit id

    $ git push -f


                                        线上revert了部分功能,但是现在又要恢复了怎么办?

    revert的时候会产生记录,生成commit ID。revert后就无法提交之前revert的内容了,因为记录上有相同的commit id。所以恢复代码只需要!!!!嗯,再执行一下revert 即可。

    $ git revert commit id

    $ git commit

    $ git push

     


                                                  小小总结说明下

    <commit id> 每次commit的SHA1值. 可以用git log 看到,也可以在页面上commit标签页里找到.

    revert撤销:

    一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。你会在git log清楚的看到你回滚的操作所影响的代码,并且会产生一个新的commit id。

    总结就是:用一个新提交来消除一个历史提交所做的任何修改,记录明确。

    reset撤销:

    回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换。当检测到文件路径时,git reset 将缓存区同步到你指定的那个提交

    总结就是:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,无记录。

     

     

    展开全文
  • git revert 用法

    2018-08-27 11:01:41
    git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交  * git revert HEAD 撤销前一次 commit  * git revert HEAD^ 撤销前前一次 commit  * git revert...

    git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
    作为一次最新的提交
        * git revert HEAD                  撤销前一次 commit
        * git revert HEAD^               撤销前前一次 commit
        * git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
    git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
    版本会递增,不影响之前提交的内容

    --------------------------------------------------------------------------------------------------------------------------------------------

    git revert 和 git reset的区别 
    1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 
    2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。 
    3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

    转自https://www.cnblogs.com/0616--ataozhijia/p/3709917.html

    展开全文
  • git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的commit,如果需要彻底回退,只需要将本次commit * git revert HEAD 撤销前一次 commit * git revert ...

    git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销

    作为一次最新的commit,如果需要彻底回退,只需要将本次commit
    * git revert HEAD 撤销前一次 commit
    * git revert HEAD^ 撤销前前一次 commit
    * git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次commit进行保存。
    * 这时候可以直接使用git push提交本次commit,但是在需要change-ID的场景下,往往会提示需要插入change-ID,按照提示完成插入change-ID的操作后,需要执行

    git commit –amend

    然后重新push到远程分支。

    这里写图片描述

    git维护的代码分为三个部分:当前工作目录,index,git仓库。

    工作目录:git的工作目录是保存当前正在工作的文件所在的目录。如果在不同的分支之间切换可能会引起工作目录中文件的变化。

    Index:git 索引是工作目录和git库目录之间的暂存区,staging area。

    git仓库,就是commit之后的文件,所有的提交都保存于此。

    以上可以通过使用git status查看时的文件进行理解:

    命令中”Changes to be committed“中所列的内容是在Index中的内容,commit之后进入Git Directory。

    命令中“Changed but not updated”中所列的内容是在Working Directory中的内容,add之后将进入Index。

    命令中“Untracked files”中所列的内容是尚未被Git跟踪的内容,add之后进入Index。

    基于上面的基本概念,我们可以比较快速的理解git reset的概念。

    Git reset分为三种,

    git reset –mixed 默认方式,不带任何参数的git reset,只保留源码,回退commit和index 信息。

    实际在操作时,会提示:
    changes not staged for commit:
    use “git add …” to update what will be committed
    use “git checkout – …” xxxxxxxxxxx

    git reset –soft 回退到某个版本,只回退了commit,不会恢复index file一级,如果需要提交直接commit就好。

    changes to be commit:
    use “git reset HEAD …” to unstage

    git reset –hard 回退到某个版本,文件全部回退到当前版本,不可恢复。慎用!!!

    另外,我们可以通过git diff查看两次提交之间的差别。其中特别有用的一条命令是:

    git diff –cached […]:这个命令初学者不太常用,却非常有用,它表示查看已经add进入index但是尚未commit的内容同最后一次commit时的内容的差异。即index和git directory的差异。

    展开全文
  • git revert实战

    万次阅读 2016-05-24 10:29:44
    1.reset revert区别 git reset是直接删除指定的commit,把HEAD向后移动了一下 git revert是一次新的特殊的commit,HEAD继续前进,本质和普通add commit一样,仅仅是commit内容很特殊:提交的内容是与前面普通...
  • Git撤销&回滚操作(git reset 和 get revert)

    万次阅读 多人点赞 2020-01-06 17:50:59
    git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。 暂存区:已经 git add xxx 进去,且未 git commit xxx 的。 本地分支:已经git commit -m ...
  • Git 之 revert (撤销commit或merge)

    千次阅读 2018-09-14 15:01:10
    Git 之 revert - 一入前端深似海 - SegmentFault 思否 https://segmentfault.com/a/1190000012897697     Git 之 revert (撤销commit或merge) revert 可以取消指定的提交内容。 当讨论 revert 时,需要分两种...
  • 【git】revert

    2018-03-31 23:18:19
    git revert commit-id:这条命令的含义是,以一个“反向”补丁的形式,逆向执行commit-id的操作,最终新添加一个commit。常见的是revert HEAD,即撤销上一次的提交。那么,如果commit-id不是HEAD呢?比如v1,v2,v3...
  • git revert 删除某次commit

    万次阅读 2018-08-22 10:58:44
    git revert 删除撤销某次commit,此次操作会作为一次新的commit 提交,同时不会影响之前的commit记录  * git revert HEAD 撤销前一次 commit  * git revert HEAD^ 撤销前前一次 commit  * git revert commit_id...
  • git 中revert一个文件

    万次阅读 2011-12-12 12:19:36
    我的一个文件add到了index里,状态是暂存的。 于是我reset里一下,把暂存状态去掉,变为未处理。 再checkout这个file,也就revert
  • D 如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revertgit revert B^..D 这样就把B,C,D都给revert了,变成:A-&gt; B -&gt;C -&gt; D -&gt; D'-&gt; C' -&gt; B...
  • linux下svn revert递归恢复

    千次阅读 2014-04-29 11:08:23
    svn revert . -R
  • git revert的使用

    万次阅读 2017-01-24 16:32:50
    当项目需要回滚时,就需要用到git revert或git reset命令。git revert和git reset的区别就是revert 是将之前的提交反转(新增就删除),然后作为一次新的提交;reset commit_id是回滚到该commit_id下,该commit_id...
  • SVN命令行做revert

    千次阅读 2012-12-26 16:50:04
    svn命令行revert指定文件: # svn revert filename svn命令行revert指定文件夹 # cd some/folder # svn revert `svn status`
  • git egit 如何 revert恢复原来代码

    万次阅读 2016-08-26 12:26:37
    egit中没有revert选项,因为在git术语中revert代表了再提交一次回退之前的提交(revert in git lingo means create a new commit to revert an earliercommit.) 整个项目reset (svn revert) git 中把提交前回退...
  • svn revert整个目录

    千次阅读 2014-02-24 09:42:40
    原文地址:... ...子命令Svn revert — 取消所有的本地编辑。...子命令Svn revert PATH...描述 Reverts any local changes to a file or directory and resolves any conflict
  • 如果我们在7这里选择revert to this version那么7之后的8,9,10的操作都会被消除 如果在7选择revert changes from this version那么7版本的修改将会被消除 如果同时选择7,8 revert changes from this version那么7...
  • 比如当我们git revert的时候, git revert  Git会抱怨: is a merge but no -m option was given 这是因为你revert的那个commit是一个merge commit,它有两个parent, Git不知道base是选哪个parent,就没法diff...
  • Revert changes from this revision 复原此版本作出的修改 (是分支的撤销还原,挑选还没有合并需要还原的分支版本) Revert to this revision 复原到此版本 (是版本的整个撤销还原,无法挑选其中需要的版本,只能选择一...
  • Git学习笔记3 git revert

    万次阅读 2012-06-01 00:34:00
    我们难免会因为种种原因 执行一些错误的commit / push,git提供了revert命令帮助程序员修复这样的错误。 举个例子,下图是git commit 的历史记录 git revert 命令会通过一个新的commit 来使仓库倒退一个commit,...
1 2 3 4 5 ... 20
收藏数 41,731
精华内容 16,692
关键字:

revert