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

Git - show file diff between HEAD and initial (first) version

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

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

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

git diff 27fa75e test.txt

其中 27fa75e 是初始版本的哈希值。您可以使用 git log.

找到该哈希

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

git log test.txt

这将为您提供该文件所有提交的日志,最后一次提交的时间是文件首次提交的时间。请注意,如果文件已重命名,这将无济于事,如果已重命名,则追踪原始版本将更加困难。 This question 讨论如何深入存储库并提取提交:您必须返回相关提交并进行文件比较以找到您要查找的文件。

首先,获取其中包含 test.txt 的第一个提交的哈希值。

git log --oneline --diff-filter=A -- text.txt

然后,将散列与 HEAD 进行比较。 (确保先拉出当前 HEAD。)

git diff [hash from previous command] text.txt

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

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

我好像找到了解决办法。我使用 git log --reverse 获取涉及文件的第一个提交的哈希值并与 HEAD:

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

基于 soundslikeodd 的回答。实际上不是答案。

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

#!/bin/bash
#takes a file under git version control as the first argument. diffs with the files original version.
cd $(dirname "")
git diff $(git log --oneline --diff-filter=A --  | awk '{print }') HEAD 

我将其添加为答案的原因只是因为它不能很好地格式化为评论。如果这种回答在这里不受欢迎,请告诉我。