2016-12-28 47 views
2

假设某些存储库在某个时刻创建了一个文件test.txt并将其提交到存储库并添加了一些数据。该文件可能不存在于存储库的初始提交中。Git - 在HEAD和初始(第一个)版本之间显示文件差异

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

编辑:问题改变,注意该文件可能不存在于初始提交。

+0

你问如何确定'test.txt'的状态,它是最初提交给repo的? – soundslikeodd

回答

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 
+0

感谢您的回复。我忘了添加一个问题,即要检查的文件不一定出现在初始提交中。我的错。我编辑了这个问题。我需要找到首先引入该文件的提交。 – vatsug

+0

@vatsug,你使用@ soundslikeodd的脚本吗?它确实**你正在问什么。 'diff-filter'将日志限制为只添加,并且由于该文件只添加一次,您可以获得该文件的第一次提交的散列(无论何时)。 – PatrickSteele

+2

@PatrickSteele对不起。没有看到包含便利的再版内容的编辑。谢谢!我接受这个答案。 – vatsug

0
git diff 27fa75e test.txt 

其中27fa75e是初始版本的散列。您可以使用git log找到该散列。

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

git log test.txt 

这会给你一个日志中的所有与该文件的提交,其中最后将当文件第一次犯下的。请注意,如果文件被重命名,这将无济于事,如果是这样,追踪原始版本会更困难。 This question讨论了如何进入存储库并提取提交:您必须回顾相关提交并进行文件比较以查找要查找的文件。

+0

感谢您的回复。我忘了添加一个问题,即要检查的文件不一定出现在初始提交中。我的错。我编辑了这个问题。 – vatsug

+0

这有点不清楚:如果该文件在初始提交中不存在,那么文件即为存在初始提交和文件存在于最初提交之间的区别, HEAD只是当前HEAD中文件的全部内容?你能否澄清你的意思是“不存在”? –

+0

我的意思是我想得到该特定文件的第一个版本(触及该文件的第一个提交)和HEAD之间的差异。 – vatsug

0

我似乎已经找到了解决办法。我用git log --reverse拿到第一的哈希提交其接触文件,并比较HEAD:基于soundslikeodd的回答

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

我想指出,以前的答案包括这方面的变化。此外,如果该文件被重命名或移动,则只会以新名称进行第一次提交。 –

+0

如何使它处理重命名和清除,然后呢? – vatsug

+0

'删除'在这里没有意义,但我添加了一个链接来处理通过提交回头的复杂问题。 –

-1

。其实不是一个答案。

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

#!/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 

我将此作为答案添加的原因只是它不会很好地格式化为注释。请告诉我,这种答案是不是在这里赞赏。

相关问题