协慌网

登录 贡献 社区

如何通过提交消息搜索 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 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>

答案

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

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

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

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

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

最后,万一您的提交悬而未决,完全不与历史联系,您可以使用-g标志( --walk-reflogs

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

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

git reflog

您可能只是将HEAD设置为历史记录的一部分,其中 “Build 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

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

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

git show :/message

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

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

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

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

请参阅: git 版本手册