【经验】Git|如何删除错误的commit?(存在大文件无法push的commit、不需要的commit等情况)

情况一:尚未推送或无法推送

情况描述:该情况往往出现于本地多次提交commit,但一直没推送。

通常满足两个条件:

  1. 没推送的commit中存在一个推送不了/不需要的错误commit,此时需要删除这个commit。
  2. 需要保留当前的代码。

如下图所示。

在这里插入图片描述

解决方式:

首先,通过git log想清楚自己需要切换到哪一个commit状态,查看commit id:

# 查看git记录(能看到每次操作的id):
git log --oneline

第二步,将仓库的状态恢复到能够正常提交的状态/需要删除的状态的上一个commit状态(--soft参数会保证恢复后你的文件夹内容保持不变):

git reset --soft <无法上传的那次的上一个的id>

注:id输入6位以上就差不多可以了,多输入几位也行,不用全选

第三步,检查当前Git的状态,尝试push:

# 可以看到完整的修改记录:
git status
# 尝试push
git push

如果文字描述无法理解的话,也可以看视频描述,更具体一些,当我还是小白的时候这个视频帮助我圆满解决了这个问题:《从零开始的 Git 生活》Lesson 8 Git 中的后悔药.bilibili.全栈港

情况二:已经推送

注:最好别用git revert撤销提交,有点难用。

情况描述:该情况往往出现于已经推送了commit,但是突然发现有个bug。为了保证commit的纯净性不愿意再推一个commit,所以打算覆盖上一次推的commit。

也有可能是这样的情况:很久很久以前,A写了一个版本。B接手后,决定重构。C接手后,觉得B写得还没月A好呢,就决定在A的基础上继续开发,舍弃B的一切commit。

解决方式:

与第一种情况一致,回到需要的commit状态即可。只不过最后推送时要使用强制推送:

git push -f

情况三:想要删除所有的commit记录

参考:Git | 清除所有提交(commit)记录

情况描述:删库跑路/抹杀开发过程/保护隐私必备。

方式一:

1.删除.git
git init
git remote add origin [email protected]:user/repo
2.重新添加所有文件:
git add .
3.提交:
git commit -m 'message'
4.强制更新:
git push -f origin master

做完这些操作后可以用git log --oneline查看操作log。

方式二:

1.新建一个分支:
# 注意orphan代表这个分支是一个初始提交,
# 意思是前面的记录都不存在,
# 而git checkout -b则会保留之前的commit记录
git checkout --orphan <分支名>
2.将无敏感信息的新内容正常提交到新分支里:
git add .
git commit -m "new"
git push --set-upstream origin <分支名>
3.删除原来的分支:
git branch -D master
4.将<分支名>改成master:
git branch -m master
5.强制推送:
git push -f origin master --set-upstream

猜你喜欢

转载自blog.csdn.net/qq_46106285/article/details/124744328