Wie suche ich ein Git-Repository nach einer Commit-Nachricht?


828

Ich habe einen Quellcode in GIT mit der Commit-Nachricht "Build 0051" eingecheckt.

Ich kann diesen Quellcode jedoch nicht mehr finden. Wie extrahiere ich diese Quelle über die Befehlszeile aus dem GIT-Repository?

Aktualisieren

  1. Eingecheckt in den Versionen 0043, 0044, 0045 und 0046 mit SmartGIT.
  2. 0043 ausgecheckt und Versionen bis 0051 in einem anderen Zweig eingecheckt.
  3. 0043 erneut ausgecheckt.
  4. Jetzt ist 0051 verschwunden.

Aktualisieren

Der Quellcode ist definitiv da, jetzt geht es darum, ihn zu überprüfen:

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
Antworten gehören nicht zu Fragen zum Stapelüberlauf. Sie haben lange genug Beiträge geleistet, um dies zu wissen. Wenn Sie eine Antwort auf Ihre eigene Frage geben möchten, können Sie dies gerne tun . Alternativ können Sie die Antwort von Shelhamer bearbeiten, um sie zu verbessern / erweitern.
Cody Gray

1
@Cody Ich verweise gelegentlich auf diesen Beitrag. Sie können Text nicht einfach zufällig löschen, das ist einfach kein Cricket. Wenn Sie es löschen möchten, können Sie es natürlich gerne in Ihre eigene Antwort umwandeln (und Sie erhalten möglicherweise sogar ein paar positive Stimmen dafür - Sie haben lange genug Beiträge geleistet, um zu wissen, wie dies funktioniert).
Contango

Antworten:


1283

So durchsuchen Sie das Festschreibungsprotokoll (über alle Zweige hinweg) nach dem angegebenen Text:

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

Verwenden Sie Folgendes, um den tatsächlichen Inhalt von Commits im Verlauf eines Repos zu durchsuchen:

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

um alle Instanzen des angegebenen Textes, den enthaltenen Dateinamen und das Commit sha1 anzuzeigen.

Als letztes Mittel, falls Ihr Commit baumelt und überhaupt nicht mit der Geschichte verbunden ist, können Sie das Reflog selbst mit der -gFlagge durchsuchen (kurz für --walk-reflogs:

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

BEARBEITEN: Wenn Sie Ihre Geschichte verloren zu haben scheinen, überprüfen Sie das reflogals Ihr Sicherheitsnetz. Suchen Sie in einem der von aufgelisteten Commits nach Build 0051

git reflog

Möglicherweise haben Sie einfach HEADeinen Teil des Verlaufs festgelegt, in dem das Commit "Build 0051" nicht sichtbar ist, oder Sie haben es tatsächlich weggeblasen. Der git-fähige Reflog- Artikel kann hilfreich sein.

So stellen Sie Ihr Commit aus dem Reflog wieder her : Führen Sie eine Git-Prüfung des gefundenen Commits durch (und erstellen Sie optional einen neuen Zweig oder ein neues Tag als Referenz).

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
mit git grep 'Build 0051' $ (git rev-list --all) bekomme ich sh.exe ": / bin / git: Falsche Dateinummer hat sich der Weg dazu vielleicht geändert?
Jens Schauder

7
Git Log -i -grep
jhvaras

@JensSchauder Wenn Sie auf einen Fehler mit git grep 'search' $(git rev-list --all)git rev-list --all | xargs git grep 'search'
stoßen

83

Ich habe dies in meine ~ / .gitconfig eingefügt:

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

Dann kann ich "git find string" eingeben und erhalte eine Liste aller Commits, die diesen String in der Nachricht enthalten. So finden Sie beispielsweise alle Commits, die auf Ticket Nr. 33 verweisen:

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
Schön, aber vielleicht fehlt ein Farbreset? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman

4
Ich ziehe es vor, die vollständige Git-Nachricht auszudrucken (grep kann dort vorkommen, nicht im Titel), also habe ich Folgendes erhalten : find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Beachten Sie die --allund %bZeichen. Danke @AshleyCoolman für den resetTipp.
Arcol

Vielen Dank. Ich fand den Alias ​​sehr nützlich. Ich mochte die Färbung nicht und fand das Online-Format perfekt dafür. Es war auch hilfreich, -i hinzuzufügen, um die Groß- und Kleinschreibung nicht zu berücksichtigen. zBfind = log --oneline --name-status -i --grep
Robbp

39

Obwohl es etwas spät ist, gibt es :/die dedizierte Notation, um ein Commit (oder eine Revision) basierend auf der Commit-Nachricht anzugeben. Stellen Sie der Suchzeichenfolge einfach Folgendes voran :/, z.

git show :/message

Hier <message>kann es sich um ein komplexes Regex-Muster handeln, das aus Leerzeichen besteht. Stellen Sie daher sicher, dass Sie bei Bedarf Anführungszeichen / Escapezeichen angeben, z.

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

Alternativ kann ein Startpunkt angegeben werden, um das nächstgelegene Commit zu finden, das von einem bestimmten Punkt aus erreichbar ist, z.

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

Siehe: Git-Revisionshandbuch .


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


9

Versuche dies!

git log | grep -b3 "Build 0051"

Danke - aber es wird nicht gefunden. Wie suche ich in allen möglichen Filialen?
Contango

6
Sie möchten git grepanstelle von normalem grep verwenden und das --allFlag zum Durchsuchen mehrerer Zweige bereitstellen .
Shelhamer

Hmm - finden die anderen Antworten es auch? Wenn nicht, haben Sie möglicherweise ein größeres Problem. Ich würde es versuchen git log --all --grep='Build 0051'(@ Shelhamers Antwort)
Nic

Ich habe "git log --all" ausprobiert und es werden nur Versionen bis 0046 aufgelistet. Version 0051 befand sich in einem anderen Zweig. Ich rollte zurück zu 0043 und 0051 verschwand.
Contango

3
@Gravitas, versuchen Sie mein Beispiel, das das Reflog verwendet: das mit git log -g. Möglicherweise haben Sie beim Zurücksetzen den Verlauf verloren, können das Reflog jedoch weiterhin überprüfen, wenn kein Müll gesammelt wurde.
Shelhamer

4

Verwenden git log --onelineSie zuerst die SHA des Commits (Nachricht), dann git log --stat 8zad24ddie SHA (das erste Beispiel für Paare, sha char (8zad24d)), um die richtigen Informationen zu finden


1

Diese:

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

oder dieses:

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

Befehle funktionieren am besten für mich.


1

In allen Filialen suchen

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

Sobald Sie wissen, zu welchem ​​Commit Sie gelangen möchten

git checkout <the commit hash>

1

Wenn die Änderung nicht zu alt ist, können Sie Folgendes tun:

git reflog

und dann die Commit-ID auschecken

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.