J'avais lu que lorsque renommer des fichiers dans Git vous devez valider toutes les modifications, effectuer votre renommage et ensuite mettre en scène votre fichier renommé. Git reconnaîtra le fichier à partir de son contenu, plutôt que de le voir comme un nouveau fichier non suivi, et conservera l'historique des modifications.
Cependant, en faisant cela ce soir, j'ai fini par revenir à la situation suivante git mv
.
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
J'ai renommé ma feuille de style dans Finder de iphone.css
à mobile.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
Donc Git pense maintenant que j'ai supprimé un fichier CSS et que j'en ai ajouté un nouveau. Ce n'est pas ce que je veux. Annulons le renommage et laissons Git faire le travail.
> $ git reset HEAD .
Unstaged changes after reset:
M css/iphone.css
M index.html
Je suis de retour à mon point de départ :
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
Utilisons git mv
à la place :
> $ 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
#
Il semble que nous soyons bons. Alors pourquoi Git n'a-t-il pas reconnu le renommage la première fois que j'ai utilisé le Finder ?
33 votes
Git suit le contenu, pas les fichiers, donc la façon dont vous mettez votre index dans l'état approprié n'a pas d'importance.
add+rm
oumv
- cela produit le même résultat. Git utilise alors sa détection de renommage/copie pour vous indiquer qu'il s'agit d'un renommage. La source que vous avez citée est également inexacte. Le fait que vous modifiez et renommiez dans le même commit n'a pas d'importance. Lorsque vous faites un diff sur la modification et le renommage, la détection de renommage le verra comme un renommage+modification, ou si la modification est une réécriture totale, il apparaîtra comme ajouté et supprimé - toujours sans importance de la façon dont vous l'avez effectué.7 votes
Si c'est vrai, pourquoi ne l'a-t-il pas détecté lors de mon renommage avec le Finder ?
30 votes
git mv old new
met automatiquement à jour l'index. Lorsque vous renommez en dehors de Git, vous devrez faire la démarche suivantegit add new
ygit rm old
pour mettre en scène les modifications de l'index. Une fois que vous avez fait celagit status
fonctionnera comme vous le souhaitez.4 votes
Je viens juste de déplacer un tas de fichiers dans un fichier
public_html
dir, qui sont suivis dans git. Ayant effectuégit add .
ygit commit
mais il y a toujours un tas de fichiers "supprimés" dans le dossier de l'entreprise.git status
. J'ai effectué ungit commit -a
et les suppressions ont été effectuées mais maintenant je n'ai pas d'historique sur les fichiers qui se trouvent danspublic_html
maintenant. Ce flux de travail n'est pas aussi fluide que je le voudrais.