当做git tag
时,我并不总是很记得HEAD~6(例如)是包容性的还是排他性的。
鉴于我的大多数提交都以问题编号为前缀,我想知道是否有一些魔术命令用于从其部分消息中搜索提交SHA。
我知道很容易做git log
并从那里开始工作,但我想要更轻松:)
编辑:有人也提出了相反的问题:In Git, is there a way to get the “friendly” name for an arbitrary commit?
答案 0 :(得分:18)
您可以使用:/blah
语法指定提交消息以给定文本开头的提交。
E.g。
git show ":/Issue #299"
这在任何可以使用提交的地方都有效。 E.g。
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访问的最年轻的匹配提交 如果提交消息以!
开头,则必须重复该操作;目前仅保留特殊序列:/!
,后跟除!
以外的其他内容。
答案 1 :(得分:8)
git log --grep=word
应该有助于找到相关的提交
(而不是搜索commit contents,其中git log -S
(pickaxe选项)或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机制的方式恰恰就是“整个事情是否匹配?”方面,而不是“向我显示符合这些标准的行”方面。它允许您像这样使用这种机制:
git log --all-match --grep=frotz --author=Linus
这将显示提及frotz并由Linus撰写的提交。
答案 2 :(得分:1)
尝试
git rev-list --grep='message excerpt' HEAD
这将仅列出HEAD
的祖先提交。如果你想搜索存储库中的所有提交(包括那些不是HEAD
祖先的提交),除了通过手动遍历所有分支头并运行此命令之外,我不知道如何做到这一点。 (可能有一种方法,我只是不知道它可能是什么)