Por lo que entiendo, Git realmente no necesita rastrear las operaciones de cambio de nombre / movimiento / copia de archivos , entonces, ¿cuál es el verdadero propósito de git mv ? La página del manual no es especialmente descriptiva ...
¿Es obsoleto? ¿Es un comando interno que no debe ser utilizado por usuarios habituales?

mv oldname newname; git add newname; git rm oldname, también saldrá malgit mv oldname newname(ver esta respuesta ).git mves ligeramente diferente delmv oldname newname; git add newname; git rm oldname, en que si realizó cambios en el archivo antes degit mvcrearlo, esos cambios no se organizarán hasta que obtengagit addel nuevo archivo.Del GitFaq oficial :
fuente
git mvy el enfoque manual? No es obvio degit help mv.Git solo está tratando de adivinar lo que estás tratando de hacer. Está haciendo todo lo posible para preservar la historia ininterrumpida. Por supuesto, no es perfecto. Entonces le
git mvpermite ser explícito con su intención y evitar algunos errores.Considera este ejemplo. Comenzando con un repositorio vacío,
Resultado:
La autodetección falló :( ¿O lo hizo?
y entonces
Ahora intente en su lugar (recuerde eliminar la
.gitcarpeta cuando experimente):Hasta aquí todo bien:
Ahora, nadie es perfecto:
De Verdad? Pero por supuesto...
... y el resultado es el mismo que el anterior: solo
--followmuestra el historial completo.Ahora, tenga cuidado con el cambio de nombre, ya que cualquiera de las opciones puede producir efectos extraños . Ejemplo:
Contraste con:
Resultado:
Ups ... Ahora el historial vuelve a la inicial a en lugar de a la inicial b , lo cual está mal. Entonces, cuando hicimos dos movimientos a la vez, Git se confundió y no siguió los cambios correctamente. Por cierto, en mis experimentos sucedió lo mismo cuando eliminé / creé archivos en lugar de usarlos
git mv. Proceder con cuidado; has sido advertido...fuente
Como dice @Charles,
git mves una taquigrafía.La verdadera pregunta aquí es "Otros sistemas de control de versiones (por ejemplo, Subversion y Perforce) tratan los cambios de nombre de archivos especialmente. ¿Por qué no Git?"
Linus explica en http://permalink.gmane.org/gmane.comp.version-control.git/217 con un tacto característico:
fuente
Hay otro uso que tengo para
git mvno mencionado anteriormente.Desde que descubrí
git add -p(modo parche de git add; consulte http://git-scm.com/docs/git-add ), me gusta usarlo para revisar los cambios a medida que los agrego al índice. Por lo tanto, mi flujo de trabajo se convierte en (1) trabajar en el código, (2) revisar y agregar al índice, (3) confirmar.¿Cómo
git mvencaja? Si mueve un archivo directamente y luego usagit rmygit add, todos los cambios se agregan al índice, y usar git diff para ver los cambios es menos fácil (antes de confirmar). El usogit mv, sin embargo, añade la nueva vía para el índice, pero no los cambios realizados en el archivo, permitiendo de este modogit diffygit add -pal trabajo como de costumbre.fuente
Hay un caso de nicho donde
git mvsigue siendo muy útil: cuando desea cambiar la carcasa de un nombre de archivo en un sistema de archivos que no distingue entre mayúsculas y minúsculas. Tanto APFS (mac) como NTFS (windows) son, por defecto, insensibles a mayúsculas y minúsculas (pero conservan mayúsculas y minúsculas).greg.kindel menciona esto en un comentario sobre la respuesta de CB Bailey.
Supongamos que está trabajando en una Mac y tiene un archivo
Mytest.txtadministrado por git. Desea cambiar el nombre del archivo aMyTest.txt.Tu podrías intentar:
Oh querido. Git no reconoce que ha habido ningún cambio en el archivo.
Usted podría evitar esto con el cambio de nombre del archivo completo a continuación, cambiar el nombre de nuevo:
¡Viva!
O podrías ahorrarte toda esa molestia usando
git mv:fuente