Ich habe eine Datei a.txt
.
cat a.txt
> hello
Der Inhalt von a.txt
ist "Hallo".
Ich mache eine Verpflichtung.
git add a.txt
git commit -m "first commit"
Ich gehe dann a.txt
in ein test
Verzeichnis.
mkdir test
mv a.txt test
Ich mache dann mein zweites Commit.
git add -A
git commit -m "second commit"
Schließlich bearbeite ich, a.txt
um stattdessen "Auf Wiedersehen" zu sagen.
cat a.txt
> goodbye
Ich mache mein letztes Commit.
git add a.txt
git commit -m "final commit"
Hier ist meine Frage:
Wie unterscheide ich den Inhalt a.txt
zwischen meinem letzten und meinem ersten Commit?
Ich habe versucht:,
git diff HEAD^^..HEAD -M a.txt
aber das hat nicht funktioniert. git log --follow a.txt
erkennt die Umbenennung richtig, aber ich kann kein Äquivalent für finden git diff
. Ist dort eines?
Antworten:
Das Problem mit dem Unterschied zwischen
HEAD^^
undHEAD
ist, dass Siea.txt
in beiden Commits eine haben. Wenn Sie also nur diese beiden Commits berücksichtigen (was diff tut), gibt es keine Umbenennung, es gibt eine Kopie und eine Änderung.Um Kopien zu erkennen, können Sie Folgendes verwenden
-C
:Ergebnis:
Übrigens, wenn Sie Ihr Diff auf nur einen Pfad beschränken (wie in) werden
git diff HEAD^^ HEAD a.txt
Sie die Umbenennungen oder Kopien nie sehen, da Sie alles außer einem einzelnen Pfad ausgeschlossen haben und Umbenennungen oder Kopien - per Definition - zwei umfassen Wege.quelle
-- <old-path> <new-path>
... siehe meine Antwort.git show -C [commit]
und es erkannte die Umbenennung der Datei und zeigte mir die Unterschied zwischen den Dateien. Perfekt.Verwenden Sie
-M -- <old-path> <new-path>
(-C
funktioniert auch) , um über eine Umbenennung einer bestimmten Datei zu unterscheiden .Wenn Sie also beim letzten Festschreiben eine Datei umbenannt und geändert haben, können Sie die Änderungen wie folgt anzeigen:
Dies erzeugt:
(
// a.txt
Zeilen hinzugefügt, um Git beim Erkennen der Umbenennung zu helfen)Wenn git die Umbenennung nicht erkennt, können Sie einen niedrigen Ähnlichkeitsschwellenwert mit beispielsweise
-M[=n]
1% angeben :Aus den Git Diff-Dokumenten :
quelle
git diff HEAD^^ HEAD -M -- a.txt test/a.txt
Sie können auch tun:
git diff rev1:file1 rev2:file2
was für Ihr Beispiel wäre
git diff HEAD^^:./a.txt HEAD:./test/a.txt
Beachten Sie die explizite
./
- dieses Format setzt ansonsten voraus, dass die Pfade relativ zur Wurzel des Repos sind. (Wenn Sie in der Wurzel des Repos sind, können Sie das natürlich weglassen.)Dies hängt überhaupt nicht von der Umbenennungserkennung ab, da der Benutzer explizit genau angibt, was zu vergleichen ist. (Daher ist es auch unter anderen Umständen nützlich, z. B. beim Vergleichen von Dateien zwischen verschiedenen SVN-Zweigen in einer Git-SVN-Umgebung.)
quelle
Wenn Ihr Umbenennungs-Commit bereitgestellt, aber noch nicht festgeschrieben ist, können Sie Folgendes verwenden:
quelle