>> >> >>Indexer<< << << <<<<<< Idx >>>>>>
Matched: 0
reset and revert
M: 2025-12-31 - ljf12825

Reset

git reset用来回退到某个历史提交,它可以修改Git仓库中的提交记录和工作目录,常用于撤销更改或在错误的提交后进行修复

根据使用场景不同,git reset主要有三个模式

  1. git reset --soft <commit>
  • 作用:将当前分支的指针(HEAD)移动到指定的提交,但是不会修改工作区和暂存区的内容。这意味着你回到了某个提交,但是修改的文件仍然会保持在暂存区,可以重新提交
  • 场景:常用于在提交错误或想要合并多个提交时。例如,你提交了多个小的更改,但是希望将它们合并成一个提交,使用--soft可以把多个提交合并成一个新的提交
git reset --soft HEAD~1

这将把分支回退到上一个提交,同时保留当前的更改

  1. git reset --mixed <commit>
  • 作用:将当前分支的指针(HEAD)回退到指定的提交,并且将暂存区退回到那个提交时的状态。工作目录(文件内容)不会改变。如果你已经将更改添加到暂存区但还没有提交,--mixed会将这些更改从暂存区移除,但保留在工作目录

  • 场景:用于想撤销git add(将文件添加到暂存区)的情况,但不丢失工作区的更改。可以用这个命令撤销已经暂存的文件,但是不影响未暂存的文件

git reset --mixed HEAD~1

这将撤销最近的提交,并将暂存区的内容恢复到上一个提交的状态

  1. git reset --hard <commit>
  • 作用:将分支指针(HEAD)退回到指定提交,并且彻底清除暂存区和工作区的所有更改。所有未提交的更改都会丢失,包括文件的修改和已添加到暂存区的更改
  • 场景:当你不再需要某些更改,想要彻底恢复到某个历史提交时使用。要小心--hard,因为它会丢弃你所有的未提交更改,无法恢复
git reset --hard HEAD~1

这会将分支回退到上一个提交,并且删除所有未提交的更改

其他

  • git reset <commit>默认是--mixed,即回退到指定的提交并更新暂存区,工作区不变
  • 使用git loggit reflog来查看历史提交,找到需要重置的提交
  • git reset不会删除提交,只是改变了分支指针的位置,所以被重置的提交仍然在Git历史中,除非使用git gc来清理

注意事项

  • git reset主要是改变分支的历史记录,通常只对本地仓库有效。对已经推送到远程的提交使用reset后会导致本地和远程分支不同步
  • 如果已经推送到远程仓库,重置可能会导致其他人无法拉取(pull)历史版本。这种情况下,应该避免使用git reset,可以使用git revert来创建反向提交,保持历史记录的完整性

Revert

git revertgit reset不同,它不会修改历史记录,而是通过创建一个新的提交来“撤销”指定提交的效果。它通常用于已经推送到远程仓库的情况,能够保持项目历史的完整性,避免破坏其他协作开发者的工作

基本使用

  • 作用:撤销某个提交的影响,但不会删除这个提交,它通过创建一个新的“反向”提交来实现
  • 适用场景:git revert适合用于已经推送到远程仓库并共享给其他开发者的提交,因为它保持了项目的历史记录。相比之下,git reset会改变历史记录(如果已经推送到远程仓库的话会引发问题),不适合这种场景
git revert <commit>
  • <commit>:指定想要撤销的那个提交的哈希值(或引用,例如HEAD~1

例如,撤销上一个提交

git revert HEAD

这会创建一个ie新的提交,撤销HEAD提交的所有更改

撤销多个提交

git revert HEAD~3..HEAD

这会撤销从HEAD~3HEAD之间的所有提交,每个提交都会生成一个新的反向提交

工作原理

git revert会生成一个新的提交,它的内容是“撤销”指定的提交所做出的更改。这是通过将修改应用到工作区来实现的,并创建一个新的提交记录。这个新的提交不会改变现有的提交历史,而是把原始提交的影响反转

常见参数

  • -n--no-commit:会撤销指定提交的更改,但不会自动创建一个新的提交。可以在工作区查看更改,手动合并后再提交
git revert -n <commit>

这种方式允许你将多个撤销的更改合并到一个新的提交中

  • -m--mainline:在合并提交时使用,指明哪个父提交是主要的,指定主线父提交来正确地生成反向提交
git revert -m 1 <merge-commit>

-m 1表示选择第一个父提交作为主线

使用场景

  1. 撤销某个不合适的提交
  • 你已经提交了某个错误的功能或者bug修复,但是已经推送到了远程仓库,其他团队成员也基于此进行了工作
  • 这时使用git revert可以撤销这个错误提交,而不会破坏项目的历史和其他人的工作
  1. 撤销合并提交
  • 如果你错误地合并了一个分支,可以通过git revert -m 1 <merge_commit>来撤销合并提交,并保持历史不变
  1. 撤销多个提交
  • 如果你需要撤销一系列的错误提交,可以使用git revert对每个提交进行撤销,生成新的提交。也可以通过-n选项将这些更改暂时合并到一起,之后一次性提交

Reset vs Revert

  1. git revert
  • 创建一个新的提交,撤销指定提交的内容
  • 不会改变提交历史(适合于推送到远程仓库后的情况)
  • 适用于多人协作项目
  1. git reset
  • 改变当前分支的指针,重写历史记录
  • 可以删除提交记录
  • 适用于仅限本地仓库的更改,通常不推荐对已经推送的提交使用