Git 中丢弃未暂存更改的方法
技术背景
在使用 Git 进行版本控制时,我们常常会对文件进行修改。这些修改会处于不同的状态,如未暂存、已暂存和已提交。有时,我们可能需要丢弃那些还未暂存的更改,以恢复到之前的状态。这可能是因为我们进行了错误的修改,或者想要重新开始某些工作。
实现步骤
方法一:使用 git restore
(Git 2.23 及以上版本)
- 丢弃当前工作目录下所有未暂存文件的更改:
git restore .
- 丢弃特定文件的未暂存更改:
git restore path/to/file/to/revert
方法二:使用 git checkout
(Git 2.23 之前版本)
- 丢弃当前工作目录下所有未暂存文件的更改:
git checkout -- .
- 丢弃特定文件的未暂存更改:
git checkout -- path/to/file/to/revert
方法三:结合 git clean
和 git checkout
git clean -df
git checkout -- .
git clean -df
用于删除所有未跟踪的文件和目录,git checkout -- .
用于清除所有未暂存的更改。
方法四:使用 git stash
git stash save --keep-index --include-untracked
如果不需要处理未跟踪的文件,可以不使用 --include-untracked
。之后,如果想丢弃这个 stash,可以使用 git stash drop
命令。
方法五:使用 git checkout -p
git checkout -p
此命令可以让你选择性地撤销更改块。
核心代码
使用 git restore
丢弃未暂存更改
# 丢弃当前目录下所有未暂存更改
git restore .
# 丢弃特定文件的未暂存更改
git restore path/to/file
使用 git checkout
丢弃未暂存更改
# 丢弃当前目录下所有未暂存更改
git checkout -- .
# 丢弃特定文件的未暂存更改
git checkout -- path/to/file
结合 git clean
和 git checkout
git clean -df
git checkout -- .
最佳实践
- 使用
git status
查看状态:在执行任何丢弃操作之前,使用git status
命令查看当前工作目录的状态,确保你要丢弃的是未暂存的更改。 - 使用
git restore
或git checkout
处理已跟踪文件:如果只需要丢弃已跟踪文件的未暂存更改,优先使用git restore
(Git 2.23 及以上)或git checkout
。 - 结合
git clean
处理未跟踪文件:如果存在未跟踪的文件,并且你确定要删除它们,可以结合使用git clean -df
。 - 使用
git stash
保存更改:如果你不确定是否要永久丢弃更改,可以使用git stash
将更改保存起来,之后可以随时恢复。
常见问题
git checkout -- .
提示错误
如果存在未跟踪的文件,git checkout -- .
可能会提示错误:error: The following untracked working tree files would be overwritten by checkout
。此时可以结合 git clean -df
先删除未跟踪的文件,再执行 git checkout -- .
。
git clean -df
删除了重要文件
git clean -df
可能会删除一些你不想删除的文件,如配置文件等。在执行该命令之前,可以先使用 git clean -dfn
进行预览,确认要删除的文件列表。
git stash
污染了 stash 栈
git stash
会将更改保存到 stash 栈中,如果频繁使用可能会导致 stash 栈变得混乱。可以使用 git stash drop
删除不需要的 stash。