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 mv
es ligeramente diferente delmv oldname newname; git add newname; git rm oldname
, en que si realizó cambios en el archivo antes degit mv
crearlo, esos cambios no se organizarán hasta que obtengagit add
el nuevo archivo.Del GitFaq oficial :
fuente
git mv
y 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 mv
permite 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
.git
carpeta 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
--follow
muestra 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 mv
es 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 mv
no 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 mv
encaja? Si mueve un archivo directamente y luego usagit rm
ygit 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 diff
ygit add -p
al trabajo como de costumbre.fuente
Hay un caso de nicho donde
git mv
sigue 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.txt
administrado 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