Introduction
Chaque opération Git déplace des données entre trois zones : l'arborescence de travail (vos fichiers), l'index (le brouillon du prochain commit) et le dépôt (l'historique commité sous .git). Nommer ce qui se déplace où est le modèle mental le plus utile.
Les zones
- Arborescence de travail : le répertoire dans lequel vous éditez.
- Index :
.git/index, le tree stagé. - Dépôt : objets dans
.git/objectsplus refs dans.git/refs.
Commandes par direction
# arborescence de travail -> index
git add file
git rm file
git mv old new
# index -> dépôt
git commit
git write-tree # plomberie
# dépôt -> index
git reset <commit>
git read-tree <tree>
# dépôt -> arborescence de travail (et généralement index)
git checkout <commit> -- file
git restore --source <commit> file
git switch <branch>
Les quatre diffs
Vous pouvez comparer n'importe quelles deux zones :
git diff # arborescence de travail vs index
git diff --staged # index vs HEAD
git diff HEAD # arborescence de travail vs HEAD
git diff main feature # dépôt vs dépôt
Status décodé
git status -s
# XY filename
# X = statut index, Y = statut arborescence de travail
# M modifié, A ajouté, D supprimé, R renommé, ?? non suivi
Par exemple MM signifie modifié à la fois dans l'index et l'arborescence de travail (vous avez stagé un changement puis édité encore).
Reset, restore, checkout
Chacun affecte différentes zones :
git reset --soft: seulement le dépôt (déplacer la ref).git reset(mixed) : dépôt + index.git reset --hard: dépôt + index + arborescence de travail.git restore --staged: index depuis HEAD.git restore: arborescence de travail depuis l'index.git restore --source=<commit>: arborescence de travail (et optionnellement index) depuis un commit spécifique.
Un exercice
echo a > f.txt
git add f.txt
git commit -m "v1"
echo b >> f.txt
git add f.txt
echo c >> f.txt
git status
git diff
git diff --staged
git diff HEAD
Lisez chaque diff ; comprendre pourquoi ils diffèrent cimente le modèle.
Plomberie pour chaque zone
Connaître la plomberie pour chaque zone démystifie les commandes de plus haut niveau :
- Arborescence de travail : opérations ordinaires de système de fichiers.
- Index :
git update-index,git ls-files,git read-tree,git write-tree. - Base de données d'objets :
git hash-object,git cat-file,git mktree,git commit-tree. - Refs :
git update-ref,git symbolic-ref,git for-each-ref.
git ls-files --stage # index
git ls-tree HEAD # dépôt
ls -R # arborescence de travail
Erreurs fréquentes
Essayer de mémoriser les commandes au lieu des zones ; une fois que vous savez quelle zone est la source et laquelle est la destination, la bonne commande est évidente. Confondre git restore file avec git checkout file ; ils sont équivalents pour ce cas, mais les nombreux autres modes de checkout déroutent les nouveaux utilisateurs. Utiliser git reset --hard pour « nettoyer » sans réaliser que cela détruit l'arborescence de travail. Et enfin, attendre que git commit inclue les éditions non stagées ; il ne le fait pas (sauf si vous passez -a pour les fichiers suivis seulement).