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
、c4
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 总结
- 回滚合并提交:使用
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