INF3135_H2021

Construction et maintenance de logiciels (langage C)

View project on GitHub

Atelier 02: Git, monPremier.c

Note : (facultatif) S’il y a des questions dans ce labo, répondez y dans un fichier nommé ./labo/reponse-labo-XX.md. XX étant le numéro de l’atelier. Le fichier doit être dans un format Markdown. Utiliser un projet privé nommé inf3135-h2021 pour déposer le fichier demandé. Utiliser le même format de fichier pour tous les exercices.

Format du fichier Markdown
  • Atelier {01..08} (Header 1)
  • Exercice {1..n} (H2)
  • Question {1..n} (H4)
  • S2.E3.Q1 (strong) est une valeur qui change bien sûr
  • La réponse dans une section script (code block)

Note: Il est recommandé de versionner vos réponses aux exercices à l’aide de Git (en ligne de commande). Un seul dépôt est amplement suffisant pour tous les laboratoires.

Pourquoi versionner vos exercices avec Git: afin de vous entraîner à utiliser le logiciel (les commandes) naturellement. —-

Objectif de l’atelier : Devenir un pro dans l’environnement Linux et Git

0 - Préparation avant de commencer

Pas besoin de vous dire qu’à cette étape vous êtes déjà connecté au serveur java.labunix.uqam.ca (Ubuntu depuis 2020). Il serait important de penser à une stratégie de répertoire afin de garder vos fichiers dans une structure adéquate. Des répertoires sont nécessaires pour ne pas mettre tout au même endroit. Les commandes : cd, mkdir, ls et rm sont utiles pour réaliser cette question.

$ cd
$ mkdir inf3135 ; cd inf313*
$ mkdir atelier
$ cd atelier/

1 - Mon premier programme C

Une fois la structure de fichier en place, vous allez créer votre premier programme C. Nommez le fichier monPremier.c. Éditez le fichier avec les lignes suivantes.

// version 1a
int main() {

  return 0;
}

il est aussi possible de faire ceci :

//version 1b
int main(int argc, char * argv[]) {

  return 0;
}

Pour compiler un programme en C utiliser la commande suivante : gcc monPremier.c un fichier a.out sera créé.

Mais que fait ce programme ? Étant donné que vous êtes très audacieux et des pros en Java, nous allons faire un petit peu plus. Maintenant, ajoutons un message qui sera affiché sur la sortie standard. Quelles sont les modifications nécessaires selon vous pour y arriver ? Si vous avez pensé aux modifications qui suivent, vous êtes bons.

//version 1c
#include <stdio.h>
int main() {

  int variable;
  printf("mon premier point c\n");

  return 0;
}

Compiler le code source avec la commande suivante : gcc -Wall -std=c11 monPremier.c et lancer le binaire généré.

Questions :

  • Q1. Expliquer la différence entre la version 1a et la version 1b, quelle est son rôle ?
  • Q2. Est-ce que la compilation de la version 1c est un succès, et silencieuse ?
  • Q3. Comment lancer, exécuté le fichier binaire après la compilation ?
  • Q3. Avez-vous corrigé les avertissements ? À quoi sont-ils dus ?
  • Q4. À quoi sert la ligne #include <stdio.h> dans la version 1c selon vous ?

2 - Ignorer des fichiers avec Git

Il est crucial d’ignorer les fichiers inutiles lorsqu’on suit l’évolution d’un projet avec Git, notamment les fichiers binaires (pas tous, mais beaucoup d’entre eux), les fichiers temporaires, les fichiers de configuration individuelle, etc.

Dans le cours, vous devrez en particulier ignorer les fichiers avec les extensions .o et .out qui sont générés par le compilateur gcc. Les fichiers et répertoires à ignorer sont spécifiés dans le fichier “.gitignore” à l’aide d’une expression régulière.

Par exemple, créez un fichier nommé “.gitignore” à la racine de votre projet.

$ nano .gitignore

Modifier le fichier pour y ajouter les choses que vous ne voulez pas gérer dans le gestionnaire de version (une expression par ligne). Par exemple, vous pourriez inclure les lignes suivantes:

# Fichiers C
*.o
*.out

# Fichiers Vim
*.swo
*.swp

# Fichiers temporaires
*.old
*.tmp
*.bak

