如何轻松恢复你的 git 提交
第一步:深呼吸
克服你对代码库/世界正在崩塌的恐惧的最好方法就是深呼吸。在疯狂地扑向键盘之前,先用鼻子吸气……再用嘴巴呼气。
第 2 步:查看提交日志
在做任何你可能会后悔的事情之前,最好先查看所有最近的提交,以确定要回滚到哪个提交。最简洁的方法是使用:
git log --oneline
这将显示您分支的所有提交历史记录,从最近的开始。它还会显示分支点,以查看所有合并的历史记录。
还要注意每个提交左侧的字母数字字符串。这些是唯一标识特定提交的哈希值。找到代码爆炸的拐点后,复制该提交的哈希值并继续下一步。
注意:你可以按“q”键退出此日志。这非常vim,所以如果你卡在这里,我不会责怪你😛
步骤 3:与最近的提交进行比较
检查与还原点的差异是验证即将进行的更改的好方法。为此,请使用复制的哈希并运行以下命令:
git diff HEAD COPIED_HASH^
让我们分解一下这个输出。首先,我们看到所有二进制文件更改的日志,路径以a/file_path
和列出b/file_path
。这些文件通常是编辑器/构建特定的文件(例如在.vscode
或.circleci
目录中)和图像文件。在本例中,一些图像的分辨率已更新。
接下来,我们会看到每个修改文件中逐行添加和删除的行。请注意,这是从最近的提交切换到要回滚到的提交的角度进行的。因此,绿色部分表示回滚后将添加的内容,红色部分表示将被删除的内容。
还要注意^
末尾的 。这确保我们能够比较到该提交哈希值的祖先。否则,比较会提前停止一个提交。
如果您滚动浏览此内容并且一切看起来都很好,那么是时候消除这些提交了!
步骤 4 选项 1:运行提交还原(推荐)
第一个选项最明显:在revert
我们要恢复到的提交哈希上运行命令。这很简单:
git revert COPIED_COMMIT_HASH..
请注意,这样做会创建一个新的提交,用于将所有更改还原到指定的提交。这样做效果很好,因为您应该能够推送更改并获得干净的更改日志,正如预期的那样。
需要注意的是,这将在 vi 中打开一个确认文件(假设你使用的是默认的 git 编辑器),用于确认每个要撤销的提交。如果一切正常,请输入“:wq”确认撤销。
您还可以添加--no-commit
标志来暂存每个还原操作,而无需实际创建还原提交。这在深度还原多个提交时非常有用,因为它允许您在最后提交一个较大的还原提交。否则,您最终将为每个提交单独提交还原提交。
不过,你或许想彻底更改你的提交历史,让那些讨厌的提交看起来从未存在过。为此,还有第二种选择……
选项 2:重新设置基准并删除提交
注意:在选择此选项之前,请阅读本节末尾的免责声明。
您可以使用 rebase 直接修改提交历史记录,而无需执行还原提交。要启动此过程,请输入以下命令:
git rebase -i COPIED_COMMIT_HASH^
注意-i
这里的标志。这是 的简写--interactive
,它允许你单独编辑从头部到我们指定的提交哈希值的每个提交。
从这里开始删除所有提交就很简单了。操作说明其实就在评论里,但简而言之:将所有列出的提交中的“pick”替换为“drop”。
...如果你还在疑惑为什么你的 Delete 键不起作用,那是因为 git 使用vi作为默认编辑器。你可以在这里切换到你最喜欢的编辑器,但如果你坚持使用 vi,应该不会太难。
- 要开始编辑,请按“i”键并使用箭头键移动光标
- 将光标移到每个“pick”语句上,删除并将其替换为“drop”
- 一旦所有拨片都替换完毕,按“esc”
- 要确认变基,请输入“:wq”。这将保存你刚刚编辑的变基文件。
如果您想随时中止,请删除注释部分上方列出的所有行(以“#”开头的行),以强制 rebase 出错。如果您使用的是 vi,只需反复按下“d”键,直到所有行都消失即可。
如果您的终端窗口关闭或发生其他情况,rebase 操作将挂起,无法完成。要中止 rebase 操作并重新开始,请输入命令git rebase --abort
。
如果一切顺利的话,你将正式改变历史!

免责声明
如果您已经将现在已回滚的提交推送到远程分支,则修改 git 历史记录可能会出现问题。回滚后,您的分支将显示为位于远程分支之后,因此您无法再直接推送。在这种情况下,您必须运行git push --force-with-lease
。此标志将通过删除已丢弃的提交,强制将您的历史记录推送到远程分支。with-lease
充当错误检查,以确保其余提交与远程分支一致。
你可能听说过,--force
强制推送并非最佳实践,因为它会重写远程分支的提交历史记录。这可能会给其他使用同一分支的用户带来问题,因为他们的历史记录将不再与远程分支的历史记录对齐。虽然有方法可以解决这个问题,但请确保其他人知晓你的强制推送,以免他们遇到麻烦!
总结
希望到最后,你的分支已经回到正轨!最重要的是,修改提交时,一定要确保要运行的命令都正确,尤其是在直接编辑 git 历史记录时。这对于初学者和专家来说都可能是一项非常艰巨的任务,所以确保 diff 和查看提交日志是必须的!
事实上,我在工作中也经历了同样的过程,所以写了这篇文章,想让我匆忙写下的笔记更清晰一些。希望这篇文章能帮助到其他遇到同样问题的人😊
学到一点东西吗?
太棒了!万一你错过了,我特意开通了“网络魔法”简报,来探索更多类似的知识!
这东西探讨的是Web 开发的“首要原则”。换句话说,究竟是哪些糟糕的浏览器 API、扭曲的 CSS 规则以及半无障碍的 HTML 支撑着我们所有的 Web 项目?如果你想要超越框架,那么亲爱的 Web 魔法师,这东西就是为你准备的🔮
赶紧在这里订阅吧!我保证永远教书,绝不会发垃圾信息❤️
文章来源:https://dev.to/bholmesdev/how-to-revert-your-git-commits-without-panicking-4d1c