D'après ce que je comprends, Git n'a pas vraiment besoin de suivre les opérations de renommage / déplacement / copie de fichiers , alors quel est le véritable objectif de git mv ? La page de manuel n'est pas spécialement descriptive ...
Est-ce obsolète? Est-ce une commande interne, non destinée à être utilisée par des utilisateurs réguliers?
mv oldname newname; git add newname; git rm oldname
, elle le sera égalementgit mv oldname newname
(voir cette réponse ).git mv
c'est légèrement différent de lamv oldname newname; git add newname; git rm oldname
, dans la mesure où si vous avez apporté des modifications au fichier avant degit mv
le faire, ces modifications ne seront pas transférées tant que vous n'aurez pas créégit add
le nouveau fichier.Du GitFaq officiel :
la source
git mv
et l'approche manuelle? Ce n'est pas évident degit help mv
.Git essaie juste de deviner pour vous ce que vous essayez de faire. Il s'efforce de préserver une histoire ininterrompue. Bien sûr, ce n'est pas parfait.
git mv
Vous permet donc d'être explicite avec votre intention et d'éviter certaines erreurs.Considérez cet exemple. En commençant par un repo vide,
Résultat:
La détection automatique a échoué :( Ou est-ce le cas?
puis
Essayez maintenant à la place (n'oubliez pas de supprimer le
.git
dossier lors de l'expérimentation):Jusqu'ici tout va bien:
Maintenant, personne n'est parfait:
Vraiment? Mais bien sûr...
... et le résultat est le même que ci-dessus:
--follow
affiche uniquement l'historique complet.Maintenant, soyez prudent avec le changement de nom, car l'une ou l'autre option peut toujours produire des effets étranges . Exemple:
Comparez-le avec:
Résultat:
Ups ... Maintenant, l'histoire revient à l' initiale a au lieu de l' initiale b , ce qui est faux. Donc, quand nous avons fait deux mouvements à la fois, Git est devenu confus et n'a pas suivi correctement les changements. Soit dit en passant, dans mes expériences, la même chose s'est produite lorsque j'ai supprimé / créé des fichiers au lieu de les utiliser
git mv
. Procédez avec soin; tu as été prévenu...la source
Comme le dit @Charles,
git mv
c'est un raccourci.La vraie question ici est "Les autres systèmes de contrôle de version (par exemple Subversion et Perforce) traitent spécialement les renommages de fichiers. Pourquoi Git ne fonctionne-t-il pas?"
Linus explique à http://permalink.gmane.org/gmane.comp.version-control.git/217 avec tact caractéristique:
la source
Il y a une autre utilisation que j'ai pour
git mv
pas mentionnée ci-dessus.Depuis la découverte
git add -p
(mode patch de git add; voir http://git-scm.com/docs/git-add ), j'aime l'utiliser pour revoir les modifications lorsque je les ajoute à l'index. Ainsi mon workflow devient (1) travailler sur du code, (2) réviser et ajouter à l'index, (3) valider.Comment
git mv
s'intègre-t-il? Si vous déplacez un fichier directement, puis en utilisantgit rm
etgit add
, toutes les modifications sont ajoutées à l'index, et l'utilisation de git diff pour afficher les modifications est moins facile (avant de valider). L' utilisationgit mv
, cependant, ajoute le nouveau chemin d' accès à l'index , mais pas les modifications apportées au fichier, permettant ainsigit diff
etgit add -p
au travail comme d' habitude.la source
Il existe un cas de niche où
git mv
reste très utile: lorsque vous souhaitez modifier la casse d'un nom de fichier sur un système de fichiers insensible à la casse. APFS (mac) et NTFS (windows) sont, par défaut, insensibles à la casse (mais en respectant la casse).greg.kindel le mentionne dans un commentaire sur la réponse de CB Bailey.
Supposons que vous travaillez sur un Mac et que votre fichier soit
Mytest.txt
géré par git. Vous voulez changer le nom du fichier enMyTest.txt
.Tu pourrais essayer:
Oh cher. Git ne reconnaît pas que le fichier a été modifié.
Vous pouvez contourner ce problème en renommant complètement le fichier, puis en le renommant:
Hourra!
Ou vous pourriez vous épargner tout cela en utilisant
git mv
:la source