git mv
Scopri il comando git mv per spostare o rinominare file in un repository Git mantenendoli in staging in un solo passaggio.
Il comando git mv sposta o rinomina un file o una directory già tracciata da Git e mette in staging la modifica in un solo passaggio. Questo capitolo spiega come rinominare un file, spostarlo in una directory, le opzioni più utili (-f, -n, -k) e le insidie — principalmente che git mv funziona solo su file già noti a Git e che Git non memorizza i rinominamenti come record.
Definizione
git mv è un wrapper di convenienza. Eseguirlo equivale a spostare il file manualmente, segnalare a Git che il vecchio percorso non esiste più con git rm e aggiungere il nuovo percorso con git add — tutto in una volta. Il vantaggio è che la working tree e la staging area non perdono mai la sincronizzazione, nemmeno per un istante.
Rinominare un file
Per rinominare un file tracciato, fornisci il vecchio nome e il nuovo nome:
git mv old-name.txt new-name.txtIl file viene rinominato su disco e la modifica è già in staging, pronta per il commit. Un successivo git status mostra una voce di rinominamento pulita. La forma breve lo rende evidente — il flag R indica un rinominamento in staging:
git status --shortR old-name.txt -> new-name.txtNon resta che eseguire il commit della modifica con git commit.
Spostare un file in una directory
Fornisci una directory come destinazione per spostare un file senza rinominarlo:
git mv styles.css assets/Puoi spostare più file in una directory con un solo comando, purché la destinazione sia una cartella esistente:
git mv main.css reset.css print.css assets/Quando l'ultimo argomento è una directory esistente, tutti i percorsi precedenti vengono spostati al suo interno. Se la directory non esiste ancora, Git tratta l'ultimo argomento come un nuovo nome di file — quindi crea prima la cartella (con mkdir) quando intendi spostare file al suo interno.
Rinominare una directory
Passa una directory tracciata come sorgente per spostarla o rinominarla insieme a tutto il suo contenuto:
git mv src/ lib/Git mette in staging un rinominamento per ogni file tracciato nella directory, quindi un singolo git mv può produrre molte voci renamed: in git status.
Cosa risparmia git mv
Senza git mv, lo stesso rinominamento richiede tre passaggi manuali:
mv old-name.txt new-name.txt
git rm old-name.txt
git add new-name.txtgit mv li riduce a uno solo e garantisce che la staging area rimanga coerente. Tieni presente che Git non memorizza effettivamente i rinominamenti — li rileva confrontando il contenuto dei file quando esegui git log o git diff. git mv rende semplicemente la modifica nella working tree ordinata e già in staging.
git mv funziona solo su file tracciati
git mv opera sui file già tracciati da Git. Puntarlo su un file non tracciato genera un errore:
git mv note.txt moved.txtfatal: not under version control, source=note.txt, destination=moved.txtPer un file mai visto da Git, rinominalo con il normale mv della shell e poi metti in staging il nuovo nome con git add. Usa git mv una volta che il file è stato committato.
Opzioni comuni
| Comando | Descrizione |
|---|---|
git mv <source> <destination> | Rinomina o sposta un file tracciato e mette in staging la modifica. |
git mv <source> <dir>/ | Sposta un file in una directory esistente. |
git mv -f <source> <destination> | Forza lo spostamento anche se la destinazione esiste già. |
git mv -k <source> <destination> | Salta gli spostamenti che causerebbero un errore anziché fallire. |
git mv -n <source> <destination> | Esecuzione a secco — mostra cosa accadrebbe senza eseguire nulla. |
Quando la destinazione esiste già
Per impostazione predefinita Git si rifiuta di sovrascrivere un file esistente. Se intendi sostituirlo, aggiungi il flag force:
git mv -f draft.md final.mdUsa questa opzione con cautela, poiché elimina qualsiasi contenuto già presente nella destinazione.
Anteprima con un dry run
Prima di uno spostamento esteso, usa -n (o --dry-run) per vedere esattamente cosa farebbe Git — nulla viene rinominato e nulla viene messo in staging:
git mv -n old-name.txt new-name.txtChecking rename of 'old-name.txt' to 'new-name.txt'
Renaming old-name.txt to new-name.txtCombinalo con -v (verbose) per stampare ogni rinominamento nel momento in cui avviene durante uno spostamento reale.
Comandi correlati
- git rm — rimuove file tracciati;
git mvesegue unrmdel vecchio percorso internamente. - git add — mette in staging le modifiche;
git mvesegue l'equivalenteadddel nuovo percorso al posto tuo. - git status — conferma il rinominamento in staging prima del commit.
- git commit — registra lo spostamento nella cronologia.
- git log — visualizza i rinominamenti con
git log --follow <file>per mantenere la cronologia di un file attraverso gli spostamenti.