我有一个Git项目,它有很长的历史。我想要显示第一个提交。
我怎么做呢?
我想这不是最漂亮的方式:
git log --pretty=oneline | wc -l
这就给出了一个数字
git log HEAD~<The number minus one>
我发现:
git log --reverse
从开始显示提交。
git log $(git log --pretty=format:%H|tail -1)
你可以把你的log颠倒过来,直接指向第一个结果。
git log --pretty=oneline --reverse | head -1
git rev-list --max-parents=0 HEAD
(from tiho's comment.;As Chris Johnsen notice , --max-parents是在这个答案发布后引入的。)
--max-parents
从技术上讲,可能有多个根提交。当多个先前独立的历史合并在一起时,就会发生这种情况。当一个项目通过子树合并集成时,这是很常见的。
git.git存储库的历史图中有六个根提交(Linus的初始提交,gitk,一些最初单独的工具,git-gui, gitweb和git-p4)。在这种情况下,我们知道e83c516可能是我们感兴趣的。它既是最早的提交,也是根提交。
git.git
e83c516
在一般情况下,事情就不那么简单了。
假设libfoo已经开发了一段时间,并将其历史保存在Git存储库(libfoo.git)中。独立地,“bar”项目也在开发中(在bar.git中),但不像libfoo那样长(在libfoo.git中具有最早日期的提交有一个日期在bar.git中具有最早日期的提交之前)。在某些时候,bar的开发人员决定通过使用子树合并将libfoo合并到他们的项目中。在此合并之前,确定bar.git中的“第一次”提交可能很简单(可能只有一个根提交)。然而,在合并之后,会有多个根提交,最早的根提交实际上来自libfoo的历史,而不是“bar”。
libfoo.git
bar.git
你可以像这样找到历史DAG的所有根提交:
为了记录,如果--max-parents不可用,这也是有效的:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
如果你在适当的地方有有用的标签,那么git name-rev可能会给你一个历史的快速概述:
git name-rev
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
经常使用这个吗?很难记住?为快速访问添加一个git别名
git config --global alias.first "rev-list --max-parents=0 HEAD"
现在你可以简单地做
git first
git log --format="%h" | tail -1给你提交哈希值(即0dd89fb),你可以将其输入到其他命令中,方法如下
git log --format="%h" | tail -1
0dd89fb
git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD来查看最后一天的所有提交。
git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
查看只有第一次提交的提交哈希值:
要查看完整的git log,带有commit消息,仅用于第一次提交:
git log
git log $(git rev-list --max-parents=0 HEAD)
要查看所有git log消息按倒序排列,从顶部的第一次提交(而不是底部)到底部的最后一次(最近)提交(而不是顶部):
git log --max-parents=0
和公认的答案一样,但格式更好。