⏪ 撤销 Git 提交的 4 种方法 - 修改 vs 重置
我非常肯定,以下这些事情你至少都经历过一次:
- 您提交的更改信息有误(拼写错误、时态错误等)。
- 您提交的更改包含了错误的文件(缺少文件、文件过多等)。
- 你过早地提交了更改(该功能尚未完成)。
- 你提交了一个你不想做的更改(代码错误,需要删除)。
当然,你可以添加一个新的提交,但从长远来看,这会扰乱你的 git 历史记录(除非你使用squash关闭 PR )。
如果你想保持提交历史记录的整洁,并消除错误,让我来介绍四种撤销提交的方法。它们类似但不完全相同,你可以根据实际情况选择最合适的方法。
额外内容:我还会教你如何恢复已彻底删除的更改。这是什么意思呢?稍后我会详细解释。
和往常一样,我的 YouTube 频道上有一个演示视频,里面展示了本文的所有内容,以及一些额外的词汇和场景。如果您只是想了解命令,可以跳过视频直接阅读文章。
目录
1. 修改不编辑
让我们从最简单的情况开始,你已经提交了更改,但是你忘记添加一些文件。
与其创建额外的提交,不如运行以下命令git commit --amend --no-edit。这样,最后一次提交就会被更新为包含新文件。
git add .
git commit --amend --no-edit
无需其他操作,大功告成!
2. 修改和更改信息
情况与上一个类似,但您还需要更改提交消息。
git add .
git commit --amend
这将打开你的默认编辑器,你可以修改提交信息。完成后,保存并关闭编辑器。提交信息将会更新。
实际上,git add .如果您只想更改提交信息,则不需要这样做。您可以直接运行git commit --amend。
3. 重置(软重置)
这种情况是指你想撤销一次提交,但又想保留更改以便稍后可以进行新的提交。
git reset它有点像时间旅行,功能强大但也十分危险。最常见的用途可能是撤销提交,但请记住,它的功能远不止于此。
我们需要的完整命令是git reset --soft HEAD~1:
--soft这意味着这些更改将被保留。HEAD指你当前所在的提交版本。HEAD~1表示最后一次提交,但也可以用它HEAD~2来撤销最后两次提交。- 的简写形式
HEAD是@,所以@~1与相同HEAD~1。
运行此命令后,您会发现最后一次提交已消失,但文件仍然应用了您的更改。
现在你可以继续工作,准备好后随时可以提交新的代码。
4. 重置(硬重置)
这种情况是指您想要撤销一次提交,但又不想保留更改。
如果要删除更改,需要--hard在运行时添加标志git reset。
警告:此操作还会删除所有未提交的更改。
这次我们需要使用的完整命令是git reset --hard HEAD~1,它会删除最后一次提交及其更改。永久删除。真的是这样吗?
额外功能:恢复已删除的更改
如果你运行程序git reset --hard HEAD~1后对结果不满意,仍然可以恢复更改。
正如我们刚才看到的,git resetGit 就是我们的时间机器,但我们需要告诉它该去哪里。在这个例子中,我们完全删除了一个提交,Git 历史记录中没有任何痕迹,所以我们无法再做任何判断HEAD~number。
幸运的是,git 会保留所有已删除提交的日志。您可以通过运行以下命令查看此日志git reflog。
你想查看类似这样的日志:
1b2c3d4 HEAD@{0}: reset: moving to HEAD~1
这意味着您之前位于提交 1b2c3d4,并且您执行了回滚到上一个提交的操作。现在您可以使用此提交 ID 来恢复更改。
git reset --hard 1b2c3d4
这里我们要做什么?我们告诉 Git 回滚到提交 1b2c3d4,并撤销我们所做的所有更改(在本例中,更改是删除该提交)。撤销删除操作实际上意味着恢复已删除的提交。
结论
希望这篇文章对您有所帮助,让您有所收获。如果您有任何问题或建议,欢迎在下方留言。
我知道在 Git 中至少有十几种不同的操作方式。为了简单起见,我选择了这四种,但如果你想在评论区补充更多,欢迎留言!
我再次建议大家观看现场演示,并给这篇文章(以及视频)点赞,以支持我的工作。谢谢!
感谢阅读本文,希望您觉得有趣!
我最近创建了一个 Discord 服务器,用来讨论开源和 Web 开发,欢迎加入:https://discord.gg/bqwyEa6We6
你喜欢我的内容吗?不妨订阅我的YouTube频道!这对我很重要❤️
你可以在这里找到它:
欢迎关注我,以便在新文章发布时收到通知 ;)