Git中reset和revert的用法与区别
起因
最近在练习算法,将所有完成的练习题都保存到了一个Gitee代码仓库中,每次完成一些题目,就会使用git进行分支合并并提交。
某次提交过后,我发现自己提交内容的信息有误,就想撤销上次的提交内容和记录。
那么git reset
和git revert
这两个命令,应该用哪一个呢?
介绍
Git中的reset
和revert
都是用于撤销的命令,但是用法和撤销范围有所不同。
reset
命令:
-
作用:用于将分支的当前HEAD指针指向另一个提交,并可以选择是否将更改保留在工作目录中。reset的主要作用是移动HEAD和分支指针来撤销提交。
-
撤销范围:回滚所有提交记录和文件修改
-
三种操作模式:
-
soft模式:使用--soft选项,移动HEAD和分支指针到目标提交,但不更改工作目录和暂存区。这意味着之前提交的更改仍然在工作目录中,可以重新提交。
-
mixed模式:这是默认模式,使用--mixed选项。它移动HEAD和分支指针到目标提交,并将更改从目标提交之后的提交全部撤销,但不保留更改。这意味着之前提交的更改不会出现在工作目录中,并且需要重新添加和提交。
-
hard模式:使用--hard选项。它移动HEAD和分支指针到目标提交,并且将所有更改从目标提交之后的提交全部撤销。这意味着之前提交的更改完全丢失,慎用!
# 只回滚commit记录 git reset --soft HEAD^ # 回滚commit和暂存区修改 git reset HEAD^ # 完全回滚到上一个版本 git reset --hard HEAD^
-
git reset
的常见用例包括:
-
修正最新提交的错误
-
合并错误的提交或分支
-
取消最新的一系列提交
revert
命令
-
作用:命令用于创建一个新的提交,该提交撤销指定的提交或一系列提交的更改。它实际上是通过创建一个撤销先前更改的新提交来回滚提交历史,而不是像reset一样移动分支指针。
-
撤销范围:仅撤销指定的某一次提交记录
-
操作:
revert commitID
,会生成一个反向的新提交来撤销指定commit
# 撤销最近一次提交
git revert HEAD
# 撤销指定提交
git revert <commitID>
git revert
的常见用例包括:
-
在共享代码库中撤销公开的错误更改,以避免破坏其他人的工作。
-
在团队开发中回滚问题提交,而不影响其他功能的开发。
-
保留提交历史的完整性。
总结
-
git reset
用于彻底回滚版本,可选择性撤销工作目录、暂存区或提交记录 -
git reset
时需谨慎,因为它可以丢弃之前的更改,而git revert
是安全的,因为它不会修改已有的提交历史 -
git revert
用于生成反向提交来撤销指定提交,仅撤销指定提交的修改,前期提交记录保留 -
git revert
通过创建新的撤销提交来回滚提交历史,保留了历史记录并且不会修改已有的提交