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

我用提交消息“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 77b1f718d19e5cf46e2fab8405a9a0859c9c2889Reflog: 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>
547178 次浏览

试试这个!

git log | grep -b3 "Build 0051"

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

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设置为“Build 0051”提交不可见的历史部分,或者您可能实际上已经将其吹走了。准备就绪的重排文章可能会有所帮助。

从重试中恢复你的提交:对您找到的提交进行git签出(并可选择制作一个新的分支或标记以供参考)

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
git log --grep=<pattern>Limit the commits output to ones with log message that matches thespecified pattern (regular expression).
git log --grep="Build 0051"

应该就行了

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

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

然后我可以键入“git查找字符串”,并获得消息中包含该字符串的所有提交的列表。例如,要查找引用票证#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

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

git show :/keyword(s)

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

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

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

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

见:git修订手册

首先列出提交使用

git log --oneline

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

 git log --stat 8zad24d

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

这个:

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

或者这个:

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

命令最适合我。

搜索所有的分支

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

一旦你知道你想做什么

git checkout <the commit hash>

如果变化不是太老,你可以这样做,

git reflog

然后校验提交id

对于任何想要传入完全匹配的任意字符串的人(并且不用担心转义正则表达式特殊字符),git log需要一个--固定字符串选项

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

只是git log --all --grep命令的一个小补充:在我的情况下,我不得不转义消息中的括号:

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