Ich habe irgendwann in der Vergangenheit eine Datei oder einen Code in einer Datei gelöscht. Kann ich den Inhalt (nicht die Commit-Nachrichten) überprüfen?
Eine sehr schlechte Lösung besteht darin, das Protokoll zu durchsuchen:
git log -p | grep <pattern>
Dies gibt den Commit-Hash jedoch nicht sofort zurück. Ich spielte git grep
vergeblich herum .
git log -S
und Schuld) * [Spaß mit "git log --grep"] [2] (Suche nach Commit-Nachrichten) ) * [Spaß mit "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlAntworten:
Für die Suche nach commit Inhalt (dh tatsächliche Linien der Quelle, im Gegensatz zu Nachrichten zu begehen und dergleichen), was Sie tun müssen:
git rev-list --all | xargs git grep <expression>
funktioniert, wenn der Fehler "Argumentliste zu lang" auftritt.Wenn Sie die Suche auf einen Teilbaum beschränken möchten (z. B. "lib / util"), müssen Sie diesen an den
rev-list
Unterbefehl übergeben undgrep
außerdem:Dies durchsucht Ihren gesamten Commit-Text nach
regexp
.Der Grund für die Übergabe des Pfads in beiden Befehlen liegt darin, dass
rev-list
die Revisionsliste zurückgegeben wird, in der alle Änderungen vorgenommen wurdenlib/util
Sie müssen jedoch auch an übergeben,grep
damit nur gesucht wirdlib/util
.Stellen Sie sich folgendes Szenario vor:
grep
Möglicherweise finden Sie dasselbe<regexp>
in anderen Dateien, die in derselben Revision enthalten sind, die von zurückgegeben wurderev-list
(auch wenn diese Datei in dieser Revision nicht geändert wurde).Hier sind einige andere nützliche Möglichkeiten zum Durchsuchen Ihrer Quelle:
Suchen Sie im Arbeitsbaum nach Text, der dem regulären Ausdruck für reguläre Ausdrücke entspricht:
Durchsuchen Sie den Arbeitsbaum nach Textzeilen, die dem regulären Ausdruck regexp1 oder regexp2 entsprechen:
Durchsuchen Sie den Arbeitsbaum nach Textzeilen, die mit den regulären Ausdrücken regexp1 und regexp2 übereinstimmen, und melden Sie nur Dateipfade:
Durchsuchen Sie den Arbeitsbaum nach Dateien, deren Textzeilen mit dem regulären Ausdruck regexp1 und den Textzeilen mit dem regulären Ausdruck regexp2 übereinstimmen:
Durchsuchen Sie den Arbeitsbaum nach geänderten Textzeilen-Übereinstimmungsmustern:
Durchsuchen Sie alle Revisionen nach Text, der dem regulären Ausdruck regulärer Ausdrücke entspricht:
Durchsuchen Sie alle Revisionen zwischen rev1 und rev2 nach Text, der dem regulären Ausdruck regulärer Ausdrücke entspricht:
quelle
sh.exe": /bin/git: Bad file number
. Die Antwort von VonC funktioniert auch mit msysgit.git gc
oder checken Sie es aus: stackoverflow.com/questions/1507463/…Sie sollten die Option pickaxe (
-S
) von verwendengit log
.So suchen Sie nach
Foo
:Weitere Informationen finden Sie unter Git-Verlauf - Finden Sie verlorene Zeilen nach Schlüsselwörtern .
Wie Jakub Narębski kommentierte:
Dies sucht nach Unterschieden, die eine Instanz von einführen oder entfernen
<string>
. Es bedeutet normalerweise "Revisionen, bei denen Sie mit 'Foo' eine Zeile hinzugefügt oder entfernt haben".Mit dieser
--pickaxe-regex
Option können Sie erweiterten POSIX-Regex verwenden, anstatt nach einer Zeichenfolge zu suchen. Beispiel (vongit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Wie Rob kommentierte, wird bei dieser Suche zwischen Groß- und Kleinschreibung unterschieden. Er eröffnete eine Folgefrage zur Suche ohne Berücksichtigung der Groß- und Kleinschreibung.
quelle
git log
bisschen in deiner Frage hatte mich verwirrt;)-p
Flag, um auch das Diff auszugeben.--branches --all
Optionen benötigen , um nach dem All Repo zu suchen.Am liebsten mache ich das mit
git log
der-G
Option (hinzugefügt in Version 1.7.4).Es gibt einen subtilen Unterschied zwischen der Art
-G
und Weise, wie die-S
Optionen und bestimmen, ob ein Commit übereinstimmt:-S
Option zählt im Wesentlichen, wie oft Ihre Suche in einer Datei vor und nach einem Commit übereinstimmt. Das Commit wird im Protokoll angezeigt, wenn die Vorher- und Nachher-Zählungen unterschiedlich sind. Dies zeigt beispielsweise keine Commits an, bei denen eine Ihrer Suche entsprechende Zeile verschoben wurde.-G
Option wird das Commit im Protokoll angezeigt, wenn Ihre Suche mit einer Zeile übereinstimmt, die hinzugefügt, entfernt oder geändert wurde.Nehmen Sie dieses Commit als Beispiel:
Da die Häufigkeit, mit der "Hallo" in der Datei angezeigt wird, vor und nach diesem Festschreiben gleich ist, stimmt die Verwendung nicht überein
-Shello
. Da jedoch eine Änderung an einer Zeilenübereinstimmung vorgenommen wurdehello
, wird das Festschreiben mit angezeigt-Ghello
.quelle
-p
Option hinzu, für jedes Commit einen Unterschied anzuzeigen. Wenn das Protokoll in meinem Pager geöffnet wird, suche ich nach dem, wonach ich suche. Wenn Ihr Pagerless
und Sie sindgit log -Ghello -p
, können Sie eingeben/hello
, drückenEnter
und verwendenn
undN
die nächsten / vorherigen Vorkommen von "Hallo" suchen.-G
und Regex gefunden: Wenn die Befehlszeile UTF-8 verwendet und die angezeigte Datei eine ISO-Latin-Codierung (8 Bit) verwendet,.*
schlägt dies fehl. Zum Beispiel habe ich eine ÄnderungVierter Entwurf
->Fünfter Entwurf
und während'V.*ter Entwurf'
eine Übereinstimmung erzeugt wird,'F.*ter Entwurf'
nicht.Wenn Sie Codeänderungen durchsuchen möchten (sehen Sie, was mit dem angegebenen Wort im gesamten Verlauf tatsächlich geändert wurde), wählen Sie den
patch
Modus - ich habe eine sehr nützliche Kombination gefunden:quelle
git log
Dies kann eine effektivere Methode sein, um in allen Zweigen nach Text zu suchen, insbesondere wenn viele Übereinstimmungen vorhanden sind und Sie zuerst neuere (relevante) Änderungen sehen möchten.Diese Protokollbefehle listen Commits auf, die die angegebene Suchzeichenfolge / Regex (im Allgemeinen) zuerst hinzufügen oder entfernen. Das
-p
Option bewirkt, dass das relevante Diff dort angezeigt wird, wo das Muster hinzugefügt oder entfernt wurde, sodass Sie es im Kontext sehen können.Nachdem Sie ein relevantes Commit gefunden haben, das den gesuchten Text hinzufügt (z. B. 8beeff00d), suchen Sie die Zweige, die das Commit enthalten:
quelle
'
gruppieren die Anführungszeichen Ihre Suchzeichenfolge nicht als ein einziges Argument. Stattdessen'public
ist das Argument zu-S
, und es behandelt den Rest als separate Argumente. Ich bin nicht sicher, in welcher Umgebung Sie ausgeführt werden, aber dieser Kontext wäre zur Fehlerbehebung erforderlich. Ich würde vorschlagen, bei Bedarf eine separate StackOverflow-Frage zu öffnen, um Ihnen bei der Fehlerbehebung zu helfen, mit dem gesamten Kontext, in dem Ihr git-Befehl an die Shell gesendet wird. Es scheint mir, dass es durch einen anderen Befehl gesendet wird? Kommentare hier sind nicht der richtige Ort, um dies herauszufinden.Ich nahm Jeets Antwort und passte sie an Windows an (dank dieser Antwort ):
Beachten Sie, dass für mich aus irgendeinem Grund das tatsächliche Commit, das diesen regulären Ausdruck gelöscht hat, nicht in der Ausgabe des Befehls angezeigt wurde, sondern ein Commit davor.
quelle
--no-pager
>>results.txt
für diejenigen verwendet wird, die sich nicht mit Windows-PipingSuche in jeder Revision, jeder Datei :
Suchen Sie nur in bestimmten Dateien, z. B. XML-Dateien:
Die Ergebniszeilen sollten folgendermaßen aussehen: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: Text der gefundenen Zeile ...
Sie können dann weitere Informationen wie Autor, Datum und Diff erhalten, indem Sie
git show
:quelle
Der Einfachheit halber würde ich die Verwendung von GUI vorschlagen: gitk - Der Git-Repository-Browser . Es ist ziemlich flexibel
Mit den Aufwärts- / Abwärtspfeilen können Sie durch die Ergebnisse navigieren.
quelle
Für alle anderen, die dies in Sourcetree versuchen , gibt es keinen direkten Befehl in der Benutzeroberfläche (ab Version 1.6.21.0). Sie können jedoch die in der akzeptierten Antwort angegebenen Befehle verwenden, indem Sie Terminal öffnen (Schaltfläche in der Hauptsymbolleiste verfügbar) und darin kopieren / einfügen.
Hinweis: Sourcetree der Suchansicht können teilweise für Sie Textsuche tun. Drücken Sie Ctrl+ 3, um zur Suchansicht zu gelangen (oder klicken Sie unten auf die Registerkarte Suchen). Setzen Sie von ganz rechts den Suchtyp auf Dateiänderungen und geben Sie dann die Zeichenfolge ein, nach der Sie suchen möchten. Diese Methode weist im Vergleich zum obigen Befehl die folgenden Einschränkungen auf:
quelle
Immer wenn ich mich bei Ihnen befinde, benutze ich die folgende Befehlszeile:
Erläuterung:
git log
- Muss ich hier mehr schreiben? Es zeigt die Protokolle in chronologischer Reihenfolge.-S "<words/phrases i am trying to find>"
- Es werden alle Git-Commits angezeigt, bei denen jede Datei (hinzugefügt / geändert / gelöscht) die Wörter / Phrasen enthält, die ich ohne '<>' Symbole zu finden versuche.--all
- Durchsetzen und Durchsuchen aller Filialen.--oneline
- Es komprimiert das Git-Protokoll in einer Zeile.--graph
- Es wird ein Diagramm mit chronologisch geordneten Commits erstellt.quelle
Jeets Antwort funktioniert in PowerShell.
Im Folgenden werden alle Dateien in einem Commit angezeigt, die a enthalten
password
.quelle
Versuchen Sie also, ältere Versionen des Codes zu durchsuchen, um festzustellen, wo zuletzt etwas vorhanden ist?
Wenn ich das tun würde, würde ich wahrscheinlich Git Bisect verwenden . Mit bisect können Sie eine bekannte gute Version, eine bekannte schlechte Version und ein einfaches Skript angeben, das überprüft, ob die Version gut oder schlecht ist (in diesem Fall ein Grep, um festzustellen, ob der gesuchte Code vorhanden ist ). Wenn Sie dies ausführen, wird festgestellt, wann der Code entfernt wurde.
quelle
Szenario: Sie haben Ihren Code mithilfe Ihrer IDE gründlich bereinigt. Problem: Die IDE wurde mehr bereinigt als sie sollte und jetzt wird Ihr Code nicht kompiliert (fehlende Ressourcen usw.)
Lösung:
Es findet die Datei, in der "text_to_find" geändert wurde.
Sie können diese Änderung jetzt rückgängig machen und Ihren Code kompilieren.
quelle
ist eine Optimierung der Lösung von Jeet , sodass die Ergebnisse während der Suche angezeigt werden und nicht nur am Ende (was in einem großen Repository lange dauern kann).
quelle
In meinem Fall musste ich ein kurzes Commit suchen und die aufgelisteten Lösungen funktionierten leider nicht.
Ich habe es geschafft mit (ersetze das REGEX- Token):
quelle