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


828

我用提交消息“ Build 0051”将一些源代码检入了GIT。

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

更新资料

  1. 使用SmartGIT签入了版本0043、0044、0045和0046。
  2. 签出0043,并在另一个分支上签入高达0051的版本。
  3. 再次签出0043。
  4. 现在,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>




2
答案不属于堆栈溢出问题。您已经成为贡献者了很长时间,所以您应该知道这一点。如果您想回答自己的问题,当然欢迎您这样做。另外,您可以编辑谢勒哈默的答案来改善/扩展它。
Cody Gray

1
@Cody我偶尔会提到这个帖子。您不能只是随机删除文本,那不是。如果您想删除它,当然欢迎您将其转变为自己的答案(甚至可能会得到一些赞扬-您已经贡献了很长时间来了解它的工作原理)。
Contango

Answers:


1280

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

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

要通过存储库的历史记录搜索提交的实际内容,请使用:

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

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

最后,万一您的提交悬而未决与历史无关,作为万不得已的方法,您可以使用-g标记搜索reflog本身(的缩写--walk-reflogs

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

编辑:如果您似乎已经失去了历史,请检查reflog作为您的安全网。在列出的提交之一中查找版本0051

git reflog

您可能只是将自己设置HEAD为看不到“ Build 0051”提交的历史记录的一部分,或者您实际上已经将其删除了。在git的准备引用日志 文章可能会有所帮助。

要从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

2
与git grep'Build 0051'$(git rev-list --all)我得到sh.exe“:/ bin / git:错误的文件号是否可以更改此方法?
Jens Schauder

7
git log -i -grep
jhvaras

@JensSchauder如果使用遇到错误git grep 'search' $(git rev-list --all),请尝试git rev-list --all | xargs git grep 'search'
afilina

83

我把它放在我的〜/ .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

1
不错,但是也许错过了颜色重置?--pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman

4
我更喜欢打印完整的git消息(grep可能发生在此处,而不是标题中),所以我最终得到了:find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep。注意--all%b字符。谢谢@AshleyCoolman reset
arcol '16

谢谢。我发现别名非常有用。我不喜欢这种颜色,发现单行格式非常适合。另外,添加-i使其不区分大小写也很有帮助。例如find = log --oneline --name-status -i --grep
robbp

39

尽管有些晚,但是有一种:/专用表示法可以根据提交消息指定提交(或修订),只需在搜索字符串前加上:/,例如:

git show :/message

<message>可能是由空格组成的复杂正则表达式模式,因此请确保在必要时引用/转义,例如:

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

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

git show 'HEAD^{/fix nasty bug}'

请参阅:git版本手册


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).


9

尝试这个!

git log | grep -b3 "Build 0051"

谢谢-但找不到。如何搜索所有可能的分支?
Contango 2011年

6
您想使用git grep而不是普通的grep,并提供该--all标志来搜索多个分支。
shelhamer 2011年

嗯-其他答案也找到了吗?如果没有,您可能会遇到更大的问题。我会尝试git log --all --grep='Build 0051'(@shelhamer的回答)
Nic

我尝试了“ git log --all”,它只列出了版本0046。版本0051在另一个分支上。我回滚到0043,而0051消失了。
Contango 2011年

3
@Gravitas,尝试使用reflog的示例:带有的示例git log -g。您可能在重置中丢失了历史记录,但是如果未将垃圾邮件收集起来,您仍然可以检查它。
shelhamer

4

首先用于git log --oneline查找提交的SHA(消息),然后git log --stat 8zad24d与SHA一起使用(第一对夫妇sha char示例(8zad24d))以查找正确的信息


1

这个:

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

或这个:

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

命令最适合我。


1

搜索所有分支

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

一旦您知道要提交的提交

git checkout <the commit hash>

1

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

git reflog

然后签出提交ID

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.