在代码编写过程中,犯错是常态。可能是手滑写错了代码,可能是 git add 提交了错误的文件,甚至是 git commit 写错了提交信息。Git 的强大之处在于,它几乎为每一个阶段的错误都提供了“撤销”机制。
我们需要根据文件当前所处的状态(工作区、暂存区、版本库),选择正确的命令。
情况描述:
你在编辑器里修改了代码,还没有执行 git add。此时你发现改错了,想要放弃当前的修改,直接恢复成上一次提交(或暂存区)的样子。
操作命令:
git restore <filename>
(注:旧版 Git 常用 git checkout -- <filename>,新版本推荐使用 restore 语义更清晰)
效果:
此命令会丢弃工作区的修改,文件内容恢复为暂存区的状态(如果暂存区为空,则恢复为版本库的状态)。
⚠️ 危险警告: 此操作不可逆。一旦执行,你在编辑器里敲的代码将彻底消失,无法找回。请确保你真的不再需要这些修改。
情况描述:
你已经执行了 git add <filename>,文件已经进入了暂存区。此时你发现暂存的文件是错的,或者不想把它包含在接下来的提交中。你想把它从暂存区移回工作区,但保留文件内容的修改。
操作命令:
git restore --staged <filename>
(注:旧版 Git 常用 git reset HEAD <filename>)
效果:
文件会从暂存区移除,状态变回“未暂存”或“已修改”,但文件内容的修改完好无损。这让你有机会重新编辑,或者选择性地暂存部分内容。
情况描述:
你刚刚执行了 git commit,但发现:
你想修改这次刚刚完成的提交,而不是创建一个新的提交。
操作命令:
# 修改提交信息
git commit --amend -m "新的提交信息"
# 或者,补漏文件
git add forgotten_file
git commit --amend --no-edit
效果:
--amend 参数会用当前的暂存区内容覆盖最近一次提交,并生成一个新的提交 ID。
⚠️ 重要原则: 永远不要修改已经推送到远程仓库的提交。 这会改写历史记录,导致其他协作者的历史出现冲突。
情况描述:
你想撤销最近的一次或多次提交,回到过去某个确定的版本。
操作命令:
首先,使用 git log --oneline 查看历史记录,找到你想回到的那个版本号(Commit Hash),例如 a1b2c3d。然后使用 git reset 命令。
reset 命令有三种主要模式,非常关键:
模式一:--soft(软重置)
git reset --soft <commit_hash>