git提交错了?别慌,直接删除提交记录*
你删历史,git到底能不能彻底抹掉?
很多人可能第一反应就是“撤销呗,revert下不就完事了?”,但其实这东西跟你想的不太一样。git revert只是做了个“反操作”而已,历史还在那摆着,commit那条记录还贼清楚。你要真想把那种丑事连根拔掉,其实还得靠git reset那一套。
不过我先说下这俩命令大概区别,不然你们一会儿又混了。
git revert ——只是反悔,但人家记得你干过
git revert的本事呢,就是你提交错了,可以反着做一遍,比如你加了一堆console.log,现在想删回去,其实revert下也能达到一样的代码效果。但……历史还是能看到“你干过这事”,只不过后面又补了个“撤销”操作而已。
平时我们用得最多的就这俩写法:
git revert <commit-hash> # 撤销某一条 git revert HEAD # 撤销最近一次
要是想一口气撤好几条,也能写成这样:
git revert <hash1> <hash2> # 指定多个 git revert <hash1>^..<hash2> # 撤销一段范围
流程很简单,先git log找commit哈希,然后revert,编辑下那条新提交说明,git push
上去就完了。注意哦,这里每撤一次其实又新建了一条记录,原来的丑事还在那躺着。
git reset ——删历史,装没发生过
你真想那种“此地无银三百两”的效果,只能用git reset了。这个命令其实有点狠,直接把你HEAD指针往回指,然后你可以选择保留还是丢掉改动。
举个例子,比如你连续手滑两次,想一块抹掉:
git reset --hard HEAD~2 # 本地回到倒数第三条
这样一搞,后面那两条提交直接没了,本地代码也同步变成那会儿的样子。如果你觉得代码还得留着,可以用soft:
git reset --soft HEAD~1 # 只改commit历史,代码不变
或者说想把暂存区也清空但代码别删,那用mixed(其实不写参数默认就是这个):
git reset HEAD~1
但不管你怎么reset,本地历史虽然干净了,远程还在,你还得配合强推才算数:
git push --force
或者更规范点(比如指定分支):
git push origin main --force
这里origin
就是你远程仓库名字,main
分支嘛——你们可能叫master
、dev
啥的,自己看着来。
注意!reset+force不是儿戏
我跟你说,这种强推操作真得慎重。你如果团队里好几个人一起在用这个分支,直接force一把,别人本地分分钟一堆conflict等着你。一定要提前打声招呼,最好自己commit拉下来备份一份,别全删了就后悔。
我举个最简单的流程给你们感受下:
# 1. 查看历史,找到要删的commit git log # 2. 回滚到某一历史版本,比如要删最近两次提交 git reset --hard HEAD~2 # 3. 强制推送到远程 git push --force
生活中遇到过什么“事故”?
其实我印象里最离谱的还不是我自己,是我们前公司有哥们直接把自己的私人照片(你懂的那种)误加到代码里,还commit了一波,后来还是重置历史+force才救回来……人都傻了。
最后再啰嗦两句
要是真只是撤销一下,不在意那条历史被看到(比如只是代码写错了点,不是什么见不得人的东西),revert安全简单,没啥坑。你要想彻底掩盖“犯罪痕迹”,reset+push --force才是唯一解药,但千万别误删团队里别人还没同步的东西。
要不我总结一下哈,给你脑子里理理清楚:
比较项 | git revert | git reset |
---|---|---|
保留历史 | ✅ 是 | ❌ 否 |
创建新提交 | ✅ 是 | ❌ 否 |
修改历史 | ❌ 否 | ✅ 是 |
适合公开仓库 | ✅ 安全 | ❌ 谨慎 |
反正我自己真碰到“社死”场面,绝对用reset那套,revert纯属留念用。对了,有问题别着急自己乱搞,问下身边的老哥,省得一不小心再来个“永久丢失”——要真那样,下班还能不能吃上晚饭都两说。