使用 git,如何将工作树(本地文件系统状态)重置为索引(“暂存”文件)的状态?

情况:

  1. 编辑文件
  2. git add将文件添加到索引中(这些文件现在是“暂存的”)
  3. 编辑更多文件

现在我们有三种不同的状态: HEAD状态(指向最后一次提交)、索引状态(包括所有添加的或“暂存”的文件)和工作树状态(非暂存的本地文件系统状态)。撤消工作树中的更改以使其与索引状态匹配的命令是什么?

36047 次浏览

您可以使用 Git-checkout-index(git checkout-index)。请注意,您需要添加

  • -f强制它覆盖现有文件,或者
  • -f -a强制覆盖索引中的所有路径。

您可以使用 git stash save --keep-index来完成此操作。保存好存货后,如果你不想把它放在身边,你可以使用 git stash drop

我倾向于使用从工作目录开始丢弃所有变化的 git checkout .。如果您不是存储库的根用户,那么这将产生不同的结果。

这个命令不删除新创建的文件,这通常是一件好事。如果您需要这样做,那么您也可以使用 git clean

无论当前工作目录如何,git checkout :/都会丢弃工作树中的所有更改,并将其替换为索引中的内容。

Https://git-scm.com/docs/gitglossary#documentation/gitglossary.txt-aiddefpathspecapathspec

我认为其他的答案不能完整地表达出来,以下是你需要的:

只有命令:

git checkout-index -fa
# See the WARNING below before running this command.
git clean -fd

附上详细意见:

注意: 运行 git status。显示的变化 绿色的是在您的 索引。这些是“分阶段”的变化。显示的 红色的更改在您的 工作树或本地文件系统中,但不在 索引中。这些都是“未上演”的变化。调用 git checkout-index -fa会迫使你的 工作树与你的 索引匹配,所以在运行该命令后,git status将不再显示那些红色的变化,git checkout-index -fa1是你工作树中的 git checkout-index -fa2,在这种情况下,需要 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.

参见:

  1. 这个 Peter Tillemans 的大力帮助
  2. 我的答案,我需要这些命令做一个 --hard--soft git 路径重置
  3. [我的答案,其中包含 “所有关于检出 git 中的文件或目录”] 如何从另一个分支获取一个文件?

使用新的 git restore命令。

从索引(从暂存文件)恢复工作树:

git restore .

从索引(从分级版本)恢复工作树中的单个文件:

git restore myFile

来源: Https://git-scm.com/docs/git-restore