# Exemple de répertoire à ignorer
bin/
build/

3 - Annuler des modifications avec Git

Il y a plusieurs façons d’annuler des modifications dans Git:

  • En modifiant le dernier commit grâce à la commande git commit --amend
  • En retirant des fichiers du commit en cours de construction (unstaging) grâce à la commande git reset HEAD nomFichier
  • En annulant toutes les modifications dans un fichier depuis le dernier commit.

D’autres exemples sont fournis dans la documentation.

4 - Modifier le dernier commit

La modification de commit se fait en deux étapes:

  1. Ajouter des modifications avec git add;
  2. Lancer la commande git commit --amend.

Par exemple, supposons qu’on crée un nouveau fichier LICENCE.md puis qu’on souhaite l’enregistrer:

$ vim LICENCE.md
$ git add LICENCE.md
$ git commit -m "Ajout de LICENCE.md"

Ô malheur! Nous avons fait une erreur, puisqu’en anglais, le fichier devrait plutôt s’appeler LICENSE.md (avec un S).

Pas de problème! Il suffit de renommer le fichier comme il se doit puis de modifier le dernier commit pour y ajouter les modifications:

$ mv LICENCE.md LICENSE.md
$ git rm LICENCE.md # on confirme la suppression du fichier erroné
$ git add LICENSE.md # on versionne le nouveau fichier
$ git commit --amend

Et voilà, si on regarde le contenu du dernier commit, on peut voir que le fichier créé s’apelle LICENSE.md comme si l’erreur ne s’était jamais produite.

Mise en garde:: Si vous travaillez à plusieurs personnes, il ne faut jamais modifier un commit qui a déjà été poussé sur le dépôt distant. Des collaborateurs pourraient déjà l’avoir récupéré (via la commande git pull) et s’en servir, ce qui aura pour effet de rendre vos historiques incompatibles (et donc impossibles à fusionner).

Annuler une modification ajoutée par erreur au prochain commit

Il est possible de retirer une modification ajoutée à un commit par accident. Par exemple, supposons que nous incluions par erreur le ficher a.out au prochain commit.

$ git add a.out
$ git status

Clairement, ce n’est pas une bonne idée puisqu’il s’agit d’un fichier généré et donc il ne devrait pas être partagé (il sera probablement inutilisable par les autres collaborateurs et polluera inutilement le contenu du dépôt).

Vous pouvez annuler cet ajout erroné à l’aide de la commande

$ git reset HEAD a.out

(HEAD est une “constante” spéciale qui pointe vers l’état actuel de votre projet avant modifications non enregistrées.)

Annuler des modifications apportées à un fichier

Commencez par faire quelques modifications dans votre README.md.

$ nano README.md # modifiez ou supprimez quelques lignes

Nous souhaitons maintenant annuler les modifications apportées au fichier en le remettant dans l’état où il était au dernier commit. Il est possible de récupérer le fichier qui est dans le dépôt distant avec la commande suivante :

$ git checkout -- README.md

5 - Commandes de base de Git

  • Familiarisez avec d’autres commandes de base de Git :
    • git status pour voir l’état de votre projet;
    • git diff avant de faire git add pour visualiser les modifications apportées;
    • git commit -m est un raccourci permettant de faire un commit tout en écrivant directement le message;
    • git commit -a permet de faire un commit en incluant tous les fichiers modifiés;
    • git reset --hard permet d’annuler les modifications qui n’ont pas encore été incluses dans un commit. Attention, cette opération est irréversible;
    • git log pour voir l’historique du projet;
    • git checkout pour naviguer dans l’historique du projet;
    • git show pour visualiser le “contenu” d’un commit;
    • git remote pour lister tous les dépôts distants. Si vous êtes synchronisés avec GitLab, vous devriez voir apparaître seulementorigin;
    • git remote -v donne la liste des dépôts distants avec plus d’informations (notamment l’URL où il se trouve).

Questions :

  • Q1. Quel avantage permet la commande git commit -a ?
  • Q2. Que fait la commande git mv ?
  • Q3. Que fait la commande git branch ?
  • Q4. Que fait la commande git checkout concrètement ?
  • Q5. Quelle commande permet de m’aider lorsque je pers la mémoire et m’aide à la retrouver ?

FIN.