INF3135_H2021

Construction et maintenance de logiciels (langage C)

View project on GitHub

Atelier 05: Git avancé

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 et la branche atelier 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 : Construire sur des bases solides

## 0 - Stratégies de développement

Pas toujours facile de faire des choses simples. Pourquoi ? Il est important de maintenir la connaissance. Oublier rallonge le temps de réalisation et crée de l’anxiété. Vous, en tant que programmeur allez toujours faire la même chose, peu importe le programme ou le langage.

  • Ouvrir un éditeur
  • Créer des variables, les initialiser, les affecter
  • Utiliser des structures des contrôles

Toujours garder cela simple et ne jamais tenter de faire deux choses en même temps. Sinon la confusion s’installe. Il serait avantageux de lister les étapes que vous avez à produire. Ceci afin de suivre un plan établi et de le compléter rapidement. Comme une stratégie de course. À la prochaine course, vous pourrez changer de stratégie (méthode) si ça n’a pas fonctionné. La rétrospective est essentiel pour progresser. Les sportifs utilise la vidéo pour faire le FIND IT, FIX IT and FORGET THE MISTAKE.

Vous devez faire parreil, une erreur pas grave! Faire une erreur une fois c’est une erreur, le faire deux fois c’est une mauvaise habitude. La prise de décision est importante, elle dit qui nous sommes.

Le RÉSULTAT provient de l’amalgame de : la connaissance, le dynamisme et l'intelligence. Une bonne dose de chacun.

Vous êtes dans ma classe donc vous êtes capable. Montrez votre valeur. On ne lâche pas.

1 - 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/

Note: Il n’est pas nécessaire de compléter les exercices suivants dans cette séance, mais il est encouragé de venir les consulter chaque fois que vous souhaitez apporter des modifications à vos commits


2 - 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
  • Avec la commande git stash

D’autres exemples sont fournis dans la documentation.

3 - 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:

$ nano 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 

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

4 - Rappel des 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 m’aide lorsque je pers la mémoire et m’aide à la retrouver ?
  • Q6. Que fait la commande git stash concrètement ?

5 - Arguments de la ligne de commande (noté)

Aujourd’hui les arguments de la ligne de commande. Vous devez faire un programme nommé cmd.c qui traite et affiche les arguments de la ligne de commande. Un Makefile est requis. La branche atelier05 doit exister. Un fichier .gitignore doit exister. Les fichiers .o et binaire ne doivent pas être dans le dépôt distant. Compilation sans avertissement de vos sources avec make et make cmd est exigée. Les options GCC suivantes sont exigées -O2 -Wall -Wextra -Werror=vla -pedantic. Votre programme doit être en mesure de s’exécuter et sera évaluer avec :

./cmd "je suis en mesure" de faire de bons programmes
./cmd Quebec est une ville universitaire sans pollution et "en europe nous avons du foot de qualite"

Vous devez faire les 3 transformations suivantes

  • produire les arguments de 0 à n selon l’exemple A
  • inverser les arguments entre 1 et N selon l’exemple B
  • inverser les lettres dans les arguments de 1 a N selon l’exemple C

Exemple A

argv[0] : ./cmd
argv[1] : je suis en mesure
argv[2] : de
...

Exemple B

programmes bons de faire de je suis en mesure
...

Exemple C

erusem ne sius ej ed eriaf ed snob semmargorp
...

Remise

Vous devez travailler avec le gestionnaire de version git et GitHub. Il est important de faire une demande de collaboration à JocelynBedard pour que votre travail soit récupéré. Votre dépôt doit être nommé inf3135-h2021 en minuscule. Utiliser la branche appropriée pour pousser vos fichiers dans le gestionnaire de version. Vous ne devez jamais pousser des fichiers binaires dans votre gestionnaire de version.

Toujours inclure dans tous vos livrables un fichier nommé cp.txt qui contient uniquement votre code permanent en majuscule.

Vous avez jusqu’a 22h59 le jour de l’atelier pour faire la remise du travail. Le travail sera noté sur 10 et compte pour 5% de la session.

FIN.