侧边栏壁纸
  • 累计撰写 92 篇文章
  • 累计创建 98 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

Git还原记录-git revert

汤圆学Java
2022-08-04 / 0 评论 / 0 点赞 / 188 阅读 / 2,833 字
温馨提示:
本文最后更新于 2022-08-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

前面介绍过如何通过git reset进行重置操作,以及git rebase进行变基操作

这两种方式都可以用来还原提交记录;

今天要介绍的git revert也可以还原提交记录,只是原理不一样;

目录

  1. Git revert 介绍
  2. 还原合并记录
  3. 相关参数
  4. 区别

正文

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),示意图如下所示:

image-20220126102349180

4. 区别

git reset 重置操作,在还原记录的同时,会删除掉还原记录之后的历史提交记录;

git revert 还原操作,在还原记录的同时,会保留还原记录之后的历史提交记录;

git rebase 变基操作,可以删掉指定的提交记录,同时不改变其他的历史提交记录;

如果项目已经推送到远程仓库,且被人使用过,那么建议使用git revert进行还原操作;

如果只是记录在本地,那么这几种方式都可以,看自己喜欢哪个;

总结

git revert 还原操作,核心就是基于原有记录,来生成一个新的提交记录,以抹除掉对应的修改内容;

它相比较于其他几种还原操作的好处就是:可以保留历史记录,可以随时还原被还原的记录(即还原被 git revert 撤销的记录)

0

评论区