Home
img of docs

学习Git的reset与revert,了解它们的作用和区别,以及在回滚代码时如何正确选择。

chou403

/ Git

/ c:

/ u:

/ 4 min read


介绍

在 Git 中,回滚代码有多种方法,具体取决于你想要达到的目的。常用的方法包括 git resetgit revert,它们有不同的用途和影响。

git reset

git reset 是一种将当前分支指向某个特定提交的命令。它会改变当前分支的历史记录,可以影响工作目录,暂存区和提交历史。git reset 有三种主要模式:

  1. --soft: 仅移动 HEAD 指针,不影响暂存区和工作目录。这意味着变更仍然保留在暂存区中,可以直接重新提交。

       git reset --soft <commit>
  2. --mixed(默认选项):移动 HEAD 指针,并重置暂存区为指定提交的状态,但不影响工作目录。修改仍然保留在工作目录中,但不会被暂存。

       git reset --mixed <commit>
  3. --hard: 移动 HEAD 指针,重置暂存区,并将工作目录恢复到指定提交的状态。所有未提交的更改都会被丢弃。

       git reset --hard <commit>

git revert

git revert 用于撤销特定的提交,并生成一个新的提交来记录这种撤销。它不会修改提交历史,是一种更安全的方法,特别是在已经共享的分支上。

   git revert <commit>

git revert 会创建一个新的提交,该提交应用了反向更改,以撤销指定的提交。这样做的好处是不会破坏提交历史,所有更改都被保留在历史记录中。

resetrevert 的区别

  • git reset:

    • 修改提交历史: 可以改变当前分支的提交历史,适合在本地操作尚未推送的提交。
    • 不安全操作: 如果已经推送到远程仓库,使用 reset 可能导致其他开发者的代码库出现问题。
    • 影响范围: 可以影响工作目录和暂存区,特别是在 --hard 模式下,可能丢失未提交的更改。
  • git revert:

    • 不修改提交历史: 生成一个新的提交,记录反向更改,保持提交历史完整。
    • 安全操作: 适合在共享分支上使用,因为不会破坏提交历史。
    • 工作流程: 适用于撤销特定提交的更改,而不影响其他提交。

例子

假设你有以下提交历史:

   a1b2c3d (HEAD -> main)
e4f5g6
h7i8j9
使用 git reset
   git reset --hard h7i8j9

结果:

   h7i8j9 (HEAD -> main)

HEAD 指针移动到了 h7i8j9,a1b2c3de4f5g6 提交被移除,工作目录恢复到 h7i8j9 的状态。

使用 git revert
   git revert a1b2c3d

结果:

   k9l0m1 (HEAD -> main)
a1b2c3d
e4f5g6
h7i8j9

生成了一个新的提交 k9l0m1,它撤销了 a1b2c3d 的更改,但保留了所有提交历史。

总结

  • git reset 适用于修改本地的提交历史,特别是尚未共享的更改。它可以灵活地处理工作目录和暂存区的状态。
  • git revert 适用于在保持提交历史完整的情况下撤销特定提交的更改,特别是在已经共享的分支上。它生成新的提交来记录撤销操作,是一种更安全的回滚方法。