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)
- S
2
.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:
- Ajouter des modifications avec
git add
; - 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 fairegit 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.