Ich möchte in der Lage sein, eine bestimmte Zeichenfolge zu finden, die in einem Commit in einem Zweig eingeführt wurde. Wie kann ich das tun? Ich habe etwas gefunden (das ich für Win32 geändert habe), aber es git whatchanged
scheint nicht in die verschiedenen Zweige zu schauen (ignoriere den py3k-Block, es ist nur ein msys / win-Zeilenvorschub-Fix)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Es spielt keine Rolle, ob Ihre Lösung langsam ist.
Antworten:
Du kannst tun:
So finden Sie alle Commits, die die feste Zeichenfolge hinzugefügt oder entfernt haben
whatever
. Der--all
Parameter bedeutet, von jedem Zweig zu beginnen und--source
zu zeigen, welcher dieser Zweige zum Auffinden dieses Commits geführt hat. Es ist oft nützlich, diese hinzuzufügen-p
, um die Patches anzuzeigen, die bei jedem dieser Commits ebenfalls eingeführt werden.Git-Versionen seit 1.7.4 haben auch eine ähnliche
-G
Option, die einen regulären Ausdruck verwendet . Dies hat tatsächlich eine andere (und offensichtlichere) Semantik, die in diesem Blog-Beitrag von Junio Hamano erklärt wird .Wie Thameera in den Kommentaren hervorhebt , müssen Sie den Suchbegriff in Anführungszeichen setzen, wenn er Leerzeichen oder andere Sonderzeichen enthält, zum Beispiel:
Hier ist ein Beispiel
-G
zum Auffinden von Vorkommen vonfunction foo() {
:quelle
--decorate
nur der Filialname zum Commit an der Spitze jeder Filiale hinzugefügt wird. In der Praxis verwende ich nicht wirklich--source
oder--decorate
, und verwenden Sie stattdessengit branch -a --contains <commit-hash>
zu finden , die Verzweigungen enthalten die commit interessiert mich.git log -S"dude, where's my car?" --source --all
. @ribamar hat das auch in einer Antwort unten geschrieben, aber es könnte leicht neben dieser Top-Antwort übersehen werden.--reverse ist auch hilfreich, da Sie das erste Commit möchten, das die Änderung vorgenommen hat:
Auf diese Weise werden ältere Commits zuerst angezeigt.
quelle
Mark Longairs Antwort ist ausgezeichnet, aber ich habe festgestellt, dass diese einfachere Version für mich funktioniert.
quelle
HEAD
, aber diese spezielle Frage wurde speziell zum Durchsuchen aller Zweige in einem Repository gestellt.Mit den gleichen Antworten herumspielen:
Jetzt können Sie tun
oder
quelle
Achten Sie darauf, keine Leerzeichen zwischen S und "string_to_search" zu verwenden. In einigen Setups (Git 1.7.1) wird folgende Fehlermeldung angezeigt:
quelle
Dies beantwortet Ihre Frage zwar nicht direkt, aber ich denke, es könnte in Zukunft eine gute Lösung für Sie sein. Ich habe einen Teil meines Codes gesehen, der schlecht war. Ich wusste nicht, wer es wann geschrieben hat. Ich konnte alle Änderungen in der Datei sehen, aber es war klar, dass der Code von einer anderen Datei in diese verschoben wurde. Ich wollte herausfinden, wer es überhaupt hinzugefügt hat.
Dazu habe ich Git bisect verwendet , wodurch ich schnell den Sünder finden konnte.
Ich lief
git bisect start
und danngit bisect bad
, weil die ausgecheckte Revision das Problem hatte. Da ich nicht wusste, wann das Problem auftrat, zielte ich auf das erste Commit für das "Gute" abgit bisect good <initial sha>
.Dann suchte ich einfach im Repo nach dem schlechten Code. Als ich es fand, rannte ich
git bisect bad
und als es nicht da war :git bisect good
.In ~ 11 Schritten hatte ich ~ 1000 Commits abgedeckt und das genaue Commit gefunden, bei dem das Problem eingeführt wurde. Ziemlich toll.
quelle
Ich bin mir nicht sicher, warum die akzeptierte Antwort in meiner Umgebung nicht funktioniert. Schließlich führe ich den folgenden Befehl aus, um das zu erhalten, was ich brauche
quelle