> 技术文档 > Git系列之版本回退git revert_git revert回退版本

Git系列之版本回退git revert_git revert回退版本


个人主页:云纳星辰怀自在

座右铭:“所谓坚持,就是觉得还有希望!


Git Revert 指令详解

1. git revert 概述

git revert 用于撤销某次提交的更改,并生成一个新的提交记录。与 git reset 不同,git revert 不会修改提交历史,而是通过创建新的提交来撤销更改,因此适合用于公共分支(如 mastermain)的修复。


2. 基本语法

git revert 
  • :需要撤销的提交的哈希值或引用(如 HEAD~1branch-name 等)。

3. 常用选项

3.1 -n--no-commit

功能:撤销更改,但不生成新的提交记录。
使用场景:需要连续撤销多个提交,或者手动检查更改后再提交。

实例:撤销倒数第二个提交的更改,但不生成提交记录。

git revert -n HEAD~1

解释:撤销 HEAD~1 的更改,但不会生成新的提交记录,更改会暂存到工作区和暂存区。


3.2 -m --mainline

功能:撤销合并提交的更改,并指定主线父提交。
使用场景:撤销合并提交时,需要指定主线分支。

实例:撤销一个合并提交,并选择第一个父提交作为主线。

git revert -m 1 

解释-m 1 表示选择第一个父提交作为主线。合并提交有两个父提交,Git 需要知道以哪个父提交为基准进行撤销。


3.3 -e--edit

功能:撤销更改,并允许编辑提交消息
使用场景:需要自定义撤销提交的提交消息。

实例:撤销倒数第三个提交的更改,并编辑提交消息

git revert -e HEAD~2

解释:撤销 HEAD~2 的更改,并打开编辑器以编辑提交消息。


3.4 --no-edit

功能:撤销更改,但不编辑提交消息。
使用场景:使用默认提交消息,无需手动编辑。

实例:撤销倒数第三个提交的更改,并使用默认提交消息

git revert --no-edit HEAD~2

解释:撤销 HEAD~2 的更改,并使用默认的提交消息。


3.5 --cleanup=

功能:指定提交消息的清理模式。
使用场景:需要自定义提交消息的清理方式。

实例:撤销倒数第三个提交的更改,并使用 scissors 模式清理提交消息。

git revert --cleanup=scissors HEAD~2

解释--cleanup=scissors 表示在提交消息中添加 scissors 标记,用于冲突解决。


3.6 -S[]--gpg-sign[=]

功能:撤销更改,并使用 GPG 签名新提交。
使用场景:需要对新提交进行 GPG 签名。

实例:撤销倒数第三个提交的更改,并使用 GPG 签名。

git revert -S HEAD~2

解释-S 选项表示使用 GPG 签名新提交。如果未指定 keyid,则使用默认的提交者身份。


3.7 -s--signoff

功能:撤销更改,并在提交消息中添加 Signed-off-by 标签。
使用场景:需要为提交添加签名标签。

实例:撤销倒数第三个提交的更改,并添加 Signed-off-by 标签

git revert -s HEAD~2

解释-s 选项表示在提交消息末尾添加 Signed-off-by 标签。


3.8 --strategy=

功能:指定合并策略。
使用场景:需要自定义合并策略。

实例:撤销倒数第三个提交的更改,并使用 ort 合并策略。

git revert --strategy=ort HEAD~2

解释--strategy=ort 表示使用 ort 合并策略。ort 是 Git 的默认合并策略。


3.9 -X--strategy-option=

功能:传递合并策略特定的选项。
使用场景:需要自定义合并策略的行为。

实例:撤销倒数第三个提交的更改,并传递 theirs 选项

git revert -Xtheirs HEAD~2

解释-Xtheirs 表示在合并冲突时优先使用被还原提交的更改。


4. 操作实例

实例1:撤销单个提交

问题:某个提交引入了 bug,需要撤销该提交的更改。

解决方案:使用 git revert 撤销该提交。

git revert 

实例:撤销提交 abc1234 的更改。

git revert abc1234

实例2:撤销多个提交

问题:多个提交引入了 bug,需要撤销这些提交的更改。

解决方案:使用 git revert 依次撤销这些提交。

git revert  

实例:撤销提交 abc1234def5678 的更改。

git revert abc1234 def5678

实例3:撤销合并提交

问题:合并提交引入了 bug,需要撤销该合并提交的更改。

解决方案:使用 git revert -m 撤销合并提交。

git revert -m 1 

实例:撤销合并提交 m123456 的更改,并选择第一个父提交作为主线。

git revert -m 1 m123456

实例4:撤销更改但不提交

问题:需要撤销某个提交的更改,但不想立即生成提交记录。

解决方案:使用 git revert -n 撤销更改但不提交。

git revert -n 

实例:撤销提交 abc1234 的更改,但不提交。

git revert -n abc1234

实例5:撤销更改并自定义提交消息

问题:需要撤销某个提交的更改,并自定义提交消息。

解决方案:使用 git revert -e 撤销更改并编辑提交消息。

git revert -e 

实例:撤销提交 abc1234 的更改,并编辑提交消息。

git revert -e abc1234

5. Git Revert 场景分析与解决方案

5.1 背景描述

  1. Step 1:小辉在分支 dev1 上开发,提交了 4 次(分别为 c1c2c3c4),发布时将 dev1 分支合并到 master 分支,生成了提交记录 m5,并发布到线上。
  2. Step 2:小王在分支 dev2 上开发,提交了 1 次(c3),然后将 dev2 分支合并到 master 分支,生成了提交记录 m6,并发布到线上。
  3. Step 3:不幸的是,小辉的 dev1 分支上存在 bug,需要回滚 dev1 上的所有提交。


5.2 问题分析

  1. ​**dev1 分支的提交**:c1c2c3c4
  2. 合并提交m5dev1 分支合并到 master 的提交,包含了 c1c4 的更改。
  3. 回滚需求:由于 dev1 分支存在 bug,需要回滚 m5 的更改(即撤销 c1c4 的更改)。
  4. 后续操作:在 dev1 分支修复 bug 后,需要重新合并 dev1 分支到 master,并确保修复后的代码正确应用到 master 分支。

5.3 解决方案

1. 回滚 dev1 分支的提交

切换到 master 分支,查看提交记录。

git checkout mastergit log --graph

使用 git revert 回滚合并提交 m5,并选择第一个父提交作为主线。

git revert -m 1 

解释

  • -m 1 表示选择第一个父提交作为主线(即 master 分支)。
  • 是合并提交 m5 的哈希值。
  1. 回滚完成后,查看日志会生成一个新的提交记录 m6,表示回滚操作。

2. 修复 dev1 分支的 bug

切换到 dev1 分支,修复 bug 并提交。

git checkout dev1# 修复 bug 并提交git commit -m \"修复 bug\"

现在,dev1 分支的提交历史为:c1c2c3c4c5(修复 bug 的提交)。


3. 直接合并 dev1 分支

切换回 master 分支,将修复后的 dev1 分支合并到 master 分支。

git checkout mastergit merge --no-ff dev1

查看日志,确认合并操作生成的新提交 m7

git log --graph

推送更改到远程仓库。

git push origin master

5.4 详细命令流程

1 初始状态
  • dev1 分支:c1c2c3c4
  • master 分支:m5(合并 dev1
2 回滚 m5

切换到 master 分支。

git checkout master

回滚合并提交 m5

git revert -m 1 

查看日志,确认生成了回滚提交 m6

git log --graph
3 修复 dev1 分支

切换到 dev1 分支。

git checkout dev1

修复 bug 并提交。

# 修复 bug 并提交git commit -m \"修复 bug\"
4 直接合并 dev1 分支

切换回 master 分支

git checkout master

dev1 分支合并到 master 分支。

git merge --no-ff dev1

查看日志,确认合并操作生成的新提交 m7

git log --graph

推送更改到远程仓库。

git push origin master

5.5 总结

  1. 回滚合并提交:使用 git revert -m 1 回滚合并提交 m5,生成 m6
  2. 修复 bug:在 dev1 分支上修复 bug 并提交 c5
  3. 直接合并:将修复后的 dev1 分支直接合并到 master 分支,生成 m7

通过以上步骤,可以安全地回滚和修复问题,同时保留完整的提交历史。如果 c5 已经包含了修复后的代码,则不需要重新应用 c1c4


6. 注意事项

  1. 公共分支git revert 适合用于公共分支(如 mastermain),因为它不会修改提交历史,不会删除任何commit。
  2. 合并提交:撤销合并提交时,必须使用 -m 选项指定主线父提交。
  3. 冲突解决:如果撤销操作导致冲突,需要手动解决冲突并完成提交。

7. 总结

git revert 是 Git 中用于撤销提交更改的强大工具,尤其适合用于公共分支的修复。通过结合不同的选项,可以灵活地处理各种撤销场景。掌握 git revert 的使用方法,可以有效提高 Git 操作的安全性和效率。


 

参考文章

ffffffffAf