2013-07-22 5 views
21

Ist es in Git möglich, alle früheren Versionen einer bestimmten Zeile in einer Datei mit der Zeilennummer aufzulisten?Listet alle Versionen einer bestimmten Zeilennummer in der GIT-Historie auf.

Der Grund, warum ich es nützlich finden würde, ist in der Lage, ein Problem basierend auf protokollierten Stack Trace-Bericht einfacher zu beheben.

d. H. Ich habe eine undefined method exception bei einer Zeile 100 einer bestimmten Datei protokolliert. Die Datei ist in vielen Commits enthalten, die dazu geführt haben, dass die angegebene Zeile die Datei auch ohne Änderungen an der Datei "gereist" hat.

Wie würde ich den Inhalt von Zeile 100 einer bestimmten Datei über die letzten x-Commits ausdrucken?

+0

Siehe auch [git Geschichte einer Quellenleitung] (http://stackoverflow.com/q/10854370) – CharlesB

+0

@MRT: In meiner Antwort habe ich beschrieben, wie über die aussehen letzte Änderung einer Zeile. –

+1

Ich habe eine neue Antwort (http://stackoverflow.com/a/17803860/946850) auf die doppelte Frage geschrieben. Wird die gleiche Antwort hier als Kopie behalten, nur für den Fall, dass diese Frage nicht geschlossen wird. – krlmlr

Antwort

9

Dies wird $FILE jede sinnvolle Überarbeitung zeigt Linie $LINE der Datei git blame für nennen:

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE 

Wie üblich zeigt die Schuld die Revisionsnummer am Anfang jeder Zeile. Sie können

| sort | uniq -c 

hinzufügen, um aggregierte Ergebnisse zu erhalten, so etwas wie eine Liste von Commits, die diese Zeile geändert haben. (Nicht ganz, wenn Code nur verschoben wurde, könnte dies die gleiche Commit-ID zweimal für unterschiedliche Inhalte der Zeile anzeigen. Für eine detailliertere Analyse müssten Sie einen verzögerten Vergleich der git blame Ergebnisse für benachbarte Commits durchführen ?)

+0

Danke, es scheint so, als würde das den Job machen. Lediglich in den xargs-Optionen musste man 'L' verwenden:' git log --format = format:% H $ FILE | xargs -L1 git blame $ FILE -L $ LINE, $ LINE' – mrt

+0

@MRT: Richtig, der '-l' Schalter zu 'xargs' ist laut POSIX veraltet. Arbeitete an meinem System, aber "-L" ist besser. – krlmlr

+0

Das Argument '-L' für' git tmack' kann verwendet werden, um Code statt Zeilennummern zu finden. Dies kann zum Beispiel hilfreich sein, um eine Funktion zu finden, die verschoben wurde (aber nicht, wenn sie umbenannt wurde). –

7

Es ist nicht genau das, wonach Sie fragen, aber mit git blame <file> können Sie das Commit sehen, das zuletzt jede Zeile geändert hat.

Die ersten Spalten zeigt die begehen ID:

$ git blame my-file.txt 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading 
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) ======= 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Sie über die letzte Änderung aussehen kann durch eine Revision liefert, z.B.

$ git blame 8b3d2e15 my-file.txt 

Sie können auch bestimmte Zeilen wählen mit dem -L Argument, wie folgt aus:

$ git blame my-file.txt -L 4,+3 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

Mehr Details und clevere Tricks finden Sie auf der git-blame man page finden.

+1

Sie können auch die Revision angeben, d. H. Es handelt sich nicht nur um das * letzte * Commit, sondern nur um jede Zeile. –

+3

Vergessen Sie nicht die '-L100, + 10' Option, um 10 Zeilen von Zeile 100 zu beschuldigen, oder' -L/void foo /, +10' um 10 Zeilen dafür verantwortlich zu machen, wo die Funktion foo definiert ist. – sehe

1

Ich denke, du bist nach git blame, es sagt Ihnen, die Festschreibung, die jede Zeile hinzugefügt.

So laufen git blame the-file-that-has-that-line.txt und gehen Sie zu Zeile 100, es wird Ihnen sagen, was Commit hinzugefügt (und wann es begangen wurde, und von wem).

2

git blame <file> -L <line>,<line>

-2

Verwendung git blame

sehen zu erreichen, wenn es

NAME 
     git-blame - Show what revision and author last modified each line of a file 

SYNOPSIS 
     git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m] 
        [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>] 
        [<rev> | --contents <file> | --reverse <rev>] [--] <file> 

DESCRIPTION 
     Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision. 
+0

Wurde bereits dreimal vorgeschlagen, ist nicht das, was das OP sucht ... – krlmlr

2

Es ist eigentlich eine Phantasie GUI mit Git ausgeliefert arbeitet, die es einfach zu reisen hin und her in der Zeit macht, um zu sehen, wie eine bestimmte Zeile geändert . Versuchen Sie

git gui blame <file> 

Sie können auf die Revision neben einem Link klicken, um "in der Zeit zurück reisen".

3

prüfen dieses kurze Tutorial auch: http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
Im Grunde ist es führt Sie durch eine Kombination von git blame und git show, um zu sehen, die eine bestimmte Linie verpflichtet ändern (git blame, wie bereits besonders vorgeschlagen in David Pärsson Antwort) und wie diese Zeilenänderung (git show <commit-id>). Wenn Sie also abwechselnd die Commits git blame <commit-id>git show <commit-id> durchlaufen, erhalten Sie den vollständigen Verlauf einer bestimmten Zeile einer Datei.
Vergessen Sie auch nicht git blame -M, falls Sie daran zweifeln, dass die Zeile aus einer anderen Datei kopiert wurde. Von https://www.kernel.org/pub/software/scm/git/docs/git-blame.html

-M | num |
Erkennen von verschobenen oder kopierten Zeilen in einer Datei. Wenn ein Commit einen Zeilenblock verschiebt oder kopiert (z. B. hat die ursprüngliche Datei A und dann B, und das Commit ändert sie zu B und dann zu A), bemerkt der traditionelle Fehleralgorithmus nur die Hälfte der Bewegung und beschuldigt typischerweise die Linien, die waren nach oben verschoben (dh B) zu dem Elternteil und weist den Linien, die nach unten bewegt wurden (dh A), die Schuld zu. Bei dieser Option werden beide Gruppen von Linien dem übergeordneten Element angelastet, indem zusätzliche Prüfdurchläufe ausgeführt werden.

num ist optional, aber es ist die untere Grenze für die Anzahl der alphanumerischen Zeichen, die git als Verschieben/Kopieren innerhalb einer Datei erkennen muss, um diese Zeilen mit dem übergeordneten Commit zu verknüpfen. Der Standardwert ist 20.

Verwandte Themen