在提交前撤销 'git add' 的方法
在提交前撤销 ‘git add’ 的方法
技术背景
在使用Git进行版本控制时,git add 命令用于将文件从工作目录添加到暂存区(也称为索引),为后续的提交做准备。但有时我们可能会不小心添加了错误的文件或所有文件,这时候就需要在提交前撤销 git add 操作。
实现步骤
撤销特定文件的添加
若要将特定文件从当前索引(即“即将提交”的列表)中移除,同时不改变其他内容,可以使用以下命令:
1 | |
在旧版本的Git中,该命令等同于 git reset HEAD <file>。自Git 1.8.2版本起,即使在首次提交之前也能使用此命令。
撤销当前更改集中所有文件的添加
若要撤销当前更改集中所有文件的添加,可以使用以下命令:
1 | |
旧版本的Git中,此命令等同于 git reset HEAD。同样,自Git 1.8.2版本起,即使在首次提交之前也可使用。
使用 git rm --cached
若在新仓库中(尚未进行任何提交),git reset 可能会失败。此时,可以使用 git rm --cached <file> 来移除特定文件的暂存状态:
1 | |
若要递归地移除当前目录下所有添加的文件,可以使用:
1 | |
使用 git restore(Git 2.23+)
自Git 2.23版本(2019年8月发布)起,可以使用 git restore 命令来撤销文件的暂存状态。
撤销单个文件的暂存:
1 | |
撤销所有文件的暂存:
1 | |
使用交互式添加模式
可以使用 git add -i 进入交互式添加模式,在该模式下撤销刚刚添加的文件:
1 | |
进入交互模式后,按 r 选择“revert”操作,输入要撤销的文件编号,最后按 q 退出。
使用GUI工具
还可以使用Git的GUI工具来撤销文件的暂存。例如,运行 git gui 命令打开GUI窗口,手动取消勾选“Staged changes (will commit)”中的文件。
1 | |
核心代码
以下是一些常见场景的核心代码示例:
- 撤销特定文件的添加:
1 | |
- 撤销所有文件的添加:
1 | |
- 在新仓库中撤销特定文件的添加:
1 | |
- 递归撤销当前目录下所有文件的添加:
1 | |
- 使用
git restore撤销单个文件的添加(Git 2.23+):
1 | |
- 使用
git restore撤销所有文件的添加(Git 2.23+):
1 | |
最佳实践
- 创建初始提交:在开始新项目时,先创建一个
.gitignore文件并提交,这样后续就能更自由地使用git add和git reset命令。 - 使用别名:可以为常用的撤销命令创建别名,例如:
1 | |
之后就可以使用 git unadd 和 git unstage 来撤销文件的添加。
常见问题
git reset 失败
在新仓库中(尚未进行任何提交),使用 git reset 可能会失败,提示 fatal: Failed to resolve 'HEAD' as a valid ref.。此时可以使用 git rm --cached 来替代。
丢失未提交的暂存版本
git reset HEAD 无法恢复之前暂存但未提交的文件内容,它只是从 HEAD 重新同步文件。如果误操作覆盖了之前的暂存版本,将无法恢复。
文件名与分支名冲突
若文件名与分支名相同,使用 git checkout <file> 时可能会出现冲突。此时可以使用 git checkout -- <file> 来明确指定是要恢复文件。