Wie kann man herausfinden, in welchem ​​Commit ein bestimmter Code hinzugefügt wurde?

78

Ich möchte herausfinden, in welchem ​​Commit ich den folgenden Code hinzugefügt habe:

if (getListView().getChildCount() == 0)
                getActivity().findViewById(android.R.id.empty).setVisibility(View.VISIBLE);

Wie erreiche ich das?

Harshal Kshatriya
quelle

Antworten:

75

Führen Sie git blamedie Datei aus. Es zeigt Ihnen die Commit-ID, das Datum und die Uhrzeit sowie die Commit-ID für jede Zeile. Kopieren Sie dann einfach die Festschreibungskennung und Sie können sie in git log <commit>oder verwenden git show <commit>.

Zum Beispiel habe ich eine Datei namens test.txt mit Zeilen, die bei verschiedenen Commits hinzugefügt wurden:

$ cat test.txt
First line.
Second line.

Ausführen der git blame:

$ git blame test.txt
^410c3dd (Leigh 2013-11-09 12:00:00 1) First line.
2365eb7d (Leigh 2013-11-09 12:00:10 2) Second line.

Das erste Bit ist die Festschreibungs-ID, dann der Name, dann Datum, Uhrzeit, Zeitzone und schließlich die Zeilennummer und der Zeileninhalt.

Leigh
quelle
21
Das Problem ist, dass dies nur angezeigt wird, wenn diese Dateien zuletzt geändert wurden und nicht, wenn sie hinzugefügt wurden.
Ensonic
@ensonic Diese Antwort kann interessant sein, wenn dies der Fall ist (z. B. die Zeile wurde verschoben oder ein Leerzeichen geändert): stackoverflow.com/a/5816177/812680
mcls
3
Nützliche zusätzliche ist, um die Ergebnisse zu begrüßengit blame test.txt | grep 'First line'
Jonathan Lockley
3
Das beantwortet die Frage des OP nicht. Wir hatten ein Problem, bei dem unser gesamtes Repository eine Änderung zum erneuten Einrücken des Codes durchlief, um die Tabulatoren von 4 auf 2 zu verkleinern. Von diesem Moment an wird jede Git-Schuld immer den Typ offenbaren, der den Code erneut eingerückt hat - nicht den einer, der es vorstellte. Git Log -S macht den Trick.
Motti Shneor
77
git log -S searchTerm

gibt Ihnen die Commits an, in denen der Suchbegriff eingeführt wurde.

Rahil Ahmad
quelle
6
Ich denke, das ist die beste Antwort, da das OP nach Code (nicht Datei) suchen wollte.
dr_
Ich stimme zu - ich hatte ein Problem, bei dem das gesamte Repository eine Sitzung zum erneuten Einrücken von Code durchlief, um Tabulatoren von 4 Leerzeichen auf 2 zu verkleinern - nicht derjenige, der es eingeführt hat. Git Log -S macht den Trick.
Motti Shneor
42

Es gibt etwas Schnelleres, als die vollständige Datei zu beschuldigen. Wenn die Zeile ${lineno}und die Datei ist ${filename}, können Sie:

git blame -L ${lineno},${lineno} ${filename}

Beispiel:

git blame -L 2,2 test.txt
cforbish
quelle
5
Dies beantwortet die Frage nicht wirklich - es sei denn, diese Codezeile wurde nie geändert. Es wird angezeigt, wer der Benutzer ist, der diese Codezeilen zuletzt geändert hat. Nicht derjenige, der sie vorgestellt hat. Git Log-S wird jedoch. Allerdings nützliche Technik ...
Motti Shneor
20
git log -S "mention here line of code" [file-path]    

Zum Beispiel:

git log -S "First line" test.txt         

Die Angabe des Dateinamens mit seinem Pfad ist offensichtlich, da wir meistens wissen möchten, wer ein bestimmtes Codesegment in eine bestimmte Datei eingeführt hat.

anshul
quelle
Entschuldigung, ich kann es nicht verstehen - was sollte in die "hier Codezeile erwähnen" eingefügt werden. die Zeilennummer? den tatsächlichen Zeileninhalt? einen zu suchenden Text? Können Sie bitte klarer sein?
Motti Shneor
1
OK. Ich habe es benutzt und mich über die Ergebnisse gewundert. Dies ist ein Lebensretter. Ja wirklich. In unserem ziemlich ungeschickten und miesen Unternehmens-Repository hat ein Weiser beschlossen, den Tabulatorabstand von 4 auf 2 über 1,2 Millionen Codezeilen zu ändern. Natürlich von diesem Moment an - Schuld ist bedeutungslos -, weil sich jede verdammte Linie durch das gleiche böse Bekenntnis geändert hat, die Quellen neu einzurücken. Also - das gab mir wirklich das Seil, das ich brauchte - um herauszufinden, wer eine Codezeile "erfunden" hat und nicht die letzte Person, die sie geändert hat. VIELEN DANK. Große Hand.
Motti Shneor
Vielen Dank für die Wertschätzung.
Anshul
1
Im Linux-Terminal waren einfache Anführungszeichen für die Codezeile erforderlich:git log -S 'some code' path/to/file.c
Daniel Holmes
Das war ein Lebensretter! Vielen Dank!
Saif Al Falah
0

Wenn Code im GitRepository verwaltet wird und intellijIDE zusammen mit dem Git-Plugin zum Durchsuchen des Codes verwendet wird, habe ich den folgenden Weg sehr intuitiv gefunden:

  1. Öffnen Sie die Datei in intellij
  2. Gehen Sie zum Kontextmenü -> Git -> Kommentieren.
  3. Es wird ein neues Fenster angezeigt, in dem jede Zeile in einem neuen Fenster angibt, wer diese Zeile festgeschrieben hat.

Die folgenden Screenshots dienen als Referenz:

Geben Sie hier die Bildbeschreibung ein

anshul
quelle