Initiation à Git

Git est un gestionnaire de versions. Il permet de sauvegarder différentes versions d'un code. Git est beaucoup plus puissant que ce que l'on va voir là. Commençons par simple.

⌛ Git permet d'avoir des branches pour gérer plusieurs versions d'un logiciel en parallèle, par exemple pour ajouter des nouvelles fonctionnalités. On verra ça plus tard.

Pourquoi ?

Eviter un enfer de fichiers

On peut éviter de se mélanger les pinceaux 🖌🖌🖌 dans les versions de fichier :

🖹 programme.c
🖹 programme (v2).c
🖹 programme (v3).c
🖹 programme (v3 essai avec DFS).c
🖹 programme (v3 essai avec BFS).c

A plusieurs, on éviter de s'envoyer des mails et de se tromper dans la version du fichier, ou de modifier à la main des parties d'un fichier. On veut éviter de devoir manuellement intégrer des modifications de différentes personnes.

🖹 programme.c
🖹 programme (v2).c
🖹 programme (v3 par Patrick).c
🖹 programme (v3 par Julia).c  
🖹 dijkstra.c
🖹 dijkstra (v2 par Julia).c
🖹 dijkstra (v3 correction mineure par Jenny).c
🖹 dijkstra (v3 par Julia).c
🖹 dijkstra (v3 par Julia) Copie de sécurité.c

Travailler de manière isolé

Vous travaillez à plusieurs, mais tu es en train d'ajouter une fonctionalité, et tu ne veux pas perturber le travail des autres.

Pour cela, git offre un mécanisme de branches. ⌛ On verra ces notions un autre jour !

Aspects sociaux

  • Le projet peut être rendu visible pour d'autres personnes qui peuvent rejoindre le projet.
  • On peut reporter des bugs et des propositions de nouvelles idées sur la plate-forme commune sans devoir s'envoyer des mails.

Aspects historiques

On peut faire de l'archéologie logicielle.

  • Quelle était la raison de cette ligne de code ? Qui l'a écrit ? Quand ?
  • Sur quelle partie du logiciel a travaillé Patrick ?
  • Depuis quand les tests unitaires sur dijkstra ne fonctionne plus ?

Pourquoi un outil décentralisé ?

L'outil git est décentralisé. C'est bien car on peut travailler dans le train, quand il n'y a pas de réseau. On peut faire des commits (c'est-à-dire estampiller des modifications) sans connexion Internet.

Serveur distant

Ici, on utilisera https://gitlab.aliens-lyon.fr/. C'est là-bas que sera vos dépôts (appelé projets dans gitlab). Un dépôt est un ensemble de code source avec tout son historique de versions.

Créer une clé

Le plus simple pour se connecter à un dépôt (et éviter de taper un mot de passe toutes les 5 secondes et demi) est d'utiliser une clé SSH. Pour en créer, tapez cette commande :

ssh-keygen -t rsa -b 4096

Elle génère deux fichiers :

  • une clef privée id_rsa (ne jamais donner/montrer ce fichier !)
  • une clef publique id_rsa.pub

Dans github, gitlab, copier la clef publique (attention, pas la clef privée !). Dans gitlab Aliens c'est ici : https://gitlab.aliens-lyon.fr/-/user_settings/ssh_keys.

Créer un dépôt

Depuis https://gitlab.aliens-lyon.fr/projects/new, vous pouvez créer un dépôt.

Récupérer le contenu sur votre ordinateur

La récupération d'un dépôt distant sur votre ordi s'appelle clone. Dans la page web de votre projet (i.e. dépôt), copier l'URL :

Si vous avez une clef SSH, votre vie est plus simple : pas besoin de taper un mot de passe à chaque fois. Avec HTTPS, il faudra taper un mot de passe à chaque commande.

Sur votre ordinateur dans le dossier de votre choix, taper :

git clone [url]

Exemple :

git clone git@github.com:tableaunoir/tableaunoir.git

Créer un dépôt local

On peut aussi créer un dépôt entièrement en local. Pour créer un dépôt vide depuis rien du tout et connecté à rien du tout sur Internet :

git init <nomduprojet>

Exemple :

git init superlogiciel

Mon premier commit

La vie d'un logiciel est une pièce de théâtre où les fichiers sont des acteurs. Un commit est une estampille, des données "tamponnées", prise en photos de certains fichiers du projet. Souvent ça correspond à une étape dans la création d'un logiciel :

  • génération d'un labyrinthe
  • déplacement de la balle implémentée
  • correction du bug de déplacement du vaisseau
🗎
🗎
🗎
🗎

Fichiers non versionnés, jamais

Les fichiers d'un dossier ne sont pas tous versionnés, i.e. incorporés à un commit ! Par exemple, il est hors de question de versionner des fichiers temporaires ou des fichiers exécutables :

🖹 infos.log
🖹 fichiertemporaire.aux
🖹 monprogramme.exe

Eux ne participent jamais à la pièce de théâtre. Ils sont untracked.

Au contraire, il faut versionner les fichiers sources par exemple :

🖹 balle.c
🖹 vaisseau.h
🖹 vaisseau.c

Pour dire que des fichiers doivent être maintenus et versionné au prochain commit, on les ajoute à la scène (et du même coup au projet) :

git add <fichier>

Exemple :

git add *.tex
git add dijkstra.c

Pour commiter (estampiller / prendre en photos) les fichiers explicitement ajoutés, i.e. les fichiers sur scène :

git commit -m "message"

Pour commiter les fichiers modifiés qui ont déjà été versionné un jour :

git commit -am "message"

Là on prend carrément en photo tous les acteurs de la pièce de théâtre.

Définitions.

  • untracked signifie que les fichiers ne sont pas versionnés du tout. Ce ne sont même pas des acteurs de la pièce de théâtre.
  • staging area/tracked/index (mis en scène) parle des fichiers qui vont être versionnés quand on fait un commit. Ce sont les acteurs sur scène.
  • not staged parle des fichiers qui sont a priori versionnés mais dont on a pas explicitement dit qu'ils allaient être versionnés au prochain commit. Ce sont les acteurs de la pièce, mais ils ne sont pas sur scène en ce moment.

Suppression et renommage de fichiers

Pour renommer un fichier :

git mv [nom-fichier-courant] [nouveau-nom]

Pour supprimer un fichier :

git rm [fichier]

Pour supprimer un fichier du dépôt mais pas du système de fichier (i.e. un fichier du projet arrête de l'être. Un acteur est viré !) :

git rm --cached [fichier]

Gérer le serveur distant

Pour télécharger les données du serveur vers mon ordinateur :

git pull

Pour poster nos modifications sur le serveur :

git push

Obtenir des informations sur le dépôt

Lister les nouveaux fichiers et à commiter :

  git status

Idée générale

Commandes principales

Pour faire çaIl faut taper ça
Pour récupérer du code du serveur XXXXgit clone XXXXX
Pour dire que le fichier dijkstra.c doit être versionnégit add dijkstra.c
Pour estampiller mes fichiersgit commit -a -m "algorithme Dijkstra"
Pour mettre mes modifications sur le serveurgit push
Pour récupérer les modifications des autres depuis le serveurgit pull

Quiz

  • Quelle est la différence entre upstream et origin ?
  • Quelles est la différence entre workspace, index et local repository ?
  • A-t-on besoin d'une connexion Internet pour faire un git commit ?