如何仅输出git日志的第一行?

513

我正在尝试自定义git log的格式。我想要所有的提交记录都显示在一行上,每行只显示提交信息的第一行。
发现使用git log --pretty=short可以解决这个问题,但在我的计算机上它显示的是完整的日志(除了时间戳)。

此外,我尝试使用man页中定义的占位符。然而,我找不到缩短日志消息的命令。我尝试了这一行:git log --pretty=format:'%h : %s',它将短哈希%h和完整消息%s显示在同一行上。

我正在Vista上使用git version 1.7.3.1.msysgit.0


也许这与我编写提交消息的方式有关。以下是一个示例:

Added some functionality.
+ Added print function in Foo class.
+ Added conversion from foo to baz.

所以,根据给出的例子,我只想输出简短哈希值前缀下 添加了一些功能。


1
%s 是主题,而不是完整的消息。 - Josh Lee
很难确定你到底想要什么。虽然short格式不是单行的(惊喜!),但oneline是单行的。如果oneline%h : %s不符合你的要求,那有什么问题吗?特别地,%s是主题,也就是提交信息的第一行。它确实应该是一个缩短版。你是否可能在提交消息时使用了单行长文本,并以某种方式查看它们并进行自动换行呢? - Cascabel
你完全理解。问题是oneline%s在我的计算机上输出的不是我们期望的结果。我更新了我的文章,并提供了我的提交信息的示例,或许会有所帮助。 - JJD
10个回答

803

你尝试过这个吗?

git log --oneline 

这是一个别名,等同于git log --pretty=oneline --abbrev-commit命令,会显示“短SHA”和“短描述”,例如:

9bee8857 Write more code
831fdd6e Write some code Second line of message
问题是您在提交信息的第一行后缺少空行。上面的命令通常对我有效,但我刚刚测试了一个没有空白第二行的提交。我得到与您相同的结果:整个消息在一行上。
在git提交消息中,空的第二行是标准。您看到的行为可能是有意实现的。
提交消息的第一行应该是一个简短的描述。如果您不能用单行完成它,可以使用多行,但是Git认为第一个空行之前的所有内容都是“简短描述”。oneline打印整个简短描述,因此打印了您的3行内容。

1
谢谢!你解决了这个谜团:我的提交信息第一行后面没有空行来分隔主题和其余部分。尽管如此,如果我可以自由选择加入或者不加入空行会更好。 - JJD
1
没问题。实际上,你可以选择加入空行或不加入空行。只要你把整个信息写在一行内,就成为了短描述。我喜欢这种简洁/详细的描述方式,而限制短描述只能用一行文字可能会有点困难,因此需要加入空行。当然,你也可以把 git log 的输出通过一个筛选脚本来处理,但我还是建议写一个带有空行的短描述。 - Gauthier
120
还有一个 git log --oneline 命令,其中的 --oneline 是一个内置的简写形式,相当于同时使用 "--pretty=oneline --abbrev-commit" 选项。 - Jeremy Logan
你如何摆脱前缀缩短的哈希标签?虽然它看起来很紧凑漂亮,但没有“cut”命令会有些棘手。顺便说一下数学问题:在正确编码的哈夫曼序列中,存储级别的下一个位是开还是关的概率是多少?提示:这是50%。 - Phlip
7
那就是它了,谢谢。哦,还有,我得到了一个满页的s,所以我自然地添加了一个'%s'的百分号。C-; - Phlip

219

git log --oneline是您想要的吗?


1
我不想将整个提交消息合并到一行。我只想看到每个提交消息的第一行。 - JJD
1
@JJD 请查看我的回答 - technophyle

135
如果您需要打印主题行而不包括提交哈希值
git log --pretty=format:%s

这将产生类似于这样的东西:
Upgrade framework to v2
Add a new module
Hotfix for the production crash

正如Mathieu所提到的,你可以使用%b来表示仅仅是正文,而%B则表示正文和标题都包括在内。

19
好的,请发给我需要翻译的内容。 - Mathieu CAROFF

75

通过创建一个别名,可以更好、更容易地使用 git log。只需将下面的代码粘贴到终端中一次就可以了。将代码粘贴到 zshrc 或 bash 配置文件中,以使其持久化。

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

输出

git lg

输出 修改的行

git lg -p

推荐的另一种方法:
将此代码粘贴到全局.gitconfig文件中

[alias]
  lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

更多阅读材料。
https://coderwall.com/p/euwpig/a-better-git-log
高级阅读材料。
http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/


这个例子是pretty-format的一个不错的演示,但是“只需将下面的代码粘贴到终端一次”似乎是错误的,因为它没有为“git lg”创建别名。 - Drone2537
1
注意:如果您将此命令放入批处理中,请用%%替换%,用""替换'。结果=git log --color --graph --pretty=format:"%%Cred%%h%%Creset -%%C(yellow)%%d%%Creset %%s %%Cgreen(%%cr) %%C(bold blue)<%%an>%%Creset" --abbrev-commit %1。您可以传递-p到此bat文件以获取更改的行。 - Dheeraj Bhaskar

29

您可以定义一个全局别名,以便更轻松地调用短日志:

git config --global alias.slog "log --pretty=oneline --abbrev-commit"

然后,您可以使用git slog调用它(如果启用了自动完成,它甚至可以正常工作)。


12

没有提交信息,只有哈希值:

git log --pretty=oneline | awk '{print $1}'

9
如果你只想要哈希值,请使用以下命令:git log --pretty=format:"%H" - michael_j_ward
如果你只想要哈希值,你也可以使用 git rev-list HEAD - Fabio says Reinstate Monica

12
如果你只想打印出 commit-idcommit message,可以使用以下命令:

git log --pretty=format:"%h %s"

%h 是缩写形式的 hash_id%s 是缩写形式的 subjectName[message_name]

使用以下命令可以在 commit-idmessage 后面显示日期:

git log --pretty=format:"%h %s %C(yellow)(%cr)"

%C 是颜色的缩写,我希望能够用不同的颜色来显示日期,例如 (red,green,blue, yellow,...etc)%cr 是缩写形式的 committer date, relative
或者你可以使用以下命令打印出 hash_id 和提交信息中的第一个单词:

git log --oneline | awk '{print $1 " " $2}'

或者

git log --oneline


7

如果您只想获取邮件的第一行(主题):

git log --pretty=format:"%s"

如果要获取该分支自始至今的所有消息,包括主分支上的消息:

git log --pretty=format:"%s" master..HEAD

最后但并非最不重要的,如果您想为快速发布markdown笔记添加一些小圆点:
git log --pretty=format:"- %s" master..HEAD

1
在每行前添加项目符号的做法很不错! - LunaCodeGirl

5
git log --format="%H" -n 1 

使用上述命令获取提交ID,希望这能帮到你。


1
我使用了 git log --format="%h %B" -1 命令,然后在 JavaScript 中,我按照 \n 进行分割并取出第一行(即使没有换行符也可以正常工作)。 - Devin Rhode

-10

如果你想一直以这种方式使用 git log,你可以通过添加 git 别名来实现:

git config --global alias.log log --oneline

之后,git log 将打印通常由 git log --oneline 打印的内容。


15
由于(A. git 别名无法覆盖内置命令名称)和(B. “log --oneline”周围需要加引号),因此这实际上不起作用。 - Max Nanasy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接