Ho letto che quando si rinomina un file in git , è necessario eseguire il commit di eventuali modifiche, eseguire la ridenominazione e quindi mettere in scena il file rinominato. Git riconoscerà il file dal contenuto, piuttosto che vederlo come un nuovo file non tracciato e manterrà la cronologia delle modifiche.
Tuttavia, facendo proprio questo stasera ho finito per tornare a git mv
.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Rinomina il mio foglio di stile nel Finder da iphone.css
amobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: css/iphone.css
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# css/mobile.css
Quindi git ora pensa di aver eliminato un file CSS e di averne aggiunto uno nuovo. Non è quello che voglio, annulla la ridenominazione e lascia che git faccia il lavoro.
> $ git reset HEAD .
Unstaged changes after reset:
M css/iphone.css
M index.html
Torna da dove ho iniziato.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Usiamo git mv
invece.
> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: css/iphone.css -> css/mobile.css
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
Sembra che stiamo bene. Quindi perché Git non ha riconosciuto la ridenominazione la prima volta che ho usato Finder?
git mv old new
aggiorna automaticamente l'indice. Quando rinominerai al di fuori di Git, dovrai fare git add new
e git rm old
mettere in scena le modifiche all'indice. Una volta fatto git status
, funzionerà come previsto.
public_html
, che sono tracciati in git. Dopo aver eseguito git add .
e git commit
, ha ancora mostrato un sacco di file "cancellati" in git status
. Ho eseguito un git commit -a
e le eliminazioni sono state confermate, ma ora non ho alcuna cronologia sui file che vivono public_html
ora. Questo flusso di lavoro non è fluido come vorrei.
add+rm
omv
- produce lo stesso risultato. Git quindi utilizza il suo rilevamento di rinomina / copia per farti sapere che era una ridenominazione. Anche la fonte che hai citato è imprecisa. Non importa se modifichi + rinomina nello stesso commit o meno. Quando fai una differenza tra sia la modifica che la ridenominazione, il rilevamento della ridenominazione lo vedrà come una ridenominazione + modifica, o se la modifica è una riscrittura totale, verrà mostrata come aggiunta ed eliminata - comunque non importa come hai eseguito esso.