Système de contrôle de Version

October 15, 2025

Système de contrôle de Version ( Version Control System VCS )

Afin de pouvoir contrôlé l’évolution de notre base de code, nous allons utiliser le VCS le plus connue dans le monde du dévellopement appellé git. Cette outil à été créer par Linus Torval, qui est le fondateur du logiciel le plus utiliser au monde, le noyaux Linux.

Dépot local ( local repositor )

Commencons par créer un dépot de code local pour suivre l’évolution du contenue d’un dossier ( folder ) local grace à la commande init.

$ git init
Initialized empty Git repository in /Users/fabian/Dépot/cours-git/.git/

Comme le montre la réponse à notre commande, nous avons initializé un dépot git vide dans le dossier actuel. C’est information on été ajouter dans un dossier caché .git contenue dans le dossier.

À tout moment, il est possible de voir l’état de notre dépot grace à la commande status

$ git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

Nous voyons ici que nous sommes sur la branche main, qu’il n’y a pas de commits et qu’il n’y a rien pour à commit.

:::info: celon les versions de git, la branche par default peut s’appeller master ou main. :::

Un commit, est l’engagement horodaté d’une personne sur l’état d’un code. Pour pouvoir fair un commit, il faut configuré git afin de lui dire qui nous somme. Pour cela nous pouvons utiliser la command config.

$ git config --global user.email <YOUR_EMAIL>
# commande silencieuse, pour vérifier la bonne configuration `git config --global user.email`
$ git config --global user.name <YOUR_NAME>
# commande silencieuse, pour vérifier la bonne configuration `git config --global user.name`

:::waring: si vous voulez utiliser des espaces dans votre nome, n’oublier pas de mettre des gillemets afin d’avoir un seul argument pour la configuration de la varraible. :::

commits

créer un fichier Readme.md afin d’expliquer le but du projet.

$ touche Readme.md
# le fichier à été créer de manière silencieuse, sans écrire aucune information dans l'entré de sortie standard stout. 
# si vous voulez être sur que le fichier est bien présent vous pouvez utiliser la commande ls
$ ls
Readme.md

:::info markdown est un language balise très utilier dans le monde de l’informatique, particulièrement dans pour la documentation. Les fichiers utilisans se language on un extention .md. :::

Avant de modifier le contenue du fichier, nous allons utiliser git en mode interactif afin de commencé à suivre ce fichier.

$ git add Readme.md
# Interface interactive

:::warning: Il fortement d’éconseiller de donné le chemin d’un dossier avec la commande add afin d’évité d’importé des fichiers non voulue comportant des informations senssible tel que des clefs de chiffrement. NE PAS FAIRE git add .. :::

Vous pouvez ouvire votre éditeur préférer afin de modifier le contenue de fichier.

code .

Ajouté le contenue suivant:

# Influance de la viande sur l'emprise au sol

Nous allons faire un logiciel permettant d'estimer notre emprise au sol à partir d'un questionnaire.
Pour le faire directement en ligne de commande vous pouvez utiliser la commande `echo` en redirigent le flux standard de sortie du programe vers le fichier grace à l'opérateur de redirection `>`.
$ echo "# Influance de la viande sur l'emprise au sol" > Readme.md
$ echo "" >> Readme.md
$ echo "Nous allons faire un logiciel permettant d'estimer notre emprise au sol à partir d'un questionnaire." >> Readme.md
# stdout est redirigé vers le fichier Read.md

Si nous regardons l’état de notre dépôt grâce à la commande status

$ git status
On branch main

No commits yet

Changes to be committed:
    (use "git rm --cached <file>..." to unstage)
        new file:   Readme.md

Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git restore <file>..." to discard changes in working directory)
        modified:   Readme.md

Nous voyons qu’il y a eu des modification sur les fichier Readme qui non pas encoré été séléctionné. A l’aide de l’option patch de la command add de git, nous allons pouvoir choisir les changements que nous voulons suivre.

$ git add -p
Command interactive

Nous somme à présent prêt à nous engager sur le programme que nous avons écrit (facile, puis que pour l’instant on à à peine commencé la documentation, en serat-il autrement quand il sera vraiment le temps de programmer ? :sweat_smile:) en utilisant la commande commit.

git commit -m "init(doc): add readme to explain project"

Notre commit à été ajouté. A tout moment nous pouvons le voir l’historique des commits grâce à la commande log

$ git log
commit 73a9e32bd867688b184c8c99ed010ca52a0aa0b5 (HEAD -> main)
Author: fabian <lapotrefabian@gmail.com>
Date:   Mon Aug 26 21:41:25 2024 +0200

    init(doc): add readme to explaine project

Branche

