2010-06-09 36 views
11

当做一个git tag,我并不总是很好记住HEAD〜6(例如)是包容性的还是排他性的。有什么办法从它的消息中获取提交的SHA?

鉴于我的大部分提交都带有问题编号的前缀,我想知道是否有一些神奇的命令从其消息的一部分搜索提交SHA。

我知道这很容易做到从那里git log和工作,但我想更简单的:)

编辑:也有人提出相反的问题:In Git, is there a way to get the “friendly” name for an arbitrary commit?

回答

17

您可以使用:/blah语法指定提交消息以给定文本开头的提交。

E.g.

git show ":/Issue #299" 

这在任何可以使用提交的地方都是有效的。例如。

git cherry-pick ":/Issue #299" 

如果你实际上需要提交的SHA-1,你可以使用rev-parse。

git rev-parse ":/Issue #299" 

"SPECIFYING REVISIONS" section of the git rev-parse man page

冒号,然后是斜线,跟文本
这名提交,其提交信息与指定的文本开始。
该名称返回可从任何ref访问的最年轻匹配提交。
如果提交消息以!开头,则必须重复该操作;特殊序列:/!,其次是除!以外的其他内容现在保留。

+0

)如果文本不是唯一的,会发生什么? – Benjol 2010-06-09 07:02:00

+0

@ Benjol:IIRC,它发现最年轻的可及提交;您必须检查文档 – 2010-06-09 07:13:06

+0

谢谢,任何想法的关键字看起来':/'不太好... – Benjol 2010-06-09 07:51:12

1

尝试

git rev-list --grep='message excerpt' HEAD 

这将只列出作为HEAD的祖先的提交。如果您想搜索存储库中的所有提交(包括那些不是祖先HEAD的提交),我不知道如何执行该操作,而不是通过手动手动运行所有分支头并运行此命令。 (有可能是一个办法,我只是不知道它可能是什么)

8
git log --grep=word 

应有助于找到相关的承诺。
(而不是寻找commit contents,在那里的git log -S(鹤嘴锄选项)或git grep更合适)

添加各种格式选项,如

git log --grep=word --pretty=oneline 
git log --grep=word --pretty=format:"%h" 

(最后一个只显示SHA1),和你已准备好出发。


参见“Fun with git log --grep

git log --grep=frotz --grep=nitfol --since=1.month 

这个发现在过去一个月内发生的事情,并在其提交日志信息提及的任何或了frotz nitfol的提交。
与通常的“git grep”一样,给出多个模式意味着“这个或那个”。

的文章指出,git grep是面向行的,并使用此命令git log --grep的--all-match选项。

git log”家庭使用grep机制的方式正是为了这个“整个事情是否有匹配?”方面,而不是“向我展示符合这些标准的方面”方面。它可以让你使用这个机制就像这样:

这将显示提及了frotz和由Linus书面提交。

+0

我正在寻找一些我可以在另一个命令中直接使用/使用的东西,所以如果你添加'--pretty = format:“%h”',那么我会将你标记为答案;) – Benjol 2010-06-09 06:44:52

+0

将--pretty = online添加到命令应该会提高可读性。 – Unknown 2010-06-09 06:45:23

+0

@Benjol:添加了格式选项。 – VonC 2010-06-09 06:49:35

相关问题