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)
- 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 : 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:
- 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:
$ 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 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 permet de m’aider lorsque je pers la mémoire et m’aide à la retrouver ?