学习Git的reset与revert,了解它们的作用和区别,以及在回滚代码时如何正确选择。
chou403
/ Git
/ c:
/ u:
/ 4 min read
介绍
在 Git 中,回滚代码有多种方法,具体取决于你想要达到的目的。常用的方法包括 git reset
和 git revert
,它们有不同的用途和影响。
git reset
git reset
是一种将当前分支指向某个特定提交的命令。它会改变当前分支的历史记录,可以影响工作目录,暂存区和提交历史。git reset
有三种主要模式:
-
--soft
: 仅移动 HEAD 指针,不影响暂存区和工作目录。这意味着变更仍然保留在暂存区中,可以直接重新提交。git reset --soft <commit>
-
--mixed
(默认选项):移动 HEAD 指针,并重置暂存区为指定提交的状态,但不影响工作目录。修改仍然保留在工作目录中,但不会被暂存。git reset --mixed <commit>
-
--hard
: 移动 HEAD 指针,重置暂存区,并将工作目录恢复到指定提交的状态。所有未提交的更改都会被丢弃。git reset --hard <commit>
git revert
git revert
用于撤销特定的提交,并生成一个新的提交来记录这种撤销。它不会修改提交历史,是一种更安全的方法,特别是在已经共享的分支上。
git revert <commit>
git revert
会创建一个新的提交,该提交应用了反向更改,以撤销指定的提交。这样做的好处是不会破坏提交历史,所有更改都被保留在历史记录中。
reset
和 revert
的区别
-
git reset
:- 修改提交历史: 可以改变当前分支的提交历史,适合在本地操作尚未推送的提交。
- 不安全操作: 如果已经推送到远程仓库,使用
reset
可能导致其他开发者的代码库出现问题。 - 影响范围: 可以影响工作目录和暂存区,特别是在
--hard
模式下,可能丢失未提交的更改。
-
git revert
:- 不修改提交历史: 生成一个新的提交,记录反向更改,保持提交历史完整。
- 安全操作: 适合在共享分支上使用,因为不会破坏提交历史。
- 工作流程: 适用于撤销特定提交的更改,而不影响其他提交。
例子
假设你有以下提交历史:
a1b2c3d (HEAD -> main)
e4f5g6
h7i8j9
使用 git reset
git reset --hard h7i8j9
结果:
h7i8j9 (HEAD -> main)
HEAD 指针移动到了 h7i8j9
,a1b2c3d
和 e4f5g6
提交被移除,工作目录恢复到 h7i8j9
的状态。
使用 git revert
git revert a1b2c3d
结果:
k9l0m1 (HEAD -> main)
a1b2c3d
e4f5g6
h7i8j9
生成了一个新的提交 k9l0m1
,它撤销了 a1b2c3d
的更改,但保留了所有提交历史。
总结
git reset
适用于修改本地的提交历史,特别是尚未共享的更改。它可以灵活地处理工作目录和暂存区的状态。git revert
适用于在保持提交历史完整的情况下撤销特定提交的更改,特别是在已经共享的分支上。它生成新的提交来记录撤销操作,是一种更安全的回滚方法。