【Git 篇】git rever 跟 git reset 怎么用

435 阅读4分钟

git revert 和回滚(通常指 git reset)都是用于撤销 Git 操作的工具,但它们的使用方式和行为有很大不同。下面我会详细解释这两者的区别。

1. git revert

git revert 是用来撤销一个或多个提交的工具,但与直接删除提交不同,git revert 会生成一个新的提交,这个新的提交是对原始提交的"撤销"操作。

特点:

  • 产生新的提交:执行 git revert 会生成一个新的提交,内容是撤销指定提交所做的更改。
  • 不会修改历史git revert 并不会改变 Git 历史,因此你可以安全地在共享分支上使用它。它只是将一个新的撤销提交添加到历史中。
  • 常用于公共分支:如果你的代码已经推送到远程仓库,使用 git revert 是一种安全的方法,因为它不会修改已公开的历史。

示例:

假设你有一个合并提交 a3c3e1b6c5207b89bc9c16b78f30f4fe1c88d5a9,并且你想撤销它:

git revert -m 1 a3c3e1b6c5207b89bc9c16b78f30f4fe1c88d5a9

这会生成一个新的提交,撤销了这个合并的影响,保持历史不变。


2. git reset

git reset 是用来重置当前分支指针的工具,它可以将当前分支回退到某个特定的提交,通常用于丢弃某些提交的内容。

特点:

  • 修改历史git reset 会修改 Git 历史,改变当前分支的指针位置,删除或更改历史上的某些提交。如果你使用 --hard 选项,它还会删除工作目录和暂存区的更改。

  • 适用于本地操作git reset 不适用于已经推送到远程仓库的提交,因为它会修改分支历史,这可能导致冲突或丢失其他人的工作。

  • 三种模式

    • --soft:只重置分支指针,保留工作目录和暂存区的更改(不删除任何文件)。常用于合并多个提交。
    • --mixed(默认) :重置分支指针和暂存区(索引),但保留工作目录中的更改。
    • --hard:重置分支指针、暂存区和工作目录,完全丢弃所选提交之后的所有更改。

示例:

如果你想将当前分支回退到某个提交(比如 b9c3d7a9f93ab9d17e0239b91bc0930533e2d983):

git reset --hard b9c3d7a9f93ab9d17e0239b91bc0930533e2d983

这会将当前分支重置为该提交,之后的所有提交都将被丢弃。


关键区别

特性git revertgit reset
作用创建一个新的提交来撤销指定提交的更改修改分支指针,丢弃或重写提交历史
影响不会改变历史,产生一个新的撤销提交会改变历史,可能丢弃提交(尤其是 --hard
适用场景用于撤销已经推送的公共提交,保持历史完整用于本地回退,适合修改未推送的提交,修改历史
是否安全是,适用于公共分支否,尤其是在与他人共享分支时,可能导致历史不一致
是否改变工作区内容不改变工作区,只是提交撤销操作可以通过 --soft 保留工作区,也可以通过 --hard 丢弃工作区内容
常用选项-m 用于合并提交,生成撤销操作--soft, --mixed, --hard 用于不同的重置方式

何时使用 git revert,何时使用 git reset

  • 使用 git revert:当你需要撤销某个已推送的提交并且保持 Git 历史的完整性时,应该使用 git revert。它不会破坏其他开发者的工作,非常适合处理公共分支。
  • 使用 git reset:当你需要修改本地历史,且修改的提交还没有推送到远程仓库时,git reset 是一个更合适的选择。它更适用于清理或重新组织本地的提交。特别是如果你需要完全丢弃某些提交,git reset --hard 非常有用,但需要小心使用。

总结

  • git revert安全的撤销工具,它不会修改历史,而是通过生成一个新的提交来撤销指定提交的更改。
  • git reset修改历史的工具,它会改变提交的历史,适合用于本地的操作,但如果提交已推送到远程仓库则需要小心使用。

希望这个解释帮助你理解这两者的区别!如果有更多问题,随时问我。