likes
comments
collection
share

Git Reset vs. Git Revert: 撤销 Git 操作的两种方法

作者站长头像
站长
· 阅读数 12

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~1git 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 resetgit revert 命令在撤销 Git 操作时有不同的使用场景。

  • git reset 命令通常用于本地的操作,如撤销上一次提交或合并操作,或者回退到之前的版本。该命令会改变 Git 的历史记录,因此应该谨慎使用。
  • git revert 命令通常用于已经推送到远程仓库的提交。该命令会创建新的提交,并保留之前的提交历史记录。这使得其他开发人员可以了解撤销操作的原因,并且可以很容易地回到之前的版本。

需要注意的是,使用git reset 命令可能会导致 Git 的历史记录被修改,因此在团队协作中使用该命令需要谨慎。而 git revert 命令则更加安全,因为它不会修改 Git 的历史记录,而是创建新的提交来撤销之前的操作。

此外,git reset 命令的 --hard 模式可以永久删除之前的更改,这意味着之前的更改将无法恢复。如果是近期的本地仓库中的提交历史记录也可以通过 git reflog 找回,但如果时间太久了,那就回天乏术了。 git revert 命令不会删除任何提交,之前的更改可以通过查看 Git 的历史记录来恢复。

因此,在选择 git resetgit revert 命令时,需要根据具体情况进行选择。如果需要撤销之前的提交或合并,并且不需要保留之前的更改历史记录,则可以使用 git reset 命令。如果需要撤销已经推送到远程仓库的提交,并且需要保留之前的更改历史记录,则可以使用 git revert 命令。

结论

git resetgit revert 命令是 Git 中撤销操作的两种主要方法。git reset 命令用于回滚 Git 中的提交历史,可以修改 Git 的历史记录,需要谨慎使用。而 git revert 命令用于创建一个新的提交,该提交将撤销之前的提交所做的更改,从而会更加安全,不会修改 Git 的历史记录。在你选择 git resetgit revert 命令时,需要根据具体情况具体判断。

最后,感谢你的阅读,希望这篇文章能帮助你更好的使用 Git。