使用git,如何将工作树重置为索引的状态?

时间:2010-06-24 06:54:13

标签: git

情况:

  1. 编辑文件
  2. 将文件添加到索引
  3. 修改更多文件
  4. 现在我们有三种不同的状态。 HEAD的状态,索引的状态和工作树的状态。撤消工作树中的更改以使其与索引的状态匹配的命令是什么?

4 个答案:

答案 0 :(得分:66)

我倾向于使用git checkout .来放弃工作目录中的所有更改。如果您不在存储库的根目录,这会产生影响。

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

答案 1 :(得分:13)

您可以使用git stash save --keep-index执行此操作。保存存储后,如果您不想保留它,可以使用git stash drop

答案 2 :(得分:9)

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

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

答案 3 :(得分:3)

我认为其他答案没有涵盖全部部分。这是您需要的:

只是命令:

git checkout-index -fa
git clean -fd

附有详细评论:

注意:运行 git status。以绿色显示的更改在您的索引中。这些是“阶段性”变化。以红色显示的更改位于您的工作树或本地文件系统中,但不在索引中。这些是“未分阶段”的变化。调用 git checkout-index -fa 会强制您的工作树与您的 index 匹配,因此 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.

另见:

  1. 这个great help from @Peter Tillemans
  2. my answer where I needed these commands to do a --hard or --soft git reset by path
  3. [我的回答,其中包含“关于在 git 中检出文件或目录的所有内容”] How to get just one file from another branch