如何通过'git log'显示第一次提交?

Nya*_*baa 263 git

我有一个历史悠久的项目.我想在git上显示第一个提交.

我该怎么做呢?

Nya*_*baa 390

我找到:

git log --reverse
Run Code Online (Sandbox Code Playgroud)

从头开始显示提交.

  • 看起来它首先将结果限制为5个条目,然后反转 (23认同)
  • 有趣的是,`git log --reverse -5`使得它出于某种原因忽略了`--reverse` (19认同)
  • @ Dan2552看起来像个bug,应该报道? (6认同)
  • @太极者无极而生是对的,即已记录的行为。 (2认同)
  • git log --reverse | git log --reverse | git log --reverse | git log --reverse | 头-6 (2认同)

Chr*_*sen 263

简短的回答

git rev-list --max-parents=0 HEAD
Run Code Online (Sandbox Code Playgroud)

(来自tiho的评论.正如克里斯·约翰森的注意事项,--max-parents是在这个答案发布后推出的.)

说明

从技术上讲,可能有多个root提交.当多个先前独立的历史被合并在一起时,会发生这种情况.通过子树合并集成项目时很常见.

git.git库有六个根在其历史图表提交(每一个Linus的初步承诺,gitk,最初一些独立的工具,混帐桂,GitWeb里,和混帐-P4).在这种情况下,我们知道这e83c516是我们可能感兴趣的那个.它既是最早的提交,也是根提交.

在一般情况下并非如此简单.

想象一下,libfoo已经开发了一段时间,并将其历史记录保存在Git存储库(libfoo.git)中.独立地,"bar"项目也在开发中(in bar.git),但不是长期的libfoo(具有最早日期libfoo.git的提交具有在提交之前具有最早日期的日期bar.git).在某些时候,"bar"的开发人员决定通过使用子树合并将libfoo合并到他们的项目中.在此合并之前,确定"第一个"提交可能是微不足道的bar.git(可能只有一个根提交).但是,在合并之后,有多个root提交,最早的root提交实际上来自libfoo的历史,而不是"bar".

你可以找到历史DAG的所有root提交,如下所示:

git rev-list --max-parents=0 HEAD
Run Code Online (Sandbox Code Playgroud)

对于记录,如果--max-parents没有,这也有效:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Run Code Online (Sandbox Code Playgroud)

如果您有适当的标签,那么git name-rev可能会让您快速了解历史记录:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
Run Code Online (Sandbox Code Playgroud)

奖金

经常使用这个吗?难以记住?添加git别名以便快速访问

git config --global alias.first "rev-list --max-parents=0 HEAD"
Run Code Online (Sandbox Code Playgroud)

现在你可以做到

git first
Run Code Online (Sandbox Code Playgroud)

  • 我相信``git rev-list --max-parents = 0 HEAD``会做同样的事情,而且有点简单. (49认同)
  • @tiho:是的,它做的也一样,而且更简单; 虽然在提出此问题/答案时,该选项并未完全["发明"](http://git.kernel.org/?p=git​​/git.git;a=commit;h=ad5aeeded3295589b2573b143f754762a56f8f82). (3认同)

Moh*_*our 37

你可以反转你的日志,然后把它作为第一个结果.

git log --pretty=oneline --reverse | head -1
Run Code Online (Sandbox Code Playgroud)

  • `git log --reverse`会反转历史记录,所以你必须使用`head -1`而不是`tail -1`来获得第一次提交. (7认同)
  • 如果给出`--reverse`,git不会忽略`-n`标志是最好的. (4认同)

Gab*_*les 29

要仅查看第一次提交的提交哈希:

git rev-list --max-parents=0 HEAD 
Run Code Online (Sandbox Code Playgroud)

要查看第一次提交的完整内容以及提交消息:git log

git rev-list --max-parents=0 HEAD 
Run Code Online (Sandbox Code Playgroud)

要以相反的顺序查看所有git log消息,从顶部(而不是底部)的第一个提交到底部(而不是顶部)的最后一个(最近的)提交:

git log $(git rev-list --max-parents=0 HEAD)
Run Code Online (Sandbox Code Playgroud)

参考:

  1. 我如何学习上面的第一个命令:[接受的答案]如何通过“git log”显示第一次提交?(上面的第二个命令是我自己的贡献)
  2. 我从@Nyambaa 得到最多支持的答案中了解到git log --reverse


Mat*_*hen 12

git log $(git log --pretty=format:%H|tail -1)
Run Code Online (Sandbox Code Playgroud)

  • 或`git log $(git log --reverse --pretty=format:%H|head -1)` (2认同)

MHC*_*MHC 6

我猜这不是最美丽的方式:

git log --pretty=oneline | wc -l
Run Code Online (Sandbox Code Playgroud)

这给你一个数字

git log HEAD~<The number minus one>
Run Code Online (Sandbox Code Playgroud)

  • 当存在合并提交时失败(由于分支): `% git log HEAD~63 fatal: 不明确的参数 'HEAD~63': 未知修订版或路径不在工作树中。` (2认同)