我如何抛弃工作副本中未在索引中的更改?
使用以下命令对当前工作目录中所有未暂存的文件进行操作:
git restore .
针对特定文件使用:
git restore path/to/file/to/revert
git switch
取代了混淆的 git checkout
(详情请参见这里),因此取消了参数歧义。
如果一个文件既有暂存的更改又有未暂存的更改,则只有在 git diff
中显示的未暂存更改被还原。在 git diff --staged
中显示的更改保持不变。
Git 2.23之前
对于当前工作目录中的所有未暂存文件:
git checkout -- .
针对特定文件:
git checkout -- path/to/file/to/revert
--
用于消除歧义(这被称为参数消歧义)。
git checkout -- .
的意思和git checkout .
一样,只是你明确表示你没有指定分支名称。它们都表示在当前分支上检出'.'或'./'的HEAD版本。如果你通常执行git checkout branch-name directory-or-file-name
,它会获取branch-name
分支中directory-or-file-name
的HEAD版本。 - akgill另一种更快的方法是:
git stash save --keep-index --include-untracked
如果您不想彻底处理它,可以不包括--include-untracked
。
之后,您可以使用git stash drop
命令删除该存储(stash)。
git reset
命令也会丢弃索引中的更改。 - Greg Hewgillgit stash
还是任何类型的 git checkout
都不会丢弃未暂存的删除操作。根据 git status
的输出,实际正确的方法是使用某种形式的 git reset HEAD
。 - Chris Warthgit checkout -- .
只需一个命令就可以完成任务。 - Felipe Tonello看起来完整的解决方案是:
git clean -df
git checkout -- .
警告:尽管它不会删除在.gitignore中直接提到的被忽略文件,git clean -df
可能会删除位于文件夹中的被忽略文件。
git clean
可以移除所有未跟踪的文件,而git checkout
则可以清除所有未提交的更改。
git reset --hard
恢复到上一个提交相同。 - Amanuel Nega此命令将检查当前目录的当前索引,丢弃所有从当前目录向下的文件中的更改。
git checkout .
或者使用这个命令从索引中检出所有文件,覆盖工作树中的文件。
git checkout-index -a -f
git stash save --keep-index
。 - Rhubbarbgit checkout --
将无法工作。而 git checkout .
则总是有效的。 - Ed Bayiatesgit clean
结合使用,还可以删除未跟踪的文件。 - jlhgit clean -df
从当前目录开始,通过递归删除未受版本控制的文件来清理工作区。
-d
:除了未跟踪的文件,还会删除未跟踪的目录
-f
:强制删除(根据 clean.requireForce
设置可能不必要)
运行git help clean
查看手册。
您现在可以使用以下命令丢弃一个已跟踪文件中的未暂存更改:
git restore <file>
在当前目录中(递归地),以及所有被跟踪的文件中,使用以下内容:
git restore .
git restore .
完美地解决了这个问题。谢谢。 - Saurabh Misragit restore <文件名>
命令,它完美地执行了。 - Merlingit restore .
仅恢复当前目录中的所有文件,而不是整个代码库中的所有文件。 - jarnogit commit -m "wip" && git reset --hard && git reset --soft HEAD~1 && git reset
。 - gomes我最喜欢的是
git checkout -p
这可以让你有选择性地还原段落。
另请参见:
git add -p
-p
参数可以添加额外的安全层。结合 git clean -d
命令来回答 OP 的问题。 - Stephan Henningsen由于没有答案提供我所使用的确切选项组合,因此在这里:
git clean -dxn . # dry-run to inspect the list of files-to-be-removed
git clean -dxf . # REMOVE ignored/untracked files (in the current directory)
git checkout -- . # ERASE changes in tracked files (in the current directory)
这是用于git clean
选项的在线帮助文本:
-d
除了未跟踪的文件外,还会删除未跟踪的目录。如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会将其删除。如果您真的想删除此类目录,请将选项-f
使用两次。
-x
不使用从.gitignore
(按目录)和$GIT_DIR/info/exclude
读取的标准忽略规则,但仍然使用通过-e
选项给定的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。可以使用此方法(可能与git reset
一起)创建原始的工作目录以测试干净的构建。
-n
实际上不会删除任何内容,只显示将要执行的操作。
-f
如果Git配置变量clean.requireForce
没有设置为false
,则Git clean将拒绝删除文件或目录,除非给出-f
、-n
或-i
。Git将拒绝删除.git
子目录或文件中的目录,除非给出第二个-f
。
git reset --hard
代替?(实际上等同于git reset --hard HEAD
,并且应该适用于当前目录...) - ErikMDgit clean -dfx
,这里有一个提示,我在运行它之前使用的是为了保险起见:只需先运行 git clean -d -x -n
,以显示要删除的文件列表,然后通过运行 git clean -d -x -f
来确认操作(我将参数 -n
和 -f
放在末尾,以便能够在终端中快速更改它)。 - ErikMD.gitignore
中的文件,它们将会丢失。因此,在执行此操作前请考虑备份您的项目。 - Robgit status
中显示的未跟踪文件,而不删除在 .gitignore
中的未跟踪文件? - Aaron Franke如果你只是希望撤销对现有文件的更改,请使用checkout
(在这里有文档记录)。
git checkout -- .
--
) 告诉 Git 其后应被作为第二个参数(路径)处理,你省略了分支的指定。.
) 表示所有路径。如果您想要删除自上次提交以来添加的文件,请使用 clean
(在此文档中有说明):
git clean -i
-i
选项启动交互式的clean
,以防止误删。如果您希望将更改移动到保留空间以供稍后访问,请使用stash
(在此处记录):
git stash
最简单的方法是使用以下命令:
该命令用于放弃工作目录中的更改 -
git checkout -- .
使用Git命令进行未跟踪文件的隐藏可以通过以下方式实现:
https://git-scm.com/docs/git-checkout
git stash -u
.
。提醒未来的自己:这个句号是必须的! - bejadogit clean -fd
命令来清理不在索引中的文件。 - oligofren
git-clean
只会从工作树中删除未被跟踪的文件。详见 https://git-scm.com/docs/git-clean。 - Yegagit-clean -df
可能会很危险。它会删除本地未被跟踪的文件(例如由.gitignore
覆盖的文件)。请仔细阅读以下所有内容,并考虑使用git checkout .
代替。 - jacanterburygit status
命令会提供建议,告诉你如何操作!执行git checkout -- .
命令即可。 - Paulogit status
建议使用git restore
命令来达到相同的目的,这是一个新的命令。请参考我的2019更新。 - prosoitos