起因是提交代码时不希望一些文件被提交,但已经被追踪了。想按照下图方式重新配置了gitignore,
但提交时命令写的
git add .
git commit -m "update gitignore"
“git add .“添加了所有文件.这样导致了项目里每一行代码的修改记录都变成了这次的提交备注”update gitignore”。后续其他同事也提交了几次记录。
想着回滚回这次修改以前的,再让同事们重新提交自己的修改。但同事们已经pull过代码,可能也区分不出来了。 有什么方法删除掉gitignore的这次提交,并保留同事们后续的提交?
————————————————————————————————————————————————————
执行git log –oneline 找到要bad commit e01eb19,再执行git revert e01eb19 文件都被删除且提示无法还原e01eb19….gitignore
不知道原文是哪个天才(或许是 ChatGPT?)写的:git rm -r --cached .
,没成想你还真执行了,对于不认识的命令,下次执行前还是先问问 ChatGPT 吧,好在这是 Git,还有回旋的余地。
git rm --cached <file>
这个命令的作用是将指定文件从 Git 中移除,最后一个参数接收的是文件的路径,一般情况下,输入你要忽略的文件路径就好了,而原帖上的 .
就表示当前位置,-r
选项表示递归,换句话说,原帖的操作就是所有的文件从 git 中移除了,然后又从新 add/commit,颇有一种大炮打蚊子的美感。
如果你现在后面没有新的提交,那么直接 git reset --hard 3e3fed4
到这个位置,然后从新使用 git rm --cached <file>
命令把你要删除的文件删除,然后提交即可,如果是目录,则需要 -r
选项。
如果你现在后面有新的提交了,那么就可以考虑使用 git rebase -i HEAD...3e3fed4
、drop 掉 e01eb19
这一条 commit。
这其中可能会有冲突需要解决,待全部完成后,从新使用 git rm --cached <file>
删除你要排除的文件(你现在应该已经在 .gitignore 中忽略了这个文件),再次提交,即可。
Jetbrains 系列 IDE 的 Git 面板上可以直接右键 Drop Commit
。
现在,因为你篡改了 git 的提交历史,如果代码已经推送到了远端,你必须要使用强制推送,才能推送,建议使用 git push --force-with-lease
,如果此时推送失败了,则说明已经有其他人往这个分支推送了更新的代码,你现在需要拉一下最新的代码,后才能推送,避免使用 --force
选项,这可能会破坏其他人新的提交。
误操作不要怕
git reflog 可以拯救你
git reflog 的回退和git log的回退操作一模一样
reflog记录的是你的本地操作历史,所以如果有误操作 你可以直接reset回操作之前的记录