Soweit ich weiß, muss Git die Vorgänge zum Umbenennen / Verschieben / Kopieren von Dateien nicht wirklich verfolgen. Was ist also der eigentliche Zweck von git mv ? Die Manpage ist nicht besonders beschreibend ...
Ist es veraltet? Ist es ein interner Befehl, der nicht von normalen Benutzern verwendet werden soll?
mv oldname newname; git add newname; git rm oldname
, geht sie auch schiefgit mv oldname newname
(siehe diese Antwort ).git mv
sich dies geringfügig von dem unterscheidet , da diese Änderungen erst dann vorgenommen werdenmv oldname newname; git add newname; git rm oldname
, wenn Sie Änderungen an der Datei vorgenommen haben, bevorgit mv
Siegit add
die neue Datei erstellt haben.Aus dem offiziellen GitFaq :
quelle
git mv
und den manuellen Ansatz angibt ? Es ist nicht offensichtlich vongit help mv
.Git versucht nur, für Sie zu erraten, was Sie versuchen zu tun. Es unternimmt jeden Versuch, die ungebrochene Geschichte zu bewahren. Natürlich ist es nicht perfekt. So
git mv
können Sie Ihre Absicht explizit festlegen und einige Fehler vermeiden.Betrachten Sie dieses Beispiel. Beginnend mit einem leeren Repo,
Ergebnis:
Autodetection fehlgeschlagen :( Oder?
und dann
Versuchen Sie es stattdessen (denken Sie daran, den
.git
Ordner beim Experimentieren zu löschen ):So weit, ist es gut:
Jetzt ist niemand mehr perfekt:
"Ja wirklich?" Aber natürlich...
... und das Ergebnis ist das gleiche wie oben:
--follow
zeigt nur den vollständigen Verlauf.Seien Sie jetzt vorsichtig beim Umbenennen, da beide Optionen immer noch seltsame Effekte erzeugen können . Beispiel:
Vergleichen Sie es mit:
Ergebnis:
Ups ... Jetzt geht der Verlauf zurück zu Initiale a anstelle von Initiale b , was falsch ist. Als wir also zwei Züge gleichzeitig machten, wurde Git verwirrt und verfolgte die Änderungen nicht richtig. Übrigens geschah in meinen Experimenten dasselbe, als ich Dateien löschte / erstellte, anstatt sie zu verwenden
git mv
. Gehen Sie vorsichtig vor; du wurdest gewarnt...quelle
Wie @Charles sagt,
git mv
ist eine Abkürzung.Die eigentliche Frage lautet hier: "Andere Versionskontrollsysteme (z. B. Subversion und Perforce) behandeln das Umbenennen von Dateien besonders. Warum nicht Git?"
Linus erklärt unter http://permalink.gmane.org/gmane.comp.version-control.git/217 mit charakteristischem Takt:
quelle
Es gibt eine andere Verwendung, die ich
git mv
oben nicht erwähnt habe.Seit der Entdeckung
git add -p
(der Patch-Modus von git add; siehe http://git-scm.com/docs/git-add ) verwende ich ihn gerne, um Änderungen zu überprüfen, wenn ich sie dem Index hinzufüge. So wird mein Workflow (1) Code bearbeiten, (2) überprüfen und zum Index hinzufügen, (3) festschreiben.Wie
git mv
passt das zusammen? Wenn Sie eine Datei direkt mitgit rm
und verschiebengit add
, werden alle Änderungen zum Index hinzugefügt, und die Verwendung von git diff zum Anzeigen von Änderungen ist weniger einfach (vor dem Festschreiben). Mitgit mv
wird jedoch der neue Pfad zum Index hinzugefügt, jedoch keine Änderungen an der Datei vorgenommen, sodass die Arbeit wie gewohnt möglich istgit diff
undgit add -p
funktioniert.quelle
Es gibt einen Nischenfall, in dem es
git mv
sehr nützlich bleibt: Wenn Sie die Schreibweise eines Dateinamens in einem Dateisystem ohne Berücksichtigung der Groß- und Kleinschreibung ändern möchten. Sowohl APFS (Mac) als auch NTFS (Windows) unterscheiden standardmäßig nicht zwischen Groß- und Kleinschreibung (jedoch ohne Berücksichtigung der Groß- und Kleinschreibung).greg.kindel erwähnt dies in einem Kommentar zu CB Baileys Antwort.
Angenommen, Sie arbeiten an einem Mac und lassen eine Datei
Mytest.txt
von git verwalten. Sie möchten den Dateinamen in ändernMyTest.txt
.Du könntest es versuchen:
Ach je. Git erkennt nicht an, dass Änderungen an der Datei vorgenommen wurden.
Sie können dies umgehen, indem Sie die Datei vollständig umbenennen und dann wieder umbenennen:
Hurra!
Oder Sie könnten sich all diese Mühe sparen, indem Sie Folgendes verwenden
git mv
:quelle