在提交前撤销 '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>
来明确指定是要恢复文件。