Ist es möglich, git dazu zu bringen, einen Unterschied zwischen einer bestimmten Datei zu erzeugen, wie sie jetzt existiert, und wie sie vor dem letzten Commit existierte, der sie geändert hat?
Das heißt, wenn wir wissen:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Dann git diff 456def myfile
gibt die letzte Änderung zu myfile. Es ist möglich, dasselbe ohne das Wissen zu tun, das von der git log
; Was hat sich in 123abc geändert?
git diff HEAD^ <file_path>
HEAD^
ist123abc
,HEAD^^
ist456def
; und wenn es andere Commits gab, die diese Datei nicht beeinflussten, dannHEAD^
verweist auf sie)Antworten:
Dies existiert zwar, aber es ist tatsächlich eine Funktion von
git log
:Beachten Sie, dass
-p
dies auch verwendet werden kann, um den Inline-Unterschied von einem einzelnen Commit anzuzeigen:Verwendete Optionen:
-p
(auch-u
oder--patch
) ist deeeeeeeep in dergit-log
Manpage versteckt und ist eigentlich eine Anzeigeoption fürgit-diff
. Bei Verwendung mitlog
wird der Patch angezeigt, der für jedes Commit generiert wird , zusammen mit den Commit-Informationen. Außerdem werden Commits ausgeblendet, die die angegebenen nicht berühren<path>
. (Dieses Verhalten wird im folgenden Abschnitt beschrieben--full-diff
, wodurch der volle Unterschied jedes Commits angezeigt wird.)-1
zeigt nur die letzte Änderung an der angegebenen Datei an (-n 1
kann anstelle von verwendet werden-1
); Andernfalls werden alle Unterschiede ungleich Null dieser Datei angezeigt.--follow
ist erforderlich, um Änderungen anzuzeigen, die vor einer Umbenennung aufgetreten sind.Soweit ich das beurteilen kann, ist dies die einzige Möglichkeit, die letzten Änderungen an einer Datei sofort anzuzeigen, ohne
git log
(oder ähnliches) zu verwenden, um entweder die Anzahl der dazwischen liegenden Revisionen zu zählen oder den Hash des Commits zu bestimmen.Um Änderungen an älteren Revisionen anzuzeigen, scrollen Sie einfach durch das Protokoll oder geben Sie ein Commit oder Tag an, von dem aus das Protokoll gestartet werden soll. (Wenn Sie ein Commit oder Tag angeben, kehren Sie natürlich zum ursprünglichen Problem zurück, herauszufinden, welches Commit oder Tag das richtige ist.)
Kredit, bei dem Kredit fällig ist:
log -p
dank dieser Antwort entdeckt .--follow
Option zu zeigen.-n 1
Option und atatko für die Erwähnung der-1
Variante.-p
semantisch "bedeutet".quelle
git log -p filename
-n 1
Parameter hinzufügen .git log -p -n 1 filename
-n 1
kann auch ersetzt werden durch-1
, es ändert nichts am Ergebnis Ich bevorzuge nur die Syntax:git log -p -1 filename
git log -p -1 --skip=1 <path>
, um das zweite Commit anzuzeigen.Eine der Möglichkeiten, Git Diff zu verwenden, ist:
Ein üblicher Weg, um ein Commit des letzten Commits zu referenzieren, ist ein relativer Pfad zum tatsächlichen HEAD. Sie können frühere Commits als HEAD ^ (in Ihrem Beispiel ist dies 123abc) oder HEAD ^^ (in Ihrem Beispiel 456def) usw. referenzieren.
Die Antwort auf Ihre Frage lautet also:
quelle
HEAD^
, aber das hat natürlich nichts gebracht. Ich dachte nicht, es zu versuchenHEAD^^
.HEAD~2
HEAD^^ myfile
es sich tatsächlich auf das vorletzte Commit bezieht, das sich geändert hatmyfile
. Es bezieht sich auf das vorletzte Commit insgesamt. Gibt es eine Möglichkeit, "Ich möchte die letzte an dieser Datei vorgenommene Änderung sehen" anzugeben, ohne den Commit-Hash (einen Teil davon) anzugeben oder die Anzahl der Commits zwischen der letzten an dieser Datei vorgenommenen Änderung und der aktuellen Revision zu zählen?git log -p
es ziemlich nah.Wenn Sie mit einem grafischen Werkzeug gut zurechtkommen, funktioniert dies sehr gut:
gitk zeigt jetzt alle Commits an, bei denen die Datei aktualisiert wurde. Wenn Sie ein Commit markieren, wird der Unterschied zum vorherigen Commit in der Liste angezeigt. Dies funktioniert auch für Verzeichnisse, aber Sie können dann auch die Datei auswählen, die für das ausgewählte Commit unterschieden werden soll. Super nützlich!
quelle
git difftool HEAD^ file
odergit difftool -d HEAD^ path