前言
前面介绍过如何通过git reset
进行重置操作,以及git rebase
进行变基操作;
这两种方式都可以用来还原提交记录;
今天要介绍的git revert
也可以还原提交记录,只是原理不一样;
目录
- Git revert 介绍
- 还原合并记录
- 相关参数
- 区别
正文
1. Git revert介绍
git revert用来还原提交记录,且会保留历史记录,它的原理就是基于原有记录,创建一个新的提交,来撤销修改记录;
比如我们有如下的提交记录:
---v1---v2---v3
这里的v1,v2,v3就是提交记录ID,即commitId
现在不想要v2的修改记录,那么就可以通过git revert来进行还原:即还原到v1,同时保留v3;
对应的命令为:git revert v2
git revert v2
执行后,会弹出一个编辑窗口,如下所示:
Revert "Merge branch 'feat1' into jalon"
This reverts commit fa1709e25ff8fbdc501acd0b7a4c2632d783b514, reversing
changes made to 7f16fd8f511d1e02a004983784219f03dd37f335.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch jalon
# Your branch is ahead of 'origin/jalon' by 4 commits.
# (use "git push" to publish your local commits)
#
.git/COMMIT_EDITMSG [unix] (11:17 04/07/2022)
这里需要你编辑提交信息:输入i
进行编辑,编辑完成后按下ESC
并输入:wq
保存即可;
还原之后的记录为:
---v1---v2---v3---v2'
这里提交记录v2'
就是执行git revert v2
后新增的提交记录,对应的修改内容为:还原v2
的更新内容;
比如v2
新增了一个文件,那么v2'
就会删除那个文件;
2. 还原合并记录
上面介绍的是在指定分支上 指定提交记录的git revert
还原操作,那如果想要还原分支合并的记录该怎么做呢?
还原分支记录的命令稍有不同,因为你需要指定还原哪条分支,对应的命令为: git revert -m num mergeid
- -m : --mainline的缩写,即指定保留的分支;
- num: 分支的编号,这里有个约定就是,我们当前所在的分支为1,合并进来的分支为2;
- mergeid: 合并ID,即分支合并后生成的那条记录ID
比如我们有如下的提交记录:
---v1---v2---M1---v3---v4---v5
/
---A1---A2
其中M1表示合并的记录;
现在如果我们想要撤销掉A1、A2所在分支合并的记录,那么就可以通过如下的命令进行还原操作:git revert -m 1 M1
git revert -m 1 M1
这条命令的意思就是:基于合并记录M1,还原当前所在分支合并之前的记录,删除掉A1和A2记录
还原之后的记录如下:
---v1---v2---M1---v3---v4---v5---M2
/
---A1---A2
其中M2就是针对M1的还原记录
注:这里的分支合并记录还是存在的
如果还原合并记录后,A2所在分支进行了bug修复,并有了新的提交A3,如下所示:
---v1---v2---M1---v3---v4---v5---M2 master
/
---A1---A2---A3 feature
那么此时想要把A3记录合并进去,合并后的记录如下所示:
---v1---v2---M1---v3---v4---v5---M2 master
/ /
---A1---A2--------------------A3 feature
合并问题:此时查看master记录会发现,A1和A2的记录并没有合并到 master主分支上,只有A3合并过去了;
原因就是之前已经撤销了feature分支的合并,所以此时再次合并只会针对新的提交A3进行合并,已经撤销的合并记录会直接跳过;
怎么解决呢?
解铃还须系铃人,解决办法就是针对之前的还原记录,再次执行还原合并操作;
之前的新生成的还原记录为M2,那么我们就对M2再进行一次还原操作,命令为:git revert M2
还原后,提交记录如下:
---v1---v2---M1---v3---v4---v5---M2---M3 master
/ /
---A1---A2--------------------A3 feature
其中M3就是针对M2的还原记录
此时查看master分支上的代码,会发现A1和A2的记录也有了;
简化:如果合并进来的记录只有一条,那么直接git revert commtId
就可以了;
比如下面的例子:
---v1---M1---v4---v5
/
---A1
其中M1是合并记录,如果想要还原到v1的记录,即删除掉A1的合并记录,那么直接运行git revert A1
即可;
3. 相关选项
参考:Git - git-revert Documentation (git-scm.com)
- -e:默认自带,还原时会弹出编辑信息的窗口,以修改提交信息 message
- -m parent-number:还原合并记录时,指定以哪个分支为准,
-m 1
表示当前分支,-m 2
表示合并分支 - –no-edit:还原时不弹出编辑信息的窗口,默认信息为
revert merge-message
,其中merge-message
为合并记录时的信息; - –no-commit:还原时,不提交还原之后的记录,即只还原本地工作区和暂存区的内容,不还原本地仓库的内容;该命令多用于需要还原多个记录时(先分别执行多次git revert --no-commit,最后再手动git commit)
关于本地工作区、暂存区、本地仓库之家的关系,可以参考:Git学习-存档区,Git中的一个隐藏区 (javalover.cc),示意图如下所示:
4. 区别
git reset 重置操作,在还原记录的同时,会删除掉还原记录之后的历史提交记录;
git revert 还原操作,在还原记录的同时,会保留还原记录之后的历史提交记录;
git rebase 变基操作,可以删掉指定的提交记录,同时不改变其他的历史提交记录;
如果项目已经推送到远程仓库,且被人使用过,那么建议使用git revert进行还原操作;
如果只是记录在本地,那么这几种方式都可以,看自己喜欢哪个;
总结
git revert 还原操作,核心就是基于原有记录,来生成一个新的提交记录,以抹除掉对应的修改内容;
它相比较于其他几种还原操作的好处就是:可以保留历史记录,可以随时还原被还原的记录(即还原被 git revert 撤销的记录)
评论区