Avant de commancé à dévelloper notre logiciel, nous allons changé de branche. En effet, une bonne pratique est de guardé la branche principal ( main ) toujours avec un code fonctionnel et validé hors l’ajout de fonctionnalité est souvent source d’ajout de bug.

Pour changé de branche, nous allons utiliser la commande branch et utiliser l’option --create pour lui dire de créer la branche.

$ git switch -c feat-ajout-fonction-reponse-utilisateur-oui-non
Switched to a new branch 'feat-ajout-fonction-reponse-utilisateur-oui-non'

vous avez maintenant plussieurs branch que vous pouvez voir grâce à l’option --list

$ git --no-pager branch --list
# list les branch que vous avez en local

Ajoutons la fonction char yes_or_no(const char *); qui demande à l’utilisateur de répondre par you n jusqu’à optenir l’un de c’est deux et renvoyé ce résultat.

char yes_or_no(const char *question) {
    char reponse;
    do {
        printf("%s (y/n): ", question);
        reponse = getchar();
        // Consomme les caractères restants dans le buffer d'entrée
        while (getchar() != '\n');
        // Convertit la réponse en minuscule pour comparaison
        reponse = tolower(reponse);
    } while (reponse != 'y' && reponse != 'n');

    return reponse;
}

:::info Pour ne pas a avoir à taper la même commande à chaque fois que vous voulez compiler vôtre code, vous pouvez créer un Makefile.

cible: dependance
    commandes

:::

Un système de contrôle de version logiciel est fait pour versionné le code source du programme. Il faut donc éviter de poussé d’autre information que le code du programme. Par exemple, il est déconseillé de poussé un executable pour plussieurs raison:

  1. C’est executable sera lié à l’environement de dévellopement de la machine qui l’aura construit. Ainsi, un executable fait sur une architecture x86 (la plus par de PC) ne pourra pas être executer sur une architecture ARM (BeagleBone).
  2. Il ne sera pas possible de connaitre la version du code utiliser pour compiler cette executable.

Git propose donc de listé les fichiers que nous ne voulons pas suivre dans un fichier caché nomé gitignore

$ touch .gitignore # création d'un fichier caché (commençant par .)
$ echo <NOM_DE_L_EXECUTABLE> >> .gitignore # la commande echo affiche sont argument dans stdin et >> redirige stdin à la fin du fichier
# Nous aurions pu faire uniquement la command echo car la redirection créer automatiquement le fichier dans lequel stdin et rediriger si celui-ci n'exist pas

Après avoir testé notre fonction, nous pouvons fusionner le travail que nous avons fait dans la branch principale main. Pour cela, il faut retourné sur cette branch et utiliser la commande merge.

$ git switch main
Switched to branch 'main'
$ git merge <NOM_DE_LA_BRANCHE>
# vous pouvez utiliser la touche tab après avoir écrire la première lettre de vôtre branche pour avoir l'auto completion.
# deux tab permet d'avoir l'ensemble des choix possible TODO: voir si la completion fonction bien sur windows

nous pouvons désormé supprimer notre branche

$ git branch -d <NOM_DE_LA_BRANCHE>
Deleted branch feat-ajout-fonction-reponse-utilisateur-oui-non (was 356790c).

Dépôt distan

Depuis le début, nous avons utilisé un dépot local sur notre ordinateur pour versionné le code source de notre programme. Hors lors que nous faison un dévellopement logiciel, cela implique très souvent de nombreuses personne. Nous allons donc pousser notre dépôt local sur un dépot distant afin que d’autre dévellopeur puisse participé au dévellopement du programme.

Nous allons utiliser gitlab, un logiciel libre de forge basé sur git proposant les fonctionnalités de wiki, un système de suivi des bugs, l’intégration continue et la livraison continue.

Pour cela, créer un compte sur gitlab.com.

Pour calculé l’empreinte sol, nous avons besoin des informations suivantes:

  • Consomationde
    • viande
      • bovine
      • porcine
      • ovine
      • aviaire
    • céréale
    • légumineuse
    • légume
Manger vous de la viande ? 

Si oui,
Quelle quantité de viande bovine manger par semaine en gramme ? 
Quelle quantité de viande porcine manger vous par semaine en gramme ?
Quelle quantité de viande ovine manger vous par semaine en gramme ?
Quelle quantité de viande aviaire manger vous par semaine en gramme ?

Manger vous des produit laitier ?
Si oui,
Quelle quantité en gramme ?

Manger vous des céréales ?
Si oui,
Quelle quantité en gramme ?

Manger vous des légumineuse ?
Si oui,
Quelle quantité en gramme ?

Manger vous des légume ?
Si oui,
Quelle quantité en gramme ?