情况:
- 编辑文件
- 使用
git add
将文件添加到索引中(这些文件现在被“暂存”) - 编辑更多文件
现在我们有三个不同的状态:HEAD
状态(指向最后一次提交),索引状态(包括所有已添加或“暂存”的文件)和工作树状态(未暂存,本地文件系统状态)。如何撤销工作树中的更改,以使其与索引状态匹配?
git reset
与选项--hard
,它会重置工作树的状态以匹配索引状态。情况:
git add
将文件添加到索引中(这些文件现在被“暂存”)现在我们有三个不同的状态:HEAD
状态(指向最后一次提交),索引状态(包括所有已添加或“暂存”的文件)和工作树状态(未暂存,本地文件系统状态)。如何撤销工作树中的更改,以使其与索引状态匹配?
git reset
与选项--hard
,它会重置工作树的状态以匹配索引状态。我倾向于使用git checkout .
命令,它会放弃工作目录及以下的所有更改。如果您不在存储库的根目录下,这将产生差异。
此命令不会删除新创建的文件,通常这是一件好事。如果您需要执行此操作,则还可以使用git clean
命令。
git checkout :/
会放弃工作树中所有的更改,而不考虑当前的工作目录。 - musiphilgit checkout
而不指定分支名称,它会默认返回索引的状态。干得好。 - David Dombrowskygit checkout-index -fa
(正如Peter Tillemans所说)可以产生更好的结果。将git clean -fd
加入其中,并提供详细的解释,导致了我在这里创建了新的答案。 - Gabriel Staplesgit stash save --keep-index
来实现这个目的。保存好储藏后,如果你不想要它了,可以使用 git stash drop
去除它。git reset --hard <specific file>
,但这个文件有合并冲突,因此我只能git pull
最新版本。但是git不允许我为单个文件执行此操作。除了git stash之外,难道真的没有回滚工作目录中文件更改的方法吗? - Andygit checkout -- <specific file>
命令。 - Greg Hewgill使用新的git restore
命令。
从索引(已暂存文件)中还原工作树:
git restore .
从索引中还原工作树中的单个文件(从暂存版本):
git restore myFile
你可以使用git-checkout-index(git checkout-index
)命令。请注意,你需要添加
-f
选项以强制覆盖现有文件,或者-f -a
选项以强制覆盖索引中的所有路径。man git checkout-index
。运行man git
,然后输入/
和git-checkout-index
,然后按Enter键,在主man git
页面中阅读有关它的简短介绍。在那里的描述是“将文件从索引复制到工作树”。 - Gabriel Staplesgit checkout .
相比有什么优势/区别?为什么需要它? - Alessandro Dentellagit checkout-index -fa
# See the WARNING below before running this command.
git clean -fd
带有详细注释:
注意:运行 git status
命令。显示为 绿色 的更改位于你的 索引 中。这些是“已暂存”的更改。显示为 红色 的更改位于你的 工作树 或本地文件系统中,但不在 索引 中。这些是“未暂存”的更改。调用 git checkout-index -fa
命令会强制使你的 工作树 与你的 索引 相匹配,因此在运行该命令后,git status
不再以红色显示这些更改,除非它是你的工作树中的一个全新的文件,这种情况下需要使用 git clean -fd
命令来移除/删除它。
# 1. 'f'orce checkout 'a'll paths from the index (staged/added files) to the
# working tree (local file system)
git checkout-index -fa
# 2. 'f'orce clean (remove) all files and 'd'irectories which are in the working
# tree but NOT in the index. WARNING WARNING WARNING: this is a destructive
# command and cannot be undone. It is like doing `rm` to remove files.
# First, make sure no changes exist in red when you run `git status` which
# you want to keep.
git clean -fd
来自于man git checkout-index
:
-f, --force
forces overwrite of existing files
-a, --all
checks out all files in the index. Cannot be used together with
explicit filenames.
--hard
或--soft
git重置git checkout :/
命令可以丢弃工作树中的所有更改,并用索引中的内容替换它,而不考虑当前的工作目录。
https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec
git
已经有很多年了,但直到昨天才发现这些术语的含义。我认为这将有助于更多人理解,因为大多数使用git
的人不知道这些术语,但他们知道什么是本地文件系统,知道git add
是什么,以及当他们查看git status
时绿色行(索引中的暂存内容)的含义。希望你对这些改变感到满意。 - Gabriel Staples