一、revert
1.1 revert 简介
Git revert
命令用于通过创建一个新的commit
来撤销一个或多个之前的commit
,并且把这次撤销,作为一次最新的提交,此次操作之前和之后的commit
和history
都会保留,这样做的好处是保持了项目历史的完整性,并且可以将撤销的改动应用到其他分支。
git revert
是提交一个新的版本,将需要revert
的版本内容再反向修改回去,版本会递增,不影响之前提交的内容。
git revert HEAD
撤销前一次 commitgit revert HEAD^
撤销前前一次 commitgit revert commit
(比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
-
撤销单个
commit
:如果只想撤销一个commit
,可以使用以下命令git revert <commit_hash> git revert 131b7a916560c549e598ca9c66c2a3d28c7508e9
-
撤销多个
commit
:如果想撤销多个commit
,可以使用以下命令git revert <commit_hash1>..<commit_hash2> git revert 131b7a916560c549e598ca9c66c2a3d28c7508e9..7a5b4709656e614deab37eb19e355ba9e724eb
-
使用交互式
revert
:如果想在撤销多个commits时选择性地进行,可使用-i
选项进入交互式模式
git revert -i
1.2 应用示例
假设本次提交commit页面有问题,需要回退
首先,查看提交记录:
# 查看最近 2 次commit记录
➜ git log -2
commit 1111fec75f226f83822f6ceda92704d39f3d443
Author: shq5785
Date: Mon Apr 22 14:24:11 2024 +0800
fix: 本次发布的commit代码改动"
commit 22229139486c6a59399b581df1c060b5f5846cf0
Author: shq5785
Date: Mon Apr 22 11:18:01 2024 +0800
feat: 历史页面
~
根据提交记录commit_hash,选择需要撤销的 commit 版本号,输入:wq
并回车确定。
➜ git revert 1111fec75f226f83822f6ceda92704d39f3d443
Revert "fix: 本次发布的commit代码改动""
This reverts commit 1111fec75f226f83822f6ceda92704d39f3d443.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch lsmas
# Your branch is up to date with 'origin/test'.
#
# Changes to be committed:
# modified: src/pages/ListDetailPage/index.tsx
#
~
~
~
~
~
~
:wq
revert
成功后的提示信息如下:
➜ git revert aa69cfec75f226f83822f6ceda92704d39f3d443
[lsmas 74239f9] Revert "fix: 本次发布的commit代码改动""
1 file changed, 26 insertions(+), 5 deletions(-)
再次查看commit
记录就会发现,多了一条回退的记录。
➜ git log -3
commit 33339f9dcc7f4c094ae3dd07243048772338bdc3
Author: shq5785
Date: Mon Apr 22 14:52:31 2024 +0800
Revert "fix: 本次发布的commit代码改动"
This reverts commit 1111fec75f226f83822f6ceda92704d39f3d443.
commit 1111fec75f226f83822f6ceda92704d39f3d443
Author: shq5785
Date: Mon Apr 22 14:24:11 2024 +0800
fix: 本次发布的commit代码改动"
commit 22229139486c6a59399b581df1c060b5f5846cf0
Author: shq5785
Date: Mon Apr 22 11:18:01 2024 +0800
feat: 历史页面
⚠️:切记,结束后需再重新 push
发布,用回退后的版本代码覆盖有问题的代码。
1.3 …is a merge but no -m option was given.问题修复
在执行以下revert命令时,遇到如下错误提示
git revert ce479b597de6025da4a67ddd4a94d1b8034d8c67
error: commit ce479b597de6025da4a67ddd4a94d1b8034d8c67 is a merge but no -m option was given.
fatal: revert failed
出现以上错误的原因是由于此次撤销的是一次合并,git不知道要保存这两个分支中哪个的修改。
-
git revert -m 1 c311875a825618c76ee16a457d038831717a58a5
表示保留当前分支的更改 -
git revert -m 2 c311875a825618c76ee16a457d038831717a58a5
表示保留master更改
如果是为了保留当前分支的代码,即使用 -m 1
。
二、git revert 和 git reset 的区别
-
git revert
是用一次新的commit
回滚之前的commit
,git reset
是直接删除指定的commit
。 -
在回滚这一操作上看,效果差不多。但是在日后继续
merge
以前的老版本时有区别。因为git revert
是用一次逆向的commit
“中和”之前的提交,因此日后合并老的branch
时,导致这部分改变不会再次出现,但是git reset
是之间把某些commit
在某个branch
上删除,因而和老的branch
再次merge
时,这些被回滚的commit
应该还会被引入。 -
git reset
是把HEAD
向后移动了一下,而git revert
是HEAD
继续前进,只是新的commit
的内容和要revert
的内容正好相反,能够抵消要被revert
的内容。