Un commit est un instantané de la zone d'index ou zone d'assemblage (staging area). La zone d'index est hors du répertoire de travail. Seuls les fichiers et dossiers présents dans la zone d'index seront enregistrés en l’état lors du commit.
Worflow:
Pour illustrer les commandes, un dépôt avec le contenu suivant est créé:
/tmp/hello-git.git/ ├── readme.txt └── src ├── A.c ├── B.c └── C.c
La commande git status permet de voir le contenu de la zone d'index, l'option -s résume le statut de chaque fichier:
$ git status -s ?? readme.txt ?? src/
Les points d'interrogations indique que le répertoire ./src et le fichier ./readme.txt ne sont pas suivis par git pour le moment.
L'index ou staging area est un espace d'assemblage permettant de préparer le commit. On sélectionne le travail que l'on souhaite historiser.
Ajouter un dossier dans l'index implique l'ajout de tout son contenu:
# Ajoute le dossier src à l'index git add src/ # Le listing du contenu de l'index # retourne le dossier et tout son contenu git st A src/A.c A src/B.c A src/C.c ?? readme.tx
Ici, le 'A' en préfixe indique que les fichiers contenus dans src sont ajoutés à l'index.
Pour n'ajouter à l'index que les fichiers déjà suivis et modifiés dans l'espace de travail:
$ git add -u
Ajouter à l'index les fichiers non suivis et les fichiers modifiés:
$ git add . $ git st A readme.txt A src/A.c A src/B.c A src/C.c
Lorsque des modifications sont apportées à plusieurs endroits dans un même fichier, on peut vouloir pousser dans l'index qu'une partie d' entre elles mais pas toutes.
C'est ce que permet de faire l'option -p
ou --patch
de la commande git add:
# Plusieurs modifications ont été apportées en même temps # au fichiers "config.py". On ne va sélectionner qu'une # sous partie pour le prochain commit git add --patch fairymaps/config.py
La commande bascule en mode interactif, pour chaque section modifiée git demande à l'utilisateur ce qu'il souhaite faire (saisir '?' pour afficher l'aide) :
(1/1) Indexer cette section [y,n,q,a,d,s,e,?] ?
y - indexer cette section n - ne pas indexer cette section q - quitter ; ne pas indexer cette section ni les autres restantes a - indexer cette section et toutes les suivantes de ce fichier d - ne pas indexer cette section ni les suivantes de ce fichier s - découper la section en sections plus petites e - éditer manuellement la section actuelle ? - afficher l'aide
Via le mode interactif, l'utilisateur peut choisir les sections qu'il souhaite intégrer à la zone d'assemblage ou redécouper les sections disponibles pour choisir finement quelles modifications apportées dans le fichier seront sauvegardées par le prochain commit.
Les fichiers .gitignore permettent de définir des patterns d'exclusion. Lors des appels à la commande git add, le fichier .gitignore est évalué et les fichiers correspondants aux patterns présents ne sont pas ajoutés à l'index. On peut néanmoins forcer l'ajout à l'index avec l'argument -f
$ git add -f ./build/A.o
Il peut y avoir de multiples fichiers .gitignore dans répertoire du projet. Pour tester si un fichier est bien exclus:
$ git check-ignore -v build/B.o .gitignore:2:*.o build/B.o
Dans cet exemple la commande retourne que le fichier “B.o” est ignoré par la règle de la ligne 2.
La commande git reset permet de retirer un fichier de la zone d'index:
$ git reset dossier/fichier
Pour supprimer un fichier on peut également utiliser git rm
git rm --cached dossier/fichier
Pour retirer tous les fichiers présents dans la zone d'index en conservant le répertoire de travail:
# équivalent pleinement qualifié du comportement par défaut $ git reset --mixed # comportement par défaut retirant tous les fichiers/dossiers de la staging area $ git reset
Pour annuler les modifications faites sur un fichier du répertoire de travail et le restaurer tel qu'il était lors du dernier commit
$ git checkout -- fichier