在Git中打印给定提交的提交信息

382

我需要一个管道命令来打印给定提交的提交消息 - 没有更多,没有更少。


7
如果有人想打印单行提交信息但不关心哈希值出现在开头,可以使用以下命令:git show -s --oneline <commit> - waldyrious
我们应该在服务器上的哪个钩子文件中添加打印提交信息的代码行? - user6874415
3
“plumbing”命令是什么意思? - Bryan Ash
2
@BryanAsh https://git-scm.com/book/zh/v2/Git-Internals-Plumbing-and-Porcelain - CervEd
3
@BryanAsh 来自该链接:《Plumbing and Porcelain》本书主要介绍如何使用 Git 的 30 多个子命令,例如 checkout、branch、remote 等等。但是由于 Git 最初是一个版本控制系统的工具包,而不是一个完整的用户友好型 VCS,因此它有许多低级别的子命令,旨在像 UNIX 那样被链接在一起或从脚本中调用。这些命令通常被称为 Git 的“plumbing”命令,而更加用户友好的命令则被称为“porcelain”命令。 - questionto42
8个回答

466

这不是"管道", 但它会完全符合您的要求:

$ git log --format=%B -n 1 <commit>

如果你绝对需要一个 "plumbing" 命令(不确定为什么这是必要的),你可以使用 rev-list

$ git rev-list --format=%B --max-count=1 <commit>

尽管rev-list会在第一行打印提交的SHA和提交信息,但是它仍然可以起到作用。


7
对我来说完美地运作了——但我使用了%s%b而不是%B(在一个Linux机器上)。 - adamk
21
%B 是一个正确的占位符(至少在 Git 1.7.2 版本中是这样,不确定具体添加时间)。 - mipadi
4
%B 在 1.7.1 之后的某个时间添加(可能是在 1.7.1.1 中添加的)。 - mipadi
3
确实是 - Git 1.7.2 显然。非常感谢! - Mark Probst
3
@AndrewSpencer,没有进行大量测试,但是 git log 看起来比较慢。 - CervEd
显示剩余4条评论

197

git showgit log更像是一个管道命令,并且具有相同的格式选项:

git show -s --format=%B SHA1

17
如果你只想要第一行("subject"),请使用 %s 代替 %B - ntc2
25
我愿意接受这个“日志”或“修订列表”的回答,因为它只需要一个提交操作,而不是限制为1个条目的列表。 - Rich
@Rich,你是什么意思? - CervEd
@CervEd:你说得对,这真的很奇怪。我不知道为什么会这样。在我的心理模型中,rev-list应该会更慢,因为它在列表的每个元素上执行与“show”在单个命名提交上执行的相同工作。要么是我误解了什么,要么是rev-list在某种程度上进行了优化,而show没有(但至少对于这种情况可以进行优化)。 - Rich
2
我认为你在做一个假设,因为rev-list有一个max-count选项而show没有,所以rev-list正在遍历整个树或执行某些计算密集型的操作。但是你不能基于公共API对内部工作机制做出这样的假设。git show是一个瓷器命令,我假设它使用了与rev-list完全相同的机制,以及许多其他用户友好的操作,从而使其变慢。瓷器命令不是为了速度而进行优化的。 - CervEd
显示剩余3条评论

24

不是管道问题,但这些是我在.gitconfig中有的:

lsum = log -n 1 --pretty=format:'%s'
lmsg = log -n 1 --pretty=format:'%s%n%n%b'

那是“最后一次摘要”和“最后一条消息”。您可以提交一个提交以获取该提交的摘要或消息。(我正在使用1.7.0.5,因此没有%B。)


你可以将-n参数作为参数传递。因此,不仅返回最后一次提交,而是可以使其返回最近的5次提交。这里需要更改:lsum =“!f(){git log -n $1 --pretty = format:'%s';}; f” lmsg =“!f(){git log -n $1 --pretty = format:'%s%n%n%b';}; f”在这里找到它 https://dev59.com/PWw05IYBdhLWcg3w0VKa您只需运行此git lsum 5 - kuklei

19

使用此方法可以获得指定时间内所有消息的紧凑列表。

git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B > CHANGELOG.TXT

18

我开始使用

git show-branch --no-name <hash>

它似乎比原来更快

git show -s --format=%s <hash>

两者都会得到相同的结果

我实际上编写了一个小工具来查看我所有仓库的状态。您可以在Github上找到它。

图片描述


2
这只显示第一行(%s),而不是整个提交消息(正如提问者所写的那样,“仅此而已”)。如果您有一种使用%B进行show-branch的方法,那将非常有帮助。 - Canonical Chris

11

使用 git-rev-list 打印提交信息

git-rev-list 是一个管道命令,它可以让你打印出一个提交的信息。

这样使用它。

git rev-list --max-count=1 --no-commit-header --format=%B <commit>
  • --max-count=1:我们只关心一个提交
  • --no-commit-header:不显示默认的提交头
  • --format=%B:显示消息(主题%s+%n%n+正文%b
  • <commit>:一个shaHEADbranch-nametag-namebranch1...branch2等。

它比git loggit show快得多。


这种方法对于具有两个父节点的合并提交不起作用:您必须使用 tail +3 - Leponzo
@leponzo,真遗憾。也许最好使用某种sed魔法可靠地摆脱shas。 - CervEd
1
较新版本的git(2.33+)已添加--no-commit-header选项到rev-list中。如果需要使用sed,可以使用sed '/^commit [0-9a-f]\{40\}$/d'(https://dev59.com/floU5IYBdhLWcg3w7qIt#68514358)。 - T.D

3
我用shortlog来实现这个功能:
$ git shortlog master..
Username (3):
      Write something
      Add something
      Bump to 1.3.8 

2
今日免费次数已满, 请开通会员/明日再来

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