如何从Git索引中获取文件内容?

46

我有一个文件已添加到本地版本库中。我在工作树中修改了它,所以git status将该文件列为已修改。在我暂存该文件之前,我想知道索引中保存的文件内容是什么。

我可以考虑两种方法:

  1. 还原由git diff生成的补丁,并将其应用于工作树中的文件
  2. 使用git checkout-index,指向一个临时文件并从中读取内容

是否有更简单的方法?

3个回答

77

使用:前缀来访问当前索引中(已暂存但尚未提交的)对象。

git show :file

请查看gitrevisions手册以获取更多信息。


我在“git show”文档中没有看到这种语法的提及。这是某种黑客技巧吗? - smwikipedia
4
请参考 gitrevisions(7) 以获取更多信息。 - user1686
使用 git show :./file 来表示相对路径。 - kyb

9

要从索引中获取文件,我不确定是否有预先编写的可脚本化的方法,但您可以使用ls-files来查询索引:

$ git ls-files -s README
100644 67cfeb2016b24df1cb406c18145efd399f6a1792 0   README
$ git cat-file blob 67cfeb2016b24df1cb406c18145efd399f6a1792
# etc.

您可以这样组合命令:
git cat-file blob $(git ls-files -s README | awk '{print $2}')
< p>(尽管我肯定是在重复造轮子。)

然而,如果你只想在编辑器中打开原始版本和你的更改,请使用difftool命令。它会将索引版本复制到临时文件中,并为您打开vimdiff(或任何您想要的),非常灵活。


4

使用git有三种获取差异的方式

git diff graph

因此,要查看工作目录中文件与索引之间的差异,只需执行以下操作:

git diff name_of_file

我已经在其他地方详细谈论了这个问题。

3
谢谢,但我对获取差异不感兴趣。我正在寻找整个文件内容。通过获得差异,我可以推断出在我进行更改之前的文件内容是什么,但我已经在问题中提到了这一点。 - zaza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接