Git & GitHub : Enregistrer les Modifications (Commits)

Enregistrez des versions cohérentes et traçables de votre projet en créant des commits avec Git.

Icône de calendrier
Débutant
5 chapitres

Commits : valider ses modifications

Qu’est-ce qu’un commit ?

Un commit Git est une capture instantanée (« snapshot ») des modifications indexées dans la staging area.

Ce commit contient une version du code source et pourra par la suite être envoyé au dépôt distant.

L’historique de Git est structuré sous forme d’arborescence de commits : chaque commit pointe vers un commit parent (ou plusieurs après une fusion). Cette représentation visuelle permet de suivre l’évolution du projet au fil du temps.

Schéma Git : de la Staging Area à l'historique de Commits
Schéma Git : de la Staging Area à l'historique de Commits

Chaque commit est constitué de :

  • Snapshot : une capture instantanée de l’état des fichiers à un moment donné (correspondant à la staging area, au moment du commit).
  • Message : un message descriptif expliquant les modifications effectuées dans le commit (exemple : “Mise en forme de la navbar”)
  • Métadonnées (auteur et date du commit) : des métadonnées sont automatiquement associées au commit telles que son auteur (nom + adresse email définie via la commande git config) et la date à laquelle il a été généré.

Un commit Git est identifié par un hachage SHA-1 (Secure Hash Algorithm 1) qui est une chaîne hexadécimale de 40 caractères. Ce hachage est généré en fonction des données associées au commit, notamment les modifications apportées aux fichiers, le message de commit, l’auteur, la date du commit et les références aux commits parents.

Voici un exemple de commit :

commit 29a19ffb185f7486d9326d0286f0e27fefc6bc8a (HEAD -> main)
Author: Thibaud d'Arros <[email protected]>
Date: Wed Apr 10 13:29:18 2024 +0200

Ajout du moteur de recherche

Créer un commit

Pour créer un commit, on exécute la commande git commit, en y précisant un message descriptif associé avec le flag -m :

copié !
git commit -m "Ajout du moteur de recherche"

Modifier le dernier commit

Si vous souhaitez modifier le dernier commit, vous avez la possibilité d’écraser le dernier commit en réexécutant la commande git commit, mais cette fois-ci avec le flag --amend.

Deux cas sont alors à distinguer :

Cas n°1 : je souhaite uniquement modifier le message du commit

Cela peut arriver si vous avez effectué une faute d’orthographe, si le message est peu clair, etc. Dans ce cas-là, effectuez directement un :

copié !
git commit -m "Mon nouveau message" --amend
Cas n°2 : je souhaite modifier les fichiers du commit

Cela peut arriver si vous avez oublié d’ajouter/de supprimer un fichier dans la staging area ou effectué une modification mineure corrective sur un fichier, après la génération du commit.

Dans ces cas-là :

  1. Mettez à jour votre staging area classiquement avec les commandes git add et/ou git restore --staged.
  2. Effectuez un nouveau commit avec --amend :
copié !
git commit -m "Mon message" --amend

Revenir à un commit ultérieur

Le commit actif d’une branche est défini par le HEAD (la tête) de cette dernière.

Par défaut, le HEAD d’une branche pointe vers le dernier commit généré.

Dans le cas où vous souhaitez revenir à une version précédente de votre projet, il est alors possible de déplacer le HEAD de la branche vers un autre commit en faisant usage de la commande git reset suivie de l’identifiant SHA-1 du commit en question. Cela aura pour effet de modifier l’historique du projet.

copié !
git reset <id-commit>

Par exemple : git reset 29a19ffb185f7486d9326d0286f0e27fefc6bc8a

Cette commande va se comporter de 3 manières différentes, en fonction du flag spécifié.

  • --soft : Déplacement vers le commit spécifié tout en conservant les modifications dans la staging area. Cela signifie que les modifications ne sont pas perdues et peuvent être réenregistrées.
  • --mixed : Déplacement vers le commit spécifié en mettant les modifications dans la working directory. Cela signifie que les modifications sont retirées de la zone de mise en scène mais restent dans les fichiers locaux.
  • --hard : Déplacement vers le commit spécifié et supprime toutes les modifications locales, les ramenant à l’état du commit. Cela signifie que toutes les modifications non enregistrées sont perdues.

Historique

Historique des commits

Si vous souhaitez visualiser l’historique des commits effectués sur la branche courante, vous pouvez exécuter la commande git log :

copié !
git log

Cette commande affichera les commits du plus récent au plus ancien.

Historique de modifications depuis le dernier commit

Il est possible de comparer les modifications non encore indexées (celles qui n’ont pas encore été ajoutées à la staging area) avec le dernier commit généré.

Pour cela, on tape la commande :

copié !
git diff

La commande git diff permet de voir les changements apportés à l’ensemble des fichiers, depuis le dernier commit.

copié !
git diff <nom-fichier>

La commande git diff <nom-fichier> permet de voir les changements apportés à un fichier spécifique, depuis le dernier commit.

Fichier .gitignore

Le fichier caché 📄 .gitignore est largement utilisé dans un dépôt Git car il permet de spécifier les fichiers et répertoires que vous souhaitez exclure du suivi Git (et donc par extension de vos commits).

Il permet ainsi d’ignorer :

  1. Des fichiers spécifiques
  2. Des types de fichiers (Exemple : .log, .pdf…)
  3. Des dossiers spécifiques (et leur contenu par extension)

Cela s’avère très utile pour, par exemple, éviter d’envoyer sur le repo distant :

  • Des informations sensibles et/ou personnelles (tel que le contenu d’un fichier 📄 .env)
  • Le code source de bibliothèques qui peuvent être générées via des lignes de commande (par exemple le dossier 📂 node_modules dans l’écosystème JS, 📂 vendor avec le framework Symfony).
  • Etc.

Voici quelques exemples de règles courantes à mettre dans votre 📄 .gitignore :

Ignorer un fichier spécifique
.gitignore
copié !
nom-du-fichier.txt
Ignorer tous les fichiers avec une extension donnée

Pour ignorer les fichiers ayant l’extension .log :

.gitignore
copié !
*.log
Ignorer un dossier entier

Pour ignorer un répertoire nommé 📂 node_modules ou encore 📂 vendor :

.gitignore
copié !
node_modules/
vendor/

Le caractère ! avant une règle permet quant à lui d’affiner les règles de filtrage excluant du 📄 .gitignore un fichier ou répertoire précédemment ignoré.

Dans l’exemple ci-dessous, on ignore tous les fichiers markdown .md, sauf le fichier 📄 readme.md.

.gitignore
copié !
*.md
!readme.md

Après avoir spécifié les règles de filtrage dans le fichier 📄 .gitignore, enregistrez-le. Ensuite, effectuez un commit pour ajouter le fichier 📄 .gitignore au référentiel Git.

copié !
git add .gitignore
git commit -m "Ajout du fichier .gitignore"

Dorénavant, les fichiers spécifiés dans 📄 .gitignore seront automatiquement exclus du prochain commit.

Ainsi, les fichiers et dossiers spécifiés dans 📄 .gitignore ne seront pas ajoutés à la staging area par un git add.