1035

我使用提交消息“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>
4

12 回答 12

1587

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

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

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

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

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

最后,作为最后的手段,以防您的提交悬空并且根本没有连接到历史记录,您可以使用-g标志搜索 reflog 本身(简称--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
于 2011-08-19T17:00:59.257 回答
106

我把这个放在我的~/.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
于 2011-08-19T17:07:07.713 回答
57

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

git show :/keyword(s)

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

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

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

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

请参阅:git 修订手册

于 2017-08-16T02:52:17.127 回答
30
git log --grep="Build 0051"

应该做的伎俩

于 2011-08-19T17:02:24.530 回答
29
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).
于 2011-08-19T17:01:38.267 回答
14

试试这个!

git log | grep -b3 "Build 0051"
于 2011-08-19T17:00:33.937 回答
7

首先列出提交使用

git log --oneline

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

 git log --stat 8zad24d

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

于 2018-06-09T16:55:59.910 回答
3

搜索所有分支

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

一旦您知道要进行哪个提交

git checkout <the commit hash>
于 2020-02-27T13:40:56.660 回答
3

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

git log --fixed-strings --grep "$SEARCH_TERM" 
于 2020-09-18T23:42:50.247 回答
2

这:

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

或这个:

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

命令最适合我。

于 2020-02-10T18:21:18.720 回答
2

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

git reflog

然后签出提交 ID

于 2020-05-07T06:55:02.597 回答
2

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

git log --all --grep="\[C\] Ticket-1001: Fix nasty things"
于 2021-06-01T12:34:41.950 回答