コミットメッセージで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
Stack Overflowの質問には回答は含まれません。あなたはこれを知っておくべき十分長い間貢献者でした。自分の質問に対する回答を提供したい場合は、どうぞ大歓迎です。または、shelhamerの回答を編集して、それを改善/拡張できます。
コーディグレイ

1
@Cody時々この投稿を参照します。テキストをランダムに削除することはできません。それはクリケットではありません。それを削除したい場合は、確かにそれをあなた自身の答えにシフトすることを歓迎します(そして、あなたはそれに対していくつかの賛成投票を得るかもしれません-あなたはこれがどのように機能するかを知るのに十分長い間貢献者でした)。
Contango、

回答:


1284

特定のテキストを(すべてのブランチにわたって)コミットログで検索するには:

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の 記事は助けになることがあります。

reflogからコミットを回復するには:見つけたコミットの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

2
with git grep 'Build 0051' $(git rev-list --all)I get sh.exe ":/ bin / git:Bad file number has a way to do this to this changed多分?
Jens Schauder

7
git log -i -grep
jhvaras 2017

@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\"
アシュリークールマン

4
私は完全なgitメッセージを出力することを好みます(タイトルではなく、grepがそこで発生する可能性があります)find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep--all%b文字に注意してください。チップのThx @AshleyCoolman reset
arcol 2016

ありがとう。エイリアスはとても役に立ちました。私はカラーリングが気に入らず、これにぴったりの1行のフォーマットを見つけました。また、大文字と小文字を区別しないように-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 revisions manual


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

19
git log --grep="Build 0051"

トリックを行う必要があります


1
単一引用符( ')の代わりに二重引用符( ")を使用する必要があります
Frage

9

これを試して!

git log | grep -b3 "Build 0051"

ありがとう-しかし、それを見つけることができませんでした。可能なすべてのブランチを検索するにはどうすればよいですか?
Contango、2011

6
git grep通常のgrepの代わりに使用し、--all複数のブランチを検索するためのフラグを提供します。
シェルハマー2011

うーん-他の答えもそれを見つけていますか?そうでない場合は、より大きな問題がある可能性があります。試してみるgit log --all --grep='Build 0051'(@shelhamerの回答)
Nic

「git log --all」を試してみたところ、0046までのバージョンしかリストされていません。バージョン0051は別のブランチにありました。私は0043にロールバックし、0051は消えました。
Contango、2011

3
@ Gravitas、reflogを使用する私の例を試してくださいgit log -g。リセットで履歴が失われた可能性がありますが、ガベージコレクションが行われていない場合でも、reflogを確認できます。
シェルハマー2011

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をチェックアウトします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.