【问题标题】:Using git, how do you reset the working tree (local file system state) to the state of the index ("staged" files)?使用 git,如何将工作树(本地文件系统状态)重置为索引状态(“暂存”文件)?
【发布时间】:2011-03-07 16:08:52
【问题描述】:

情况:

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

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

【问题讨论】:

  • 我编辑了您的问题以定义并明确“工作树”和“索引”的含义,因为我多年来一直使用git,直到昨天才发现这些术语的含义。我认为这将有助于接触更多的人,因为大多数使用git 的“大众”不知道这些术语,但他们确实知道他们的本地文件系统是什么,git add 是什么,以及绿线是什么(上演索引中的内容)表示当他们查看git status 时。希望您对这些更改感到满意。

标签: git


【解决方案1】:

我倾向于使用git checkout .,它会丢弃工作目录下的所有更改。如果您不在存储库的根目录,这会有所不同。

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

【讨论】:

  • 这也适用于单个文件名:git checkout [file ...]。谢谢!
  • 出于好奇,您知道如何撤消此操作吗?
  • 我发现git checkout :/ 会丢弃工作树中的所有更改,而不管当前工作目录如何。
  • 我已经使用 git 多年了,我似乎每天都在学习新东西。当我需要来自另一个分支的文件时,我遇到了这个问题,所以我检查了它。然后编辑,并想恢复。您可以在不指定分支名称的情况下再次执行git checkout,它默认为索引的状态。干得好。
  • @Gershy,您无法撤消此操作。撤消此操作就像撤消 rm some_file,或撤消您跳过垃圾桶的删除操作。因此,在执行此操作之前,请确保它是您真正想要的。
【解决方案2】:

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

【讨论】:

  • 这太不直观了,我想知道我是否误解了什么。我想做的是有合并冲突的git reset --hard <specific file>,这样我就可以git pull 最新版本。但是 git 不会让我对单个文件这样做。除了git stash之外,真的没有办法回滚对工作目录中文件的更改吗??
  • @Andy:要回滚特定文件,git checkout -- <specific file>
  • 哦!我什至没有想到这一点,这与我来自的其他 SCM 和 GUI 工具不同。谢谢!
【解决方案3】:

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

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

【讨论】:

  • 查看man git checkout-index 获取本地手册页。运行man git,然后运行/,然后输入git-checkout-index,然后回车,也可以在man git 主页面中阅读有关它的简短介绍。它的描述是“将文件从索引复制到工作树。”。
【解决方案4】:

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

https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec

【讨论】:

    【解决方案5】:

    我认为其他答案不能完整地体现出来。这是您需要的:

    只是命令:

    git checkout-index -fa
    git clean -fd
    

    有详细的 cmets:

    注意:运行git status绿色显示的更改在您的索引中。这些是“阶段性”的变化。 红色显示的更改在您的工作树或本地文件系统中,但不在索引中。这些是“未分阶段”的变化。调用git checkout-index -fa 会强制您的工作树 匹配您的索引,因此git status 在运行该命令后将不再以红色显示这些更改,除非 em> 这是一个全新的文件你在你的工作树中,在这种情况下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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2023-03-17
      相关资源
      最近更新 更多