假设某个存储库在某个时刻创建了一个文件test.txt
并使用一些数据将其提交到存储库。该文件可能不存在于存储库的初始提交中。
接下来,很多提交都会对此文件进行更改。
现在,我想生成diff
输出,该输出显示文件test.txt
的初始(第一个)版本与当前(HEAD
)之间的差异。
我该怎么做?
编辑:问题已更改为注意该文件可能不存在于初始提交中。
答案 0 :(得分:3)
首先,获取第一个包含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 $1}'` HEAD text.txt
答案 1 :(得分:0)
git diff 27fa75e test.txt
其中27fa75e
是初始版本的哈希值。您可以使用git log
找到该哈希值。
如果原始提交中不存在该文件,git
将通知您它是一个新文件。要查找文件的第一次提交,您可以使用git log
:
git log test.txt
这将为您提供该文件的所有提交的日志,最后一次提交文件的时间。请注意,如果重命名文件,这将无济于事,如果是,则跟踪原始版本将更加困难。 This question讨论了如何深入了解存储库并提取提交:您必须返回相关提交并进行文件比较以查找您正在查找的文件。
答案 2 :(得分:0)
我似乎找到了解决方案。我使用git log --reverse
来获取第一个提交的哈希,它接触文件并与HEAD进行比较:
git diff `git log --pretty=format:"%h" --reverse test.txt | head -1` HEAD test.txt
答案 3 :(得分:-1)
基于soundslikeodd的回答。实际上并不是答案。
这是我为自己编写的脚本,为什么不在这里分享...它需要git版本控制下的任何文件,git diff
s它是文件的最早版本。我认为如果多次添加相同的文件(并在中间删除),这将无法可靠地工作,我还没有彻底测试这个。我做的事情是确保我可以从任何地方使用这个脚本(我把它设置为别名)。
#!/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
我将此作为答案添加的原因只是它不能很好地格式化为注释。请告诉我这种答案是否在这里不受欢迎。