撤销与修改

在代码编写过程中,犯错是常态。可能是手滑写错了代码,可能是 git add 提交了错误的文件,甚至是 git commit 写错了提交信息。Git 的强大之处在于,它几乎为每一个阶段的错误都提供了“撤销”机制。

我们需要根据文件当前所处的状态(工作区、暂存区、版本库),选择正确的命令。

1. 场景一:撤销工作区修改

情况描述:

你在编辑器里修改了代码,还没有执行 git add。此时你发现改错了,想要放弃当前的修改,直接恢复成上一次提交(或暂存区)的样子。

操作命令:

git restore <filename>

(注:旧版 Git 常用 git checkout -- <filename>,新版本推荐使用 restore 语义更清晰)

效果:

此命令会丢弃工作区的修改,文件内容恢复为暂存区的状态(如果暂存区为空,则恢复为版本库的状态)。

⚠️ 危险警告: 此操作不可逆。一旦执行,你在编辑器里敲的代码将彻底消失,无法找回。请确保你真的不再需要这些修改。

2. 场景二:撤销暂存区修改

情况描述:

你已经执行了 git add <filename>,文件已经进入了暂存区。此时你发现暂存的文件是错的,或者不想把它包含在接下来的提交中。你想把它从暂存区移回工作区,但保留文件内容的修改。

操作命令:

    git restore --staged <filename>

(注:旧版 Git 常用 git reset HEAD <filename>)

效果:

文件会从暂存区移除,状态变回“未暂存”或“已修改”,但文件内容的修改完好无损。这让你有机会重新编辑,或者选择性地暂存部分内容。

3. 场景三:修改最后一次提交

情况描述:

你刚刚执行了 git commit,但发现:

  1. 提交信息写错了。
  2. 漏掉了一个文件没有提交。

你想修改这次刚刚完成的提交,而不是创建一个新的提交。

操作命令:

    # 修改提交信息
git commit --amend -m "新的提交信息"

# 或者,补漏文件
git add forgotten_file
git commit --amend --no-edit

效果:

--amend 参数会用当前的暂存区内容覆盖最近一次提交,并生成一个新的提交 ID。

⚠️ 重要原则: 永远不要修改已经推送到远程仓库的提交。 这会改写历史记录,导致其他协作者的历史出现冲突。

4. 场景四:版本回退

情况描述:

你想撤销最近的一次或多次提交,回到过去某个确定的版本。

操作命令:

首先,使用 git log --oneline 查看历史记录,找到你想回到的那个版本号(Commit Hash),例如 a1b2c3d。然后使用 git reset 命令。

reset 命令有三种主要模式,非常关键:

模式一:--soft(软重置)

    git reset --soft <commit_hash>