Git系列之版本回退git revert_git revert回退版本
个人主页:云纳星辰怀自在
座右铭:“所谓坚持,就是觉得还有希望!”
Git Revert 指令详解
1. git revert 概述
git revert 用于撤销某次提交的更改,并生成一个新的提交记录。与 git reset 不同,git revert 不会修改提交历史,而是通过创建新的提交来撤销更改,因此适合用于公共分支(如 master 或 main)的修复。
2. 基本语法
git revert
:需要撤销的提交的哈希值或引用(如HEAD~1、branch-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
实例:撤销提交 abc1234 和 def5678 的更改。
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 背景描述
- Step 1:小辉在分支
dev1上开发,提交了 4 次(分别为c1、c2、c3、c4),发布时将dev1分支合并到master分支,生成了提交记录m5,并发布到线上。 - Step 2:小王在分支
dev2上开发,提交了 1 次(c3),然后将dev2分支合并到master分支,生成了提交记录m6,并发布到线上。 - Step 3:不幸的是,小辉的
dev1分支上存在 bug,需要回滚dev1上的所有提交。

5.2 问题分析
- **
dev1分支的提交**:c1、c2、c3、c4。 - 合并提交:
m5是dev1分支合并到master的提交,包含了c1到c4的更改。 - 回滚需求:由于
dev1分支存在 bug,需要回滚m5的更改(即撤销c1到c4的更改)。 - 后续操作:在
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的哈希值。
- 回滚完成后,查看日志会生成一个新的提交记录
m6,表示回滚操作。
2. 修复 dev1 分支的 bug
切换到 dev1 分支,修复 bug 并提交。
git checkout dev1# 修复 bug 并提交git commit -m \"修复 bug\"
现在,dev1 分支的提交历史为:c1、c2、c3、c4、c5(修复 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分支:c1、c2、c3、c4master分支: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 总结
- 回滚合并提交:使用
git revert -m 1回滚合并提交m5,生成m6。 - 修复 bug:在
dev1分支上修复 bug 并提交c5。 - 直接合并:将修复后的
dev1分支直接合并到master分支,生成m7。
通过以上步骤,可以安全地回滚和修复问题,同时保留完整的提交历史。如果 c5 已经包含了修复后的代码,则不需要重新应用 c1 到 c4。
6. 注意事项
- 公共分支:
git revert适合用于公共分支(如master或main),因为它不会修改提交历史,不会删除任何commit。 - 合并提交:撤销合并提交时,必须使用
-m选项指定主线父提交。 - 冲突解决:如果撤销操作导致冲突,需要手动解决冲突并完成提交。
7. 总结
git revert 是 Git 中用于撤销提交更改的强大工具,尤其适合用于公共分支的修复。通过结合不同的选项,可以灵活地处理各种撤销场景。掌握 git revert 的使用方法,可以有效提高 Git 操作的安全性和效率。
参考文章
ffffffffAf




