git mv
verschiebt die Datei und aktualisiert den Index, um den ersetzten Dateipfad festzuhalten, sowie alle betroffenen Git-Submodule zu aktualisieren. Anders als bei einer manuellen Verschiebung werden auch reine Umbenennungen erkannt, die sonst von Git nicht als Änderung erkannt würden.
Es verhält sich ähnlich (wenn auch nicht identisch) wie das Verschieben der Datei außerhalb von git, wobei der alte Pfad aus dem Index entfernt wird, indem git rm
und das Hinzufügen der neuen Datei in den Index mit git add
.
Antwort Motivation
Auf diese Frage gibt es eine Menge guter Teilantworten. Diese Antwort ist ein Versuch, sie zu einer einzigen zusammenhängenden Antwort zu kombinieren. Eine Sache, die in keiner der anderen Antworten erwähnt wird, ist die Tatsache, dass die Manpage beantwortet die Frage zwar größtenteils, aber sie ist vielleicht nicht so offensichtlich, wie sie sein könnte.
Ausführliche Erläuterung
In der Manpage werden drei verschiedene Effekte genannt:
-
Die Datei, das Verzeichnis oder der Symlink wird im Dateisystem verschoben:
git-mv - Verschieben oder Umbenennen einer Datei, eines Verzeichnisses oder eines Symlinks
-
Der Index wird aktualisiert, indem der neue Pfad hinzugefügt und der vorherige entfernt wird:
Nach erfolgreichem Abschluss wird der Index aktualisiert, aber die Änderung muss noch bestätigt werden.
-
Verschobene Untermodule werden aktualisiert, damit sie am neuen Ort funktionieren:
Das Verschieben eines Submoduls, das eine Git-Datei verwendet (was bedeutet, dass es mit einer Git-Version 1.7.8 oder neuer geklont wurde), aktualisiert die Git-Datei und die core.worktree-Einstellung, damit das Submodul am neuen Ort funktioniert. Außerdem wird versucht, die Einstellung submodule.<name>.path in der Datei gitmodules(5) und stellt diese Datei bereit (es sei denn, -n wird verwendet).
Wie bereits in diese Antwort , git mv
ist dem Verschieben der Datei sehr ähnlich, wobei der neue Pfad zum Index hinzugefügt und der vorherige Pfad aus dem Index entfernt wird:
mv oldname newname
git add newname
git rm oldname
Da jedoch diese Antwort weist darauf hin, git mv
ist in seinem Verhalten nicht genau mit diesem identisch. Das Verschieben der Datei über git mv
fügt den neuen Pfad in den Index ein, aber nicht den geänderten Inhalt der Datei. Bei Verwendung der drei einzelnen Befehle wird dagegen die gesamte Datei in den Index aufgenommen, einschließlich aller geänderten Inhalte. Dies könnte relevant sein, wenn ein Arbeitsablauf verwendet wird, der den Index anpasst, anstatt alle Änderungen in der Datei hinzuzufügen.
Außerdem, wie bereits in diese Antwort y dieser Kommentar , git mv
hat den zusätzlichen Vorteil, dass es Umbenennungen auf Dateisystemen, die nur aus Großbuchstaben bestehen, verarbeiten kann. Groß- und Kleinschreibung wird nicht berücksichtigt sondern case-preserving wie es in aktuellen macOS- und Windows-Dateisystemen oft der Fall ist. In solchen Systemen würde Git zum Beispiel nicht erkennen, dass sich der Dateiname geändert hat, nachdem eine Datei über mv Mytest.txt MyTest.txt
während mit git mv Mytest.txt MyTest.txt
seinen Namen erfolgreich aktualisieren würde.