如何通过提交消息搜索 Git 存储库?

Posted

技术标签:

【中文标题】如何通过提交消息搜索 Git 存储库?【英文标题】:How to search a Git repository by commit message? 【发布时间】:2011-10-30 19:04:29 【问题描述】:

我使用提交消息“Build 0051”检查了一些源代码到 GIT。

但是,我似乎无法再找到该源代码 - 如何使用命令行从 GIT 存储库中提取该源代码?

更新

    已使用 SmartGIT 签入版本 0043、0044、0045 和 0046。 签出 0043,并在不同的分支上签入最高 0051 的版本。 再次签出 0043。 现在,0051 消失了。

更新

源代码肯定有,现在就去看看吧:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@10 (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>

【问题讨论】:

另见:How to search through all commits in the repository? 另见***.com/questions/18122628/… How to grep git commits for a certain word的可能重复 答案不属于 Stack Overflow 上的问题。您作为贡献者的时间已经够长了,您应该知道这一点。如果您想为自己的问题提供答案,您是certainly welcome to do。或者,您可以编辑 Shelhamer 的答案以改进/扩展它。 @Cody 我偶尔会参考这篇文章。你不能随便删除文本,那不是板球。如果您想删除它,当然欢迎您将其转换为您自己的答案(您甚至可能会为此获得一些支持 - 您作为贡献者的时间已经足够长,知道它是如何工作的)。 【参考方案1】:

试试这个!

git log | grep -b3 "Build 0051"

【讨论】:

谢谢 - 但它没有找到它。如何搜索所有可能的分支? 你想使用git grep而不是普通的grep,并提供--all标志来搜索多个分支。 嗯 - 其他答案也找到了吗?如果没有,您可能会遇到更大的问题。我会尝试git log --all --grep='Build 0051'(@shelhamer 的回答) 我试过“git log --all”,它只列出了0046的版本。0051版本在不同的分支上。我回滚到0043,0051消失了。 @Gravitas,试试我使用 reflog 的例子:git log -g 的例子。您可能在重置时丢失了历史记录,但如果没有被垃圾回收,您仍然可以检查 reflog。【参考方案2】:

在提交日志中搜索给定文本(跨所有分支):

git log --all --grep='Build 0051'

要通过 repo 的历史搜索提交的实际内容,请使用:

git grep 'Build 0051' $(git rev-list --all)

显示给定文本的所有实例、包含的文件名和提交 sha1。

最后,万一你的提交是悬空的并且根本没有连接到历史,作为最后的手段,你可以使用-g标志(--walk-reflogs的缩写:

git log -g --grep='Build 0051'

编辑:如果您似乎丢失了历史记录,请检查 reflog 作为您的安全网。在

列出的提交之一中查找 Build 0051
git reflog

您可能只是将您的 HEAD 设置为历史的一部分,其中“构建 0051”提交是不可见的,或者您实际上可能已经把它吹走了。 git-ready reflog 文章可能会有所帮助。

要从 reflog 中恢复您的提交:对您找到的提交执行 git checkout(并可选择创建一个新的分支或标记以供参考)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@10
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

【讨论】:

with git grep 'Build 0051' $(git rev-list --all) I get sh.exe": /bin/git: Bad file number has the way to do this? git log -i -grep @JensSchauder 如果您在使用git grep 'search' $(git rev-list --all) 时遇到错误,请尝试git rev-list --all | xargs git grep 'search' 在 Windows 上,我必须使用双引号而不是单引号才能使其正常工作。【参考方案3】:
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

【讨论】:

【参考方案4】:
git log --grep="Build 0051"

应该做的伎俩

【讨论】:

必须使用双引号 (") 而不是单引号 (')。【参考方案5】:

我把这个放在我的~/.gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

然后我可以输入“git find string”,然后我会得到消息中包含该字符串的所有提交的列表。例如,要查找引用票证 #33 的所有提交:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

【讨论】:

不错,但可能缺少颜色重置? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\" 我更喜欢打印完整的 git 消息(grep 可能在那里发生,而不是在标题中),所以我最终得到:find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep。注意 --all%b 字符。感谢@AshleyCoolman 提供reset 提示。 谢谢。我发现别名非常有用。我不喜欢这种着色,发现单行格式非常适合。添加 -i 使其不区分大小写也很有帮助。例如find = log --oneline --name-status -i --grep【参考方案6】:

虽然有点晚了,但 :/ 是根据提交消息指定提交(或修订)的专用符号,只需在搜索字符串前加上 :/,例如:

git show :/keyword(s)

这里&lt;keywords&gt;可以是单个单词,也可以是由空格组成的复杂正则表达式模式,因此请务必在必要时引用/转义,例如:

git log -1 -p ":/a few words"

或者,可以指定一个起点,以找到从特定点可到达的最近提交,例如:

git show 'HEAD^/fix nasty bug'

请参阅:git revisions manual。

【讨论】:

【参考方案7】:

首先列出提交使用

git log --oneline

然后找到提交(Message)的SHA,然后我用

 git log --stat 8zad24d

(8zad24d) 是与您感兴趣的提交相关的 SHA(第一对 sha 示例 (8zad24d),您可以选择 4 char 或 6 或 8 或整个 sha)以找到正确的信息

【讨论】:

【参考方案8】:

这个:

git log --oneline --grep='Searched phrase'

或者这个:

git log --oneline --name-status --grep='Searched phrase'

命令最适合我。

【讨论】:

【参考方案9】:

搜索所有分支

git log --all --grep='Build 0051'

一旦你知道你想去哪个提交

git checkout <the commit hash>

【讨论】:

【参考方案10】:

如果更改不是太旧,你可以这样做,

git reflog

然后检查提交 id

【讨论】:

【参考方案11】:

对于任何想要传递完全匹配的任意字符串(并且不用担心转义正则表达式特殊字符)的人,git log takes a --fixed-strings option

git log --fixed-strings --grep "$SEARCH_TERM" 

【讨论】:

【参考方案12】:

只是对git log -all --grep 命令的一个小补充: 就我而言,我不得不转义消息中的括号:

git log --all --grep="\[C\] Ticket-1001: Fix nasty things"

【讨论】:

以上是关于如何通过提交消息搜索 Git 存储库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式搜索 Git 提交消息并将这些消息及其行号输出到文本文件

GIT-搜索存储库中的所有提交

如何通过非交互方式压缩除最近提交之外的所有提交来减少臃肿的 Git 存储库的大小?

git远程存储库包含未合并到本地分支的提交

python commit-msg hook检查git存储库中是否已经存在传入提交消息的提交

什么是 GitHub 存储库中的“通过上传添加文件”提交消息?