it-swarm.com.de

Wie finde ich das Git-Commit, das eine Zeichenfolge in einem Zweig eingeführt hat?

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 git whatchanged scheint nicht in die verschiedenen Zweige zu schauen (ignoriere den py3k Chunk, es ist nur ein msys/win Line Feed 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.

358
Jonas Byström

Du kannst tun:

git log -S <whatever> --source --all

Um alle Commits zu finden, die die feste Zeichenfolge whatever hinzugefügt oder entfernt haben. Der Parameter --all Bedeutet, von jedem Zweig aus zu beginnen, und --source Bedeutet, anzuzeigen, welcher dieser Zweige zum Auffinden dieses Commits geführt hat. Es ist oft nützlich, -p Hinzuzufügen, um die Patches anzuzeigen, die jedes dieser Commits auch einführen würde.

Git-Versionen seit 1.7.4 haben auch eine ähnliche Option -G, Die einen regulären Ausdruck verwendet. Dies hat tatsächlich eine andere (und offensichtlichere) Semantik, die in dieser Blog-Beitrag von Junio ​​Hamano erklärt wird.

Wie thameera in den Kommentaren betont, müssen Sie den Suchbegriff in Anführungszeichen setzen, wenn er Leerzeichen oder andere Sonderzeichen enthält, zum Beispiel:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all

Hier ist ein Beispiel mit -G, Um Vorkommen von function foo() { zu finden:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all
610
Mark Longair

- reverse ist auch hilfreich, da Sie das erste Commit wünschen, das die Änderung vorgenommen hat:

git log --all -p --reverse --source -S 'needle'

Auf diese Weise werden ältere Commits zuerst angezeigt.

Mark Longairs Antwort ist ausgezeichnet, aber ich habe festgestellt, dass diese einfachere Version für mich funktioniert.

git log -S whatever
17
Steven Penny

Herumspielen mit den gleichen Antworten:

$ git config --global alias.find '!git log --color -p -S '
  • ! wird benötigt, weil git das Argument nicht korrekt an -S übergibt. Siehe diese Antwort
  • - Farbe und - p helfen, genau "whatchanged" zu zeigen

Jetzt kannst du tun

$ git find <whatever>

oder

$ git find <whatever> --all
$ git find <whatever> master develop
16
albfan
git log -S"string_to_search" # options like --source --reverse --all etc

Achten Sie darauf, keine Leerzeichen zwischen S und "string_to_search" zu verwenden. In einigen Setups (git 1.7.1) erhalten Sie eine Fehlermeldung wie:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
6
ribamar

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. 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 den Sünder schnell finden konnte.

Ich rannte git bisect start und dann git bisect bad, da die ausgecheckte Revision das Problem hatte. Da ich nicht wusste, wann das Problem auftrat, zielte ich auf das erste Commit für das "Gute", git bisect good <initial sha>.

Dann habe ich einfach weiter im Repo nach dem schlechten Code gesucht. Als ich es fand, lief ich git bisect bad, und wenn es nicht da war: git bisect good.

In ~ 11 Schritten hatte ich ~ 1000 Commits behandelt und das genaue Commit gefunden, in dem das Problem eingeführt wurde. Ziemlich gut.

2
Eldamir

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

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"
1
BMW