重置与回退提交Reset & Revert

你可能会说

刚才提交错了,怎么把它撤掉?

撤销已提交改动的两种方式:reset 移动分支指针回到指定提交,revert 生成一条抵消旧改动的新提交在本地提交了错误代码且尚未推送到远程时,可以使用 reset 将分支指针移回旧提交;如果改动已经推送到共享远程仓库、其他人可能已经基于它开展工作,则应使用 revert 创建一条相反改动的新提交来对冲影响。revert 完整保留已有的提交历史,而 reset 会直接改写当前分支的历史指针。
也常被叫作ResetRevert撤销提交
main
reset 回到这里
git reset --hard HEAD~1

reset 把分支指针移回指定提交:之后的提交从这条线上消失。已经推送的提交不要这样改,改用 git revert 生成反向提交。

什么时候用

  • 只撤销本地的提交,用 reset 把分支移回上一个提交
    $ git reset --hard HEAD~1HEAD is now at 3f9c2ab 调整导航间距
  • 想保留改动、只重做提交时,用 reset --soft 回到提交前
    $ git reset --soft HEAD~1改动仍在暂存区,可重新整理后再提交
  • 已推送到远程的提交有错,用 revert 追加一条反向提交
    $ git revert a1b2c3d[main 9e8f7a6] Revert "误加调试代码"
  • reset --hard 会丢弃未提交改动,执行前先确认
    git status 显示有未提交改动reset --hard 会连这些改动一起丢弃

什么时候不用

  • 对已推送的提交 reset 后强推,改写同事已拉取的历史
    reset 已推送的提交后强推,同事本地出现分叉共享历史不要改写,用 revert
  • 没看清参数就用 reset --hard,连未保存的改动一起丢掉
    未提交的两小时改动随 reset --hard 一起消失执行前先 git status 确认
  • 用 revert 撤销别人的提交前不沟通,历史里平白多出冲突提交
    没打招呼就 revert 了同事的提交对方继续基于被撤销的改动开发,产生无谓冲突
  • 撤销后不重新运行验证,以为历史回到过去功能也回到过去
    reset ✓页面报错
组成结构 · Anatomy
HEAD
回到这里
reset 让它从分支线上消失;revert 保留它,另加一条反向提交
常见变体 · Variants
reset --soft--soft
git reset --soft HEAD~1
撤销提交但保留改动,方便重新整理后再提交
reset --hard--hard
git reset --hard HEAD~1
彻底回到上一个提交,改动一并丢弃
revertrevert
git revert a1b2c3d
已推送的提交要撤销,不改写共享历史
典型使用场景
终端 git reset 撤销本地提交
zsh — my-first-page
$ git reset --hard HEAD~1 HEAD is now at 3f9c2ab 调整导航间距 分支指针回到上一个提交,误提交的内容从这条线上消失
git log 历史回到上一提交
main
reset 后 HEAD 指向“调整导航间距”,误提交不再出现在历史上
终端 git revert 反向提交
zsh — my-first-page
$ git revert a1b2c3d [main 9e8f7a6] Revert "误加调试代码" 生成一条新提交,把 a1b2c3d 的改动抵消掉
git log 里追加的 Revert 提交
main
revert 不改历史:红色提交仍在,绿色提交抵消它的改动
延伸阅读 · 权威出处