Git:显示文件内容,就像提交后的样子一样

51

在阅读Git pre-commit hook : changed/added files之后,我产生了以下问题:

假设我有一个文件,其中包含已暂存和未暂存的更改,如何在暂存后显示文件内容的预览?

示例:

echo "foo" >> file
git add file
echo "bar" >> file

期望输出:

[previous contents of file]
foo

1
“cat file” 不会显示您当前正在使用的 “file” 的工作副本吗? - Delan Azabani
是的,这是正确的解决方案 - 还是问题本身就错了? - silvio
可能是一个重复的问题:如何从git索引中获取文件的内容? - user123444555621
4
@Delan:执行cat file会显示出bar,这不是我想要的结果。 - user123444555621
不,它不会。它会显示 foo,然后是一个换行符,然后是 bar。http://i.imgur.com/uGwgq.png - Delan Azabani
4个回答

127

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

git show :file

参见gitrevisions(使用术语“stage 0”表示“正常”索引内容):

:[<n>:]<path>, e.g. :0:README, :README

冒号,可选后跟阶段号(0到3)和冒号,再跟路径,表示索引中给定路径处的blob对象。缺少阶段号(及其后面的冒号)表示阶段0条目。在合并期间,阶段1是公共祖先,阶段2是目标分支的版本(通常是当前分支),阶段3是正在合并的分支的版本。


所以,假设有一个脏文件README; HEAD:README 显示更改前的文件。:README 仅显示已暂存更改的文件。是否有任何方法可以仅显示未暂存更改的文件?我在链接的文档中没有看到任何指示。 - JD Isaacks
@JDIsaacks:不直接可以,因为存储库中没有这样的文件(虽然“:README”存在于索引中,“HEAD:README”存在于当前提交中)。但是,您可以尝试将“git diff README”输出(仅显示未暂存的更改)应用于“HEAD:README”的临时副本... - user1686
如果文件以前没有被提交,我使用 git show :file 没有成功。这是正常的吗?我不得不退回到 git ls-files -s <file> 然后 git cat-file -p <objHash> - Christopher King
1
请注意,语法现在(长期以来)已正式化为“:<数字>:<路径>”,其中数字表示要使用哪个索引:0(零)是包含将提交的文件的槽,而槽1、2和3仅在合并冲突期间使用。 - torek
1
正确 - 我建议答案可以注明有更完整的语法来获取可能的索引槽位。 (但是链接到“gitrevisions”可能已经足够了) - torek
显示剩余2条评论

6

正是我想要的。不幸的是,我的搜索没有找到那个其他的问题。 - user123444555621
@Pumbaa80:谢谢,但我认为grawity的答案更好,应该接受它 :) - Mark Longair

0

你可以使用 git diff --cached 命令,但这并不完全符合你的需求。

git grep -h --cached ^ -- file

对我来说很有效。


-2

这将显示已暂存文件的差异,但它不会显示如果您只是在编辑器中打开或使用 cat 命令查看该文件的外观方式。 - user456814
抱歉给你点了踩,但那是对�完全��问题的一个�常好的�答�😊 - pvandenberk

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