来自commit的git checkout文件后,git diff显示没有变化?

时间:2014-03-16 19:47:53

标签: git git-diff git-checkout

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

git checkout HEAD^^ Xml/Config-Profile.xml
git status

我明白了:

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

如果我这样做,git diff,我没有任何区别。我已经想出如果我做git diff --cached,它会显示更改,所以我想这意味着我的checkout命令从存储库的HEAD ^^提交中提取并更新了'仅限索引'?

我想我的顾虑是(我无法直接从结帐手册页中查看信息):

1)为什么只有索引更新?为什么我只是将我的工作目录中的Config-Profile.xml文件替换为文件的某些(上一个)副本?

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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.

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

git reset HEAD Xml/Config-Profile.xml

根据您的git status输出建议。

答案 1 :(得分:1)

当为git checkout提供提交和路径时,它会更新工作树中的路径和提交中的索引。

git diff,在不带参数的情况下调用时,会将工作树与索引进行比较。由于两者都使用相同的文件进行更新,因此您无法看到任何更改。

  

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

你可以做到

git show HEAD:Xml/Config-Profile.xml > Xml/Config-Profile.xml