Git Reset vs. Git Revert: 撤销 Git 操作的两种方法
Git Reset
git reset
命令用于回滚 Git 中的提交历史。它会将当前分支的 HEAD 指针移动到指定的提交,并重置当前工作目录的内容。git reset
命令有下面三种模式:
--soft 模式
git reset --soft
命令会将当前分支的 HEAD 指针移动到指定的提交,并且不会重置当前工作目录的内容。这意味着之前的更改仍然存在于工作目录中,可以重新提交。该模式通常用于撤销上一次提交或合并操作。
简单实操一下
# 查看提交历史记录,并找到要回退提交的哈希值
git log
# 将 HEAD 指向要回退到的提交,但不会更改工作目录或索引
git reset --soft <commit hash>
# 之前的更改还是在暂存区
# Changes to be committed
git status
# 把一些文件移出暂存区(如果有必要)
# git reset HEAD <file>
# 最后不用多说
git commit -m "xxxx"
注:Git 有三个重要的区域,分别是工作目录(Working Directory)、暂存区(Staging Area 或 Index)和版本库(Repository 或 Git Directory)。
--mixed 模式
为什么叫混合(mixed)模式呢,因为它既重置了 HEAD 指针,又重置了暂存区。这意味着之前的更改将被删除,但是它们仍然存在于 Git 的历史记录中。该模式通常用于取消暂存的更改。
简单实操一下
# 查看提交历史记录,并找到要回退提交的哈希值
git log
# 将 HEAD 指向倒数第二个提交,但不会更改工作目录或索引
git reset --mixed HEAD~2
# 暂存区没东西
# Changes not staged for commit
git status
# 把一些文件移出暂存区(如果有必要)
# git reset HEAD <file>
# 重新将修改后的文件添加到暂存区
git add xxx
# 最后不用多说
git commit -m "xxxx"
注:
git reset --mixed HEAD@{1}
、git reset --mixed HEAD~1
和git reset --mixed HEAD^1
是不一样的。
git reset --mixed HEAD@{1}
会将当前分支重置到先前引用的状态,其中“1”是上一个引用的位置。这通常是最后一次操作,比如上一次的提交、合并或者重置。HEAD@{1}
是 Git 中的“Reflog”,它记录了你所做的所有本地提交和其他重要的 Git 操作。
git reset --mixed HEAD~1
将当前分支重置为父提交。~1
等价于^
符号,这意味着将重置到当前提交的父提交。如果当前提交是一个合并提交,则~1
和^
将返回其第一个父提交。git reset --mixed HEAD~1
可简写为git reset --mixed HEAD~
。
git reset --mixed HEAD^1
将当前分支重置到其父提交。如果当前提交是一个合并提交,则^
将返回其第一个父提交。git reset --mixed HEAD^1
可简写为git reset --mixed HEAD^
。
--hard 模式
git reset --hard
命令会将当前分支的 HEAD 指针移动到指定的提交,并且删除当前工作目录中的所有更改。这意味着之前的更改将被永久删除,不能重新提交。该模式通常用于回退到之前的版本。
简单实操一下
# 查看提交历史记录,并找到要回退提交的哈希值
git log
# 将 HEAD 指向要回退到的提交
git reset --hard <commit hash>
Git Revert
git revert
命令用于创建一个新的提交,该提交包含了要回滚的提交所引入的更改的相反操作,这样就可以撤销这些更改。这个新提交将成为项目历史记录中的一部分,并且需要被推送到远程仓库以应用这些更改。相较于 git reset
命令,git revert
命令更加安全,因为它不会删除任何提交,而是创建新的提交(如果想完全撤销更改,需要使用 git reset
命令。)。该命令通常用于回滚已经推送到远程仓库的提交。
简单实操一下
# 查看提交历史记录,并找到要回退提交的哈希值
git log
# 将 HEAD 指向要回退到的提交
git revert <commit hash>
区别和使用场景
git reset
和 git revert
命令在撤销 Git 操作时有不同的使用场景。
git reset
命令通常用于本地的操作,如撤销上一次提交或合并操作,或者回退到之前的版本。该命令会改变 Git 的历史记录,因此应该谨慎使用。git revert
命令通常用于已经推送到远程仓库的提交。该命令会创建新的提交,并保留之前的提交历史记录。这使得其他开发人员可以了解撤销操作的原因,并且可以很容易地回到之前的版本。
需要注意的是,使用git reset
命令可能会导致 Git 的历史记录被修改,因此在团队协作中使用该命令需要谨慎。而 git revert
命令则更加安全,因为它不会修改 Git 的历史记录,而是创建新的提交来撤销之前的操作。
此外,git reset
命令的 --hard
模式可以永久删除之前的更改,这意味着之前的更改将无法恢复。如果是近期的本地仓库中的提交历史记录也可以通过 git reflog
找回,但如果时间太久了,那就回天乏术了。 git revert
命令不会删除任何提交,之前的更改可以通过查看 Git 的历史记录来恢复。
因此,在选择 git reset
和 git revert
命令时,需要根据具体情况进行选择。如果需要撤销之前的提交或合并,并且不需要保留之前的更改历史记录,则可以使用 git reset
命令。如果需要撤销已经推送到远程仓库的提交,并且需要保留之前的更改历史记录,则可以使用 git revert
命令。
结论
git reset
和 git revert
命令是 Git 中撤销操作的两种主要方法。git reset
命令用于回滚 Git 中的提交历史,可以修改 Git 的历史记录,需要谨慎使用。而 git revert
命令用于创建一个新的提交,该提交将撤销之前的提交所做的更改,从而会更加安全,不会修改 Git 的历史记录。在你选择 git reset
和 git revert
命令时,需要根据具体情况具体判断。
最后,感谢你的阅读,希望这篇文章能帮助你更好的使用 Git。
转载自:https://juejin.cn/post/7206260789769977893