Git-显示头和初始(第一个)版本之间的文件差异

Git-显示头和初始(第一个)版本之间的文件差异,git,diff,Git,Diff,假设某个存储库在某个点创建了一个文件test.txt,并将其与一些数据一起提交到存储库。该文件可能不在存储库的初始提交中 git diff 27fa75e test.txt 接下来,许多提交都会对此文件进行更改。 现在,我想生成diff输出,显示文件test.txt的初始(第一)版本与当前(HEAD)之间的差异。 我该怎么做 编辑:问题更改为注意文件可能不在初始提交中 git diff 27fa75e test.txt 其中,27fa75e是初始版本的哈希。您可以使用git log找到该散列

假设某个存储库在某个点创建了一个文件
test.txt
,并将其与一些数据一起提交到存储库。该文件可能不在存储库的初始提交中

git diff 27fa75e test.txt
接下来,许多提交都会对此文件进行更改。 现在,我想生成
diff
输出,显示文件
test.txt的初始(第一)版本与当前(
HEAD
)之间的差异。 我该怎么做

编辑:问题更改为注意文件可能不在初始提交中

git diff 27fa75e test.txt
其中,
27fa75e
是初始版本的哈希。您可以使用
git log
找到该散列

如果原始提交中不存在该文件,
git
会让您知道它是一个新文件。要查找文件的第一次提交,可以使用git log

git log test.txt

这将为您提供该文件的所有提交的日志,最后一个日志将在文件首次提交时显示。请注意,如果文件被重命名,这将没有帮助,如果文件被重命名,则跟踪原始版本将困难得多。讨论如何深入到存储库并提取提交:您必须返回相关提交并进行文件比较,以找到要查找的文件。

首先,获取包含
test.txt
的第一次提交的哈希值

git log --oneline --diff-filter=A -- text.txt
然后,用
区分该散列。(请确保先拉出当前的
头部
。)

这两个命令可以组合在一起

git diff `git log --oneline --diff-filter=A -- text.txt | awk '{print $1}'` HEAD text.txt

我似乎找到了解决办法。我使用
git log--reverse
获取第一次提交的哈希值,该哈希值与文件相接触,并与HEAD进行比较:

git diff `git log --pretty=format:"%h" --reverse test.txt | head -1` HEAD test.txt

根据soundslikeodd的回答。实际上不是答案

这是我为自己写的脚本,为什么不在这里分享呢。。。它接受git版本控制下的任何文件,并执行文件的最早版本。我认为,如果同一个文件被多次添加(并在其间被删除),并且我还没有对其进行彻底测试,那么这将无法可靠地工作。不过,我做的事情是确保我可以在任何地方使用这个脚本(我将它设置为别名)


我之所以添加这个作为答案,只是因为它不能很好地格式化为注释。如果您不喜欢这种回答,请告诉我。

谢谢您的回复。我忘了添加一个问题,即要检查的文件不一定出现在初始提交中。我的错。我编辑了这个问题。这有点不清楚:如果文件在初始提交中不存在,那么初始提交中存在的文件和头部中存在的文件之间的区别只是当前头部中文件的总和?你能澄清一下“不存在”是什么意思吗?我的意思是我想知道该特定文件的第一个版本(第一次提交涉及该文件)和HEAD之间的区别。谢谢你的回复。我忘了添加一个问题,即要检查的文件不一定出现在初始提交中。我的错。我编辑了这个问题。我需要找到首先引入文件的提交。@vatsug,你使用了@soundslikeodd的脚本吗?它完全符合你的要求。
diff过滤器
将日志限制为仅添加一次,并且由于该文件仅添加了一次,因此您将获得该文件的第一次提交的哈希值(无论何时)。@PatrickSteele抱歉。未看到包含handy oneliner的编辑。非常感谢。我接受这个答案。你是在问如何确定回购协议初始提交时的
test.txt
状态吗?我想指出的是,之前的两个答案都包含了这方面的变化。此外,如果文件被重命名或移动,您将只获得第一次使用新名称的提交。如何使其处理重命名和删除,那么“删除”在这里没有意义,但我已添加了一个链接,指向我的答案,以处理更复杂的返回提交问题。
#!/bin/bash
#takes a file under git version control as the first argument. diffs with the files original version.
cd $(dirname "$1")
git diff $(git log --oneline --diff-filter=A -- $1 | awk '{print $1}') HEAD $1