在提交 git checkout 文件后,git diff 没有显示任何变化?

Ter*_*rry 4 git git-diff git-checkout

我对 git checkout 行为感到困惑。如果我想获取该文件的先前版本并执行以下操作:

git checkout HEAD^^ Xml/Config-Profile.xml
git status
Run Code Online (Sandbox Code Playgroud)

我得到:

On branch master
Your branch is up-to-date with 'origin/master'

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified: Xml/Config-Profile.xml
Run Code Online (Sandbox Code Playgroud)

如果我这样做了,git diff,我没有区别。我发现如果我执行 git diff --cached,它会显示更改,所以我想这意味着我的 checkout 命令从存储库的 HEAD^^ 提交中提取并更新了“仅索引”?

我想我的担忧是(而且我无法直接从结帐手册页中获取信息):

1)为什么只有索引得到更新?为什么它不像我只是用文件的一些(以前的)副本替换了我的工作目录中的 Config-Profile.xml文件?

2)我想是什么让这让我感到困惑,也许这只是语义,是如果我在我的工作目录中编辑一个文件并决定我不喜欢它并做了一个 git checkout,它会替换文件工作目录。说完之后,我猜测 git checkout 会将索引中的最新文件拉入工作目录,而不是存储库中最新提交的文件?

3)是否有一个命令可以将文件从提交中直接拉到工作目录中,就好像我自己手动编辑到那个点一样?还是我需要创建自定义别名?

提前致谢。

mic*_*has 5

git checkout 更新索引和工作树。

git diff 将工作树与索引进行比较。

git diff --cached 将索引与 HEAD 进行比较。

git help checkoutgit checkout <tree-ish> -- <pathspec>

    The <tree-ish> argument can be used to specify a specific tree-ish 
    (i.e. commit, tag or tree) to update the index for the given paths
    before updating the working tree.
Run Code Online (Sandbox Code Playgroud)

如果您真的只想更新您的工作树,您可以使用以下方法重置索引:

git reset HEAD Xml/Config-Profile.xml
Run Code Online (Sandbox Code Playgroud)

正如您的git status输出所建议的那样。