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?
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
.
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".
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.
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! :)
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.
Es gibt auch recursive-blame
. Es kann mit installiert werden
npm install -g recursive-blame
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
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:
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.
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'
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
}
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".