-
2022-04-08 08:34:24
一、问题描述
在利用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
1
注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
(2)提交,使用“git commit -m 版本名”,如:git commit -m "revert add text.txt"
1
此时可以用“git log”查看本地的版本信息,可见多生成了一个新的版本,该版本反做了“add text.txt”版本,但是保留了“add text2.txt”版本:3.使用“git push”推上远程库:
git push
1
查看github上显示的远程库版本信息:此时查看仓库的文件,剩下两个:READ.md、text2.txt
更多相关内容 -
git revert
2021-01-15 17:23:42git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>… git revert --continue git revert --quit git revert --abort git-revert - 反做版本库中已经存在的提交记录...git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…
git revert --continue
git revert --quit
git revert --abort
git-revert - 反做版本库中已经存在的提交记录,默认情况下反做某条记录后会产生一条新的记录。
通过-n参数可以避免再次产生一条提交记录
-m指定回滚的父节点(当回滚记录是由两分支merge产生)
git revert与git reset的区别?
git revert用于反做某个commit,而git reset是回退到某个commit。假设有四笔提交:commit1,commit2,commit3,commit4,当前HEAD指向commit4,
(1)如果此时执行git revert commit2-hash就会撤销commit2提交,commit3和commit4不影响,默认产生一个commit 5,当前HEAD指向commit 5;
(2)如果此时执行git reset commit2-hash,则会将HEAD指向commit2,后面的commit3和commit4直接没了。
git revert --continue
cherry-pick 或者revert因为冲突失败后,解决了冲突继续提交
git revert --quit
清除git revert 操作进度,在cherry-pick 或者revert因为冲突失败可以清除状态
--abort
Cancel the operation and return to the pre-sequence state.
取消git revert ,回到上一步的状态
-
git reset 命令详解 git revert命令详解。
2022-05-02 17:31:42git reset 命令详解reset命令介绍参数补救git revert命令revert说明举例:命令 reset命令 介绍 git reset 命令格式为: git reset [ --soft | --mixed | --hard ] [< commitid >] 在git的这些命令中git reset...reset命令
介绍
git reset 命令格式为:
git reset [ --soft | --mixed | --hard ] [< commitid >]
在git的这些命令中git reset是最长常用的,也是最危险的最容易被误用的。它的主要参数是:soft,mixed,hard它们告诉git,当执行reset是,要对index和working copy做什么。参数
soft:
–soft参数只将其它的commit重置到你选定的HEAD,index和working copy中的数据不变。
mixed:
–mixed参数是将HEAD和index重置到你选定的HEAD,而working copy不变。
hard:
–hard是将HEAD,index,working copy同时改变到你规定的commit上。
注意:commitid是每次你要回退到的那个commit的id,它可以通过git log获取。补救
如果我们通过git reset --hard将版本回退到之前的版本了,那我们还是可以补救的,先通过git reflog命令,找到要回退的commitId,然后通过命令:git reset --hard commitId来恢复。
git revert命令
revert说明
由于某些文章说的说法可能不是很明确,所以导致一部分小袁同志们对revert有一定的误解,一开始我也很难理解revert到底是干什么的。毕竟用于版本回退的都已经有git reset了,为什么还要再出一个git revert?
其实呢,revert它不会想reset一样”带你回到“那个你指定的提交,并假装那个提交之后的后续提交都没有发生。它是用于单个提交的逻辑否定 -并且单独提交- 保留后续提交。举例:
比如:
我们有一个文件里面写了:提交A 提交B 提交C 提交D
第一次我们把它改成:
提交A 2提交 提交C 提交D
并提交 假设commitId是tijiao1
第二次我们把它改成:
提交A 2提交 提交C 4提交
并提交 假设commitId是tijiao2
之后我们进行revert:
git revert tijiao1
此时结果会变成:提交A 提交B 提交C 4提交
所以我们要知道revert是只撤回指定的提交,并保留后续的提交。
如果你想让版本直接回退到tijiao1并且取消后续所有提交那你应该使用reset。命令
revert分两种,因为commit分两种。
一种是常规的 commit,也就是使用 git commit 提交的 commit;
另一种是 merge commit,在使用 git merge 合并两个分支之后,你将会得到一个新的 merge commit,merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commit,代表该 merge commit 是从哪两个 commit 合并过来的。
常规的revert://撤回指定的任意提交 git revert commitId //撤回最后一次提交 git revert HEAD //撤回倒数第二次提交 git revert HEAD^
merge的revert:加上-m表示撤回哪一个分支的。它的数据是1或2.
//保留第一个分支为主线 git revert -m 1 commitId
-
git回退 git revert 和 git reset 用法
2021-12-13 17:25:17场景 小明在分支 dev1 上开发,提交了 3 次(分别为 c1、c2、c3),发布时需要把 dev1 分支合并到 master 分支上,生成记录 m2,并...使用 git reset 会将 M1 之后的提交都回退掉,所有推荐使用 git revert. git re用法
git reset
用于回退版本,可以指定退回某一次提交的版本。直接删除指定的 commit 之后的记录。
命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
--mixed
为默认,可以不用带该参数,不删除工作空间改动代码,撤销 commit,并且撤销git add
--soft
不删除工作空间改动代码,撤销 commit,不撤销git add
--hard
删除工作空间改动代码,撤销 commit,撤销git add
git revert
用于重做(回滚)指定某一次提交的版本。不会删除 commit 和 history ,且会把这次操作作为一次最新的提交。
命令语法格式如下:
git revert [<options>] <commit-ish>
区别
git revert
是用一次新的 commit 来回滚(重做)之前的 commit ,git reset
是直接删除指定的 commit。- 在回滚操作上看,效果差不多。但是在以后继续合并以前的老版本时有区别。
git revert
是用一次逆向的 commit (重做)之前的提交,因此以后合并老的分支时,会导致这部分改变不会再次出现,但是git reset
是直接把某些 commit 在某个分支上删除,因而和老的分支再次合并时,这些被回滚的 commit 还会被引入。
场景
- 小明在分支 dev1 上开发,提交了 3 次(分别为 c1、c2、c3),发布时需要把 dev1 分支合并到 master 分支上,生成记录 m2,并发布到线上。
- 小王在分支 dev2 上开发,提交了 1 次(c1),然后也把 dev2 分支合并到 master 分支上,生成记录m3,并发布到线上。
- 不幸的是,小名的 dev1 分支上存在 bug,需要回滚 dev1 上的所有提交。
解决
使用
git reset
会将 M1 之后的提交都回退掉, 也就是 M2 和 M3 都会消失,这不符合现在的场景,
所有推荐使用git revert
.
git revert
会生成 M4,M4 上面就没有 dev1 的提交了。
注意:
当 dev1 分支的 bug 修改完成后,在合并到 master 时,之前被重做的内容是不会出现的,也就是 C1、C2、C3 的改变不会再出现,需要再次 revert 掉 M4,生成 M5 后再进行合并。
-
回滚代码 git revert 用法
2022-04-07 19:56:18git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一次最新的提交 git revert HEAD //撤销前一次 commit git revert HEAD^ //撤销前前一次 commit git r. -
使用git revert回退版本
2022-03-12 21:28:52我在这篇文章中介绍了如何使用git reset命令回退版本。 使用git reset回退版本_new9232的博客-CSDN博客_git 回退到最新版本 但是这种方法只适用于同一个分支只有一个人在修改代码。如果同一个分支有多人修改代码时... -
git revert 怎么使用
2021-04-09 11:39:35git revert 是回退某个版本(之后的提交记录会保留并生成一个新的commit) 适用场景:如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。 具体... -
git revert是个好东西
2021-12-09 14:37:00revert大家用的比较少,很多细节可能不知晓,所以这次聊一下git revert的使用,希望大家不会用到它。 -
【git】git revert后需要注意点
2021-12-16 10:37:11git revert这个操作用的比较少,如果分支支持强推那必然强推,不支持强推的情况,你就需要用这个命令,然后团队的人需要补一下使用该命令的坑。 注意点 比如你不小心将测试分支代码合并到master分支上。 当... -
git revert 用法
2020-10-28 16:32:13git revert 撤销某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销,作为一次最新的提交。 git revert HEAD 撤销前一次 commit git revert HEAD^ 撤销前前一次 commit git revert ... -
git revert的使用
2019-10-20 16:55:21git revert命令其实非常好理解,就是revert的含义,该命令会重新进行一次新的提交,只是提交的内容是会退某一次提交。 下面举例来说明。 有一个仓库,仓库的提交记录和文件分别如下图所示,该仓库有三次提交,每次... -
git revert还原commit-id
2022-04-14 21:42:561. git revert 是什么? 还原至某个或某些commit-id之前更改 大意: 新建一个commit且将删除git revert [commit-id]中的’commit-id’中的内容(本质是反向git cherry-pick操作) 2. git revert 用法与实践 2.1 还原某个... -
【git revert】使用以及理解(详解)
2020-12-18 15:50:43git revert B^…D 这样就把B,C,D都给revert了,变成: A-> B ->C -> D -> D’-> C’ -> B’ 用法就是: git revert OLDER_COMMIT^…NEWER_COMMIT 如果我们想把这三个revert不自动生成三个新的com -
大话代码回滚:git reset 和 git revert
2021-12-01 17:09:37git revert 那这两个命令有何区别呢?先不急,我们后文详细介绍。 git reset 假如我们的系统现在有如下几个提交: 其中:A 和 B 是正常提交,而 C 和 D 是错误提交。现在,我们想把 C 和 D 回退掉。而 -
你可能不知道的git revert操作细节
2022-01-07 10:09:40git revert主要用于还原一个或多个现有提交,并生成一条新的更改记录。 日常开发过程中,可能会出现要发版的时候,发现master分支上合并了这一期不需要发版的功能点,需要将这些提交还原。 以下是 git 官网 给出的... -
git reset、git checkout、和 git revert区分要点
2021-12-20 13:16:01git reset、git checkout、和 git revert 是git撤销操作的常用命令; 用法示例: git reset --hard HEAD 表示回退到当前版本,HEAD指向当前版本。如果你修改了一些代码,想去除,就可以用git reset --hard HEAD一次... -
面试官:说说你对git reset 和 git revert 的理解?区别?
2021-08-20 00:45:22一、是什么git resetreset用于回退版本,可以遗弃不再使用的提交执行遗弃时,需要根据影响的范围而指定不同的参数,可以指定是否复原索引或工作树内容git revert在当前提交后面... -
git revert详情使用
2020-04-10 01:14:49描述一个git revert使用场景,加深一下对git revert的使用,场景如下: Step 1:小辉在分支dev1上开发,提交了4次(分别为c1、c2、c3、c4),发布时需要把dev1分支合并到master分支上,生成了提交记录m5,并发布到... -
git revert 之后 找回原来的代码
2022-04-11 15:59:38git revert 如果需要回退线上的代码,一般会通过git revert ${commit hash} 新添加一个提交,返回之前的版本。 相比 reset ,revert 会在提交历史中增加一个新的提交,而不会对之前的提交进行任何更改。 默认情况下 ... -
当git revert遇到merge
2021-04-02 22:29:00因为此时git不知道要做什么。merge commit是两个分支的汇合点。本质上这两个分支地位是完全相等的。虽然从下边的图看来,似乎master是你想要的。但是话说回来,master也仅仅是个名字而已,与其他分支并无区别。另外... -
git revert 撤销中间某次commit
2022-01-25 16:41:26场景:在工作中,发现中间的某次提交是错误的,或者不再需要的代码,这个时候想要撤回那次commit,该如何呢? 假如远程仓库上有5次commit,如图: 我们的目的是想撤销第二次提交,也就是commit...git revert commit_id -
解决git revert后再次merge代码丢失问题
2022-04-20 14:55:01问题场景 公司使用gitlab作为代码管理工具,...然后等下个版本开发完成后,提交了mr,发现变动的文件只有revert之后的变动,第一次mr的文件改动都没有了(git revert后再次merge,git默认会丢弃这段代码)。 解决方案 -
git revert commit撤销提交
2021-11-18 10:08:19git revert commit撤销提交 -
如何撤销某次提交 git revert -m
2021-06-04 15:52:35如果我在develop分支 commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个... -
Git如何优雅的进行版本回退:git reset 和 git revert区别
2019-03-18 11:33:10在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验)。... git revert 那这两个命令有何区别呢?先不急,我们后文详细介绍。 git reset 假如我们的系统现... -
tortoise git revert的坑
2021-03-24 10:17:47文章目录事故操作1.tortoise git的revert2.git checkout . && git clean -df3.git reset --hard参考 事故 git merge的时候,磁盘空间不足,失败之后,导致当前分支上很多修改,增加,删除的文件。这个时候的... -
git revert 踩坑之路
2020-01-21 15:18:15在实际的开发工作中,使用git总会遇到一堆问题,本文将结合具体例子,讲述在何种条件下会出发git revert失败以及解决的方案和措施。 准备工作 首先,创建一个git 仓库(repo),本人是在Mac环境下,Windows下打开git... -
git revert后再merge
2021-07-21 14:02:21在自己的分支上进行需求的开发 ...4、revert (2)的merge节点 5、自己的分支再次提交了C节点 6、向master合并的时候发现并没有AB节点的内容。 7、reset(6)操作,需要先revert (4)产生的节点 8、再次merge ...