webentwicklung-frage-antwort-db.com.de

Git Schuld - vorherige Commits?

Ist es möglich zu sehen, wer eine bestimmte Zeile bearbeitet hat vor dem Commit, das von git blame, wie eine Geschichte von Commits für eine bestimmte Zeile?

Ich führe beispielsweise Folgendes aus (für das hervorragende Projekt uncrustify):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

Wie kann ich herausfinden, wer diese Zeile bearbeitet hat vorher commit fe25b6d? Und wer hat es vorher bearbeitet dass festschreiben?

343
Sedate Alien
git blame -L10,+1 fe25b6d^ -- src/options.cpp

Sie können eine Revision angeben, ab der git blame zurückblicken soll (anstelle der Standardversion von HEAD). fe25b6d^ ist das Elternteil von fe25b6d.

347
Amber

Sie können git log -L verwenden, um die Entwicklung eines Linienbereichs anzuzeigen.

Beispielsweise :

git log -L 15,23:filename.txt

bedeutet "Verfolgen Sie die Entwicklung der Zeilen 15 bis 23 in der Datei Dateiname.txt".

166
Navneet

Vielleicht möchten Sie Folgendes überprüfen:

git gui blame <filename>

Bietet Ihnen eine schöne grafische Darstellung von Änderungen wie "Git Blame", aber mit anklickbaren Links pro Zeile, um zu früheren Commits überzugehen. Bewegen Sie den Mauszeiger über die Links, um ein Popup mit Commit-Details zu erhalten. Nicht meine Credits ... hier gefunden:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git gui ist eine grafische Tcl/Tc-Schnittstelle für Git. Ohne weitere Parameter startet es eine ziemlich einfache, aber nützliche grafische App zum Festschreiben von Dateien, Hunks oder sogar einzelnen Zeilen und anderen ähnlichen Befehlen wie Ändern, Zurücksetzen, Drücken ... Es ist Teil der Git Stock Suite. Unter Windows ist es im Installationsprogramm enthalten. Unter debian - ich kenne keine anderen * nix-Systeme - muss separat installiert werden:

apt-get install git-gui

Aus den Dokumenten:

https://git-scm.com/docs/git-gui

[~ # ~] Beschreibung [~ # ~]

Eine Tcl/Tk-basierte grafische Benutzeroberfläche für Git. Mit git gui können Benutzer Änderungen an ihrem Repository vornehmen, indem sie neue Commits ausführen, vorhandene ändern, Zweige erstellen, lokale Zusammenführungen durchführen und Remoterepositorys abrufen/verschieben.

Im Gegensatz zu gitk konzentriert sich git gui auf die Erstellung von Commits und die Annotation einzelner Dateien und zeigt den Projektverlauf nicht an. Es werden jedoch Menüaktionen zum Starten einer Gitk-Sitzung in der Git-GUI bereitgestellt.

es ist bekannt, dass Git Gui auf allen gängigen UNIX-Systemen, Mac OS X und Windows (sowohl unter Cygwin als auch unter MSYS) funktioniert. Soweit möglich, werden betriebssystemspezifische Richtlinien für Benutzeroberflächen befolgt, wodurch git gui für Benutzer zu einer recht nativen Oberfläche wird.

[~ # ~] Befehle [~ # ~]

Schuld

Starten Sie einen Blame Viewer für die angegebene Datei in der angegebenen Version (oder für das Arbeitsverzeichnis, falls nicht angegeben).

Browser

Starten Sie einen Baum-Browser, in dem alle Dateien im angegebenen Commit angezeigt werden. Über den Browser ausgewählte Dateien werden im Schuldbetrachter geöffnet.

citool

Starten Sie git gui und vereinbaren Sie genau ein Commit, bevor Sie die Shell verlassen und zurückkehren. Die Benutzeroberfläche ist darauf beschränkt, nur Aktionen festzuschreiben, wodurch die Startzeit der Anwendung geringfügig verkürzt und die Menüleiste vereinfacht wird.

version

Zeigt die aktuell ausgeführte Version von Git GUI an.

25
Holger Böhnke

Bernsteins Antwort ist richtig, aber ich fand es unklar; Die Syntax lautet:

git blame {commit_id} -- {path/to/file}

Hinweis: das -- wird verwendet, um das tree-ish sha1 von den relativen Dateipfaden zu trennen. 1

Zum Beispiel:

git blame master -- index.html

Voller Dank an Amber für das Wissen um alle Dinge! :)

25
ThorSummoner

Aufbauend auf der vorherigen Antwort, sollte dieser Bash-Einzeiler Ihnen das geben, wonach Sie suchen. Es zeigt den Git-Blame-Verlauf für eine bestimmte Zeile einer bestimmten Datei in den letzten 5 Revisionen an:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

In der Ausgabe dieses Befehls wird möglicherweise der Inhalt der Zeilenänderung angezeigt, oder die angezeigte Zeilennummer ändert sich für ein bestimmtes Commit.

Dies weist häufig darauf hin, dass die Zeile nach diesem bestimmten Festschreiben zum ersten Mal hinzugefügt wurde. Dies könnte auch darauf hinweisen, dass die Zeile aus einem anderen Teil der Datei verschoben wurde.

17
Will Sheppard

Es gibt auch recursive-blame . Es kann mit installiert werden

npm install -g recursive-blame
12
Thomas W

Eine sehr einzigartige Lösung für dieses Problem ist die Verwendung von git log:

git log -p -M --follow --stat - path/to/your/file

Wie von Andre erklärt hier

9
Mannu

Wenn Sie JetBrains Idea IDE (und Derivate)) verwenden, können Sie mehrere Zeilen auswählen, mit der rechten Maustaste auf das Kontextmenü klicken und dann Git -> Verlauf zur Auswahl anzeigen Auswirkungen auf die ausgewählten Linien:

enter image description here

5
warvariuc

Aufbauend auf der Antwort von Will Shepard enthält seine Ausgabe doppelte Zeilen für Festschreibungen, bei denen keine Änderungen vorgenommen wurden. Sie können diese also wie folgt filtern (mithilfe von answer )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

Beachten Sie, dass ich das REVS-Argument entfernt habe und dies auf das Root-Commit zurückgeht. Dies ist auf die Beobachtung von Max Nanasy oben zurückzuführen.

1
DavidN

Aufbauend auf der Antwort von DavidN möchte ich der umbenannten Datei folgen:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | Perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

ref: zeigt den Umbenennungsverlauf der Datei im Git-Log an

1
Bill Chan

Bauen Sie auf stangls 's answer , ich habe dieses Skript in meinem PATH (auch unter Windows) als git-bh abgelegt:

So kann ich nach allen Commits suchen, an denen ein Word beteiligt war:

git bh path/to/myfile myWord

Skript:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
0
VonC

Ich benutze dieses kleine Bash-Skript, um einen Überblick über die Schuldzuweisungen zu erhalten.

Erster Parameter: zu betrachtende Datei

Nachfolgende Parameter: Übergeben an Git-Schuld

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame [email protected] $hash -- "$f" | sed 's/^/  /'
  done
}

Sie können Schuldparameter wie - L 70, + 1 angeben, aber es ist besser, die Regex-Suche der Schuldzuweisungen zu verwenden, da sich die Zeilennummern normalerweise mit der Zeit "ändern".

0
stangls