实战场景教程
救命!我刚刚的 commit 提交错了怎么办?
1. 问题的场景
手速太快,不小心提交了一个包含错误代码或者不完整的 commit。你希望这笔“黑历史”从记录中彻底消失。这时候,你需要 Git 的“时光机”——git reset。
git reset 可以把你的分支的 HEAD 指针移回到过去某个特定的 commit,让你有机会重新开始。
⚠️ 重要警告: 和
amend一样,git reset也是在改写历史。请只对那些还没有推送到远程仓库(push)的 commit 使用它。
2. 三种不同威力的“后悔药”
git reset 后面通常会跟一个模式参数,最常用的是 --soft,--mixed 和 --hard。它们决定了你的代码在“回到过去”之后会处于什么状态。
假设你要撤销的,是刚刚完成的那最后一次提交。
场景一:只想重新写 Commit Message (最安全)
你对代码很满意,只是想换个说法来描述这次提交。
git reset --soft HEAD~1
- 发生了什么: Git 撤销了上一次的 commit,但把你上次提交的所有代码修改,都完整地保留在了“暂存区”。
- 接下来做什么: 你可以立刻用一个新的 message 重新
git commit。
场景二:想补充修改,或者拆分 Commit
你发现上次提交的代码有点问题,需要修改一下再重新提交。
git reset --mixed HEAD~1
# 或者直接 git reset HEAD~1,因为 --mixed 是默认模式
- 发生了什么: Git 撤销了上一次的 commit,并且把你上次提交的所有代码修改,都保留在了“工作区”(也就是文件还在,但没有
git add)。 - 接下来做什么: 你可以修改代码,然后重新
git add和git commit。
场景三:想彻底“断舍离” (最危险)
你发现上一次提交完全是个错误,代码和想法都不要了,想让它从宇宙中彻底消失。
git reset --hard HEAD~1
- 发生了什么: Git 撤销了上一次的 commit,并且彻底删除了你上次提交的所有代码修改。你的工作区会变得和倒数第二次 commit 时一模一样。
- 接下来做什么: 没得做了,代码已经没了。请极其谨慎地使用这个命令!
总结: HEAD~1 表示回到 HEAD 之前的第 1 个 commit。如果你想撤销最近的 3 次 commit,就用 HEAD~3。大多数情况下,--soft 和 --mixed 是你最安全、最常用的伙伴。