TP GIT L1
Exercice 1: Introduction à Git
Un dépôt Git permet de:
- garder toutes les versions successives des fichiers du dossier
- partager ces fichiers avec des collègues
- gérer les conflits d’édition sur ces fichiers
- gérer des dépôts distants
- et bien d’autres choses…
Dans cet exercice, nous allons commencer à voir le premier.
Avant de créer un dépôt Git dans notre espace de travail (« workspace »), il faudra s’assurer d’avoir Git sur sa machine et de maîtriser quelques notions sur la ligne de commande Linux.
Ce TP est écrit pour des élèves ingénieurs utilisant Java et Eclipse. Selon votre statut et département, les chemins d’accès des fichiers pourraient être différents. Et vous pourriez être en train d’utiliser un autre langage et un autre environnement de développement qu’Eclipse. Donc vous devrez peut etre faire des adaptations par rapport au texte du TP.
Introduction au terminal
Git est un outil en ligne de commande. Pour l’utiliser, il faut maitriser quelques notions sur la ligne de commande Linux. Certains connaissent déjà la ligne de commande Linux et certains pas. Si vous ne l’avez pas encore utilisé, ne vous inquiétez pas, ici on va voir une petite introduction.
Les trois plateformes majeures proposent chacune une façon de lancer une interaction en ligne de commande, le terminal.
Linux
Chaque Linux est différent, mais vous pouvez typiquement lancer un terminal avec Terminal.
Windows
Si vous avez Windows, alors ouvrez Windows Powershell
, qui inclut les commandes introduites dans ce paragraphe. Pour trouver Powershell sur Windows, faites une recherche dans la barre de recherche en bas à gauche.
Mac
Le terminal du Mac se trouve dans /Applications/Utilities
.
Pour tous
Ouvrez un terminal.

Vous voyez une ligne avec le nom de la machine suivi de % et un curseur. Dans Powershell, il y a le dossier courant et > avant le curseur. Cette ligne est l’invite.
Chaque commande Linux a un nom :
ls
— pour afficher (lister) des fichiers and dossierspwd
— pour afficher le dossier courant (print working directory)cd
— pour changer de dossier
Certaines commandes ont besoin d’arguments. Par exemple, pour changer de dossier, il faut savoir où aller. On rajoute donc des arguments à la commande :
cd workspace
— pour changer vers le dossierworkspace
(dans le dossier courant, qu’on peut voir avecpwd
)cd ..
— pour changer vers le dossier parent, celui qui contient le dossier courant.- en Linux il y a deux dossiers magiques :
.
— Le dossier courant..
— Le dossier parent
- en Linux il y a deux dossiers magiques :
Essayons quelques commandes :
Tapez pwd
↵
Si vous utilisez une machine des salles de TP de l’école, ça réponde : /cal/homes/votrelogin
Dans ces TPs, nous allons utiliser le symbole → pour indiquer la réponse du système, ainsi :
Tapez pwd
↵
→ /cal/homes/votrelogin
.
Tapez ls
↵
→ Vous voyez la liste des fichiers et dossiers dans votre dossier personnel. Dans les salles de TP, on y trouvera un dossier workspace
qui est le dossier pour votre espace de travail Java, crée par défaut par Eclipse. Si vous l’avez créé ailleurs que votre dossier perso, il faudrait y naviguer avec cd
.
Tapez cd workspace
↵ pour aller dans le dossier workspace
Tapez ls
↵ pour afficher les fichiers du dossier courant
→ Vous voyez au moins un dossier tp01
Tapez cd tp01
↵
Puis ls
↵
→ Vous voyez au moins un dossier bin
et un dossier src
Tapez ls src
↵
→ Vous voyez tous les autres fichiers que vous avez créés.
Git est-il installé sur votre machine ?
Si vous êtes sur une machine d’une salle de TP, vous pouvez passer directement à la prochaine section. Sinon, il faut installer git sur votre machine.
Windows
Téléchargez Git pour Windows (site en anglais) où vous pouvez choisir soit l’exe si vous savez où le mettre, soit un setup automatique qui va gèrer tout ça pour vous.
Mac
Dans un terminal, tapez git --version
ce qui va soit vous répondre la version déjà installée soit vous proposer d’installer les Xcode Command Line Tools qui contiennent git. Installez-le le cas échéant.
Linux
Dans un terminal, si vous avez Fedora ou équivalent:
sudo dnf install git-all
Si vous avez Debian, Ubuntu ou équivalent:
sudo apt install git-all
Git: c’est parti !
Très bien, nous avons tous les éléments nécessaires pour utiliser Git en ligne de commande.
Avant tout, il faut donner quelques préférences:
- git utilise un programme ‘pager’ pour afficher des messages longs, et ça peut être assez déroutant au début, donc nous supprimons le ‘pager’
- git utilise un très vieil éditeur de texte pour les messages de commit, et nous préférons en utiliser un plus facile à utiliser pour des débutants.
- git a besoin de savoir votre nom et votre email.
Merci de taper les instructions suivantes dans le terminal, en y remplaçant votre nom et votre email.
git config --global core.pager ''
git config --global core.editor nano
git config --global user.name "votre nom"
git config --global user.email "votre@email"
Pour cet exercice, nous voulons créer un nouveau dépôt Git qui va contenir le code de notre projet. Nous voudrons ensuite y mettre le code que nous avons écrit. Puis, pour terminer, nous allons vérifier que nous avons bien créé notre dépôt Git.
Initialiser le dépôt
Créer un dépôt Git, c’est dire à Git qu’on veut qu’il puisse suivre toutes les versions et évolutions des fichiers dans un dossier et ses sous-dossiers. Pour faire cela, Git va stocker de l’information dans la racine du dépôt. Un dossier .git va apparaitre, dossier qu’il ne faudra en aucun cas modifier. Tous les outils Git reconnaissent le dossier .git, même si on ne va jamais le toucher directement.
Pour créer ce dossier .git
, placez vous dans le dossier “principal”: dans notre cas, le dossier est tp01
.
A coup de cd nomdedossier
et de cd ..
, placez vous dans le dossier /cal/homes/votrelogin/workspace/tp01
. Vérifiez à l’aide de pwd
. (NB : ce dossier pourrait être différent si vous n’êtes pas sur une machine de salle de TP ou si vous avez créé votre workspace
Eclipse ailleurs.)
Puis tapez git init
↵
→ Initialized empty Git repository in /cal/homes/votrelogin/workspace/tp01/.git
Félicitations, vous avez créé votre premier dépôt Git.
Ajouter les fichiers dans le dépôt
Pour l’instant, nous avons un dépôt Git vide.
Ceci pourrait sembler bizarre. C’est dans le dossier de notre projet Java qu’on a créé notre dépôt Git, pourquoi est-il vide ?
Avec Git, on choisit fichier par fichier ce qu’on veut mettre dans le dépôt, c’est à dire : quels sont les fichiers dont on veut suivre l’évolution des modifications.
On peut voir l’état de notre dépôt avec la commande git status
.
Tapez git status
↵
→
On branch master
Initial commit
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.classpath
.project
.settings/
bin/
src/
La signification ligne par ligne est:
- On branch master veut dire qu’on est sur la branche principale du dépôt.
- Initial commit : vous verrez que chaque fois qu’on veut enregistrer une nouvelle version, on ajoute des fichiers dans le dépôt, ça s’appelle un
commit
, et là, c’est votre premier - Changes to be committed n’est pas affiché ici mais le sera lorsqu’il y a des fichiers que vous avez rajouté et êtes prêts à committer
- Untracked files la liste des fichiers qui ne sont pas encore marqués. Ils existent sur le disque, mais ne font pas partie du dépôt Git.
Les fichiers non marqués sont des fichiers créés par eclipse et sur lesquels il est bon de passer un moment :
.classpath
: fichier de configuration d’eclipse, nécessaire pour qu’eclipse retrouve divers éléments du projet ; ce fichier est dépendant de la machine, et si vous passez de Windows à Mac ou à Linux, le .classpath pourrait ne plus fonctionner à cause des syntaxes de chemin de fichier différents entre les systèmes d’exploitation..project
: fichier de configuration d’eclipse, nécessaire pour qu’eclipse garde la mémoire des options que vous avez choisies.settings/
: dossier pour eclipse, avec en particulier les plugins installés localementbin/
: dossier contenant les fichiers java compilés (.class); ces fichiers ne doivent pas être ajoutés au dépôt.src/
: dossier contenant le code source java que vous avez créé.
Pour l’instant, nous allons mettre seulement le code source Java dans notre dépôt Git. Pour faire cela, nous utilisons la commande git add
:
Tapez git add src/tp01/HelloWorld.java
↵
Vous avez ajouté ce fichier source java dans le dépôt. Puis tapez de nouveau git status
↵
On y voit une nouvelle section avec le nouveau fichier à rajouter dans le dépôt :
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: src/tp01/HelloWorld.java
Pour l’instant, nous avons préparé une nouvelle version de notre projet, mais elle ne figure pas encore dans le dépôt Git. Il reste de signaler à Git que cette modification constitue une nouvelle version qu’on veut garder. On va donc l’enregistrer dans le dépôt avec un message qui va servir pour nous rappeler de ce qu’on a fait. Dans la terminologie Git, enregistrer une nouvelle version s’appelle faire un « commit ».
Faites alors git commit -m "message"
↵ en remplaçant message par un message pertinent (du genre, “premier commit”)
Faites maintenant git status
↵ et voyez la différence avec la réponse précédente.
Enfin, faites git log
↵ et voyez le résultat:
commit c3e097802d521508f146111d24ba8e6d677090e4
Author: votrelogin <votrelogin@c124-02.enst.fr>
Date: Wed May 9 16:39:11 2018 +0200
premier commit
Après commit, il y a un code unique d’identification. Puis votre nom, la date et le message de commit.
Si vous voulez voir les fichiers contenus dans le commit, faites:
git log --stat
Vous avez peut-être remarqué que toutes les commandes Git suivent la forme git commande
. Certaines commandes ont aussi des options, qu’on écrit avec --option
. Par exemple, vous avez vu l’option -m "message"
(qui est un raccourci pour --message="message"
). Il peut aussi être intéressant de faire git log --oneline --decorate
Dans vos git status
, les fichiers non suivis par git sont toujours présents, en rouge. Il serait utile de les masquer une fois pour toutes, en expliquant à git qu’il faut les ignorer. Cela se fait en créant dans la copie de travail un fichier .gitignore
. Ce fichier contient une spécification par ligne:
- un nom de fichier, par exemple
toto.txt
ou avec un chemin d’accès commesrc/tp/toto.txt
- un type de fichier, par exemple
*.class
- un nom de dossier, par exemple
bin/
Ce fichier doit être commit. Préparez un tel fichier, ajoutez le à git et commit.
Pour l’instant, nous avons vu les commandes :
git status
git init
git add
git commit
git log
Exercice 2
Entre les deux exercices, faites des modifications sur votre copie locale, et au moins un commit. Laissez quelques changements dans la copie de travail sans les committer.
Un court tutoriel GitLab se trouve ici
Dans cet exercice, nous allons :
- Mettre à jour le dépôt local avec notre nouvelle classe.
- Créer un dépôt distant avec GitLab.
- Générer des clés d’accès SSH pour interagir avec le dépôt distant.
- Synchroniser le dépôt local vers le dépôt distant.
Mettre à jour le dépôt local
Tout d’abord, mettez à jour votre dépôt local. Avec la commande git status
, on peut voir les nouveaux fichiers qu’on a rajouté à notre copie de travail mais qui ne sont pas encore sous Git. On voit aussi une nouvelle section décrivant les fichiers qui ont été modifiés depuis la dernière version commitée. Ces modifications non plus ne sont pas (encore) pris en charge par Git. C’est à nous de dire à Git qu’on veut les garder.
Si on veut voir ce qui a changé dans la copie de travail par rapport la dernière version sous Git, on peut utiliser la commande git diff
, ce qui affichera toutes les modifications de tous les fichiers dans le dépôt git depuis la dernière version commitée.
Maintenant que nous avons regardé ce qui a changé, rajoutez-les à une nouvelle version avec les commandes git add
et git commit
.
Quelques options utiles
git diff nom-du-fichier
— pour ne voir que les modifications au fichier indiquégit diff version-id
avec un identifiant de version (trouvé avecgit log
) — pour voir toutes les modifications depuis la version indiquée.
git diff nom-du-fichier version-id
— les deux options précédentes ensemble : vous pouvez combiner les deux pour voir toutes les modifications depuis le commit identifié par version-id pour le fichier nom-du-fichier.git commit -a
— Faire un commit pour tous les fichiers modifiés ou rajoutés avecgit add
. Souvent utilisé ensemble avec-m "message pertinent ici"
.
GitLab
GitLab est une interface web qui permet de gérer un dépôt Git distant. Il propose de nombreuses fonctionnalités telles que la gestion de documentation, le suivi de bogues, la collaboration des équipes, etc. Pour ce TP, nous n’allons utiliser que la création et gestion d’un dépôt distant.
La première chose à faire est de se connecter au GitLab : https://gitlab.telecom-paris.fr. Avec le GitLab de l’école, vous devez vous connecter en cliquant le bouton Shibboleth.
Il y a un espace dans gitlab qui est prévu pour que vous puissiez faire ce que vous voulez, faire des erreurs et apprendre. Cet espace est de la forme 2019_gr3_tp
, c’est à dire année suivie d’un caractère souligné suivi de “gr” et le numéro de votre groupe suivi d’un caractère souligné suivi de “tp”. Demandez l’accès à ce groupe, et pour ce faire, chercher le groupe dans https://gitlab.telecom-paris.fr/INF103
Une fois que vous aurez été ajouté.e dans ce groupe de TP, allez dans ce groupe. En haut de l’écran il devrait y avoir un bouton +
qui permet de créer un nouveau projet :

Puis il faut configurer le nouveau projet :
- Project Name
- Le nom du projet. Rappelons que chaque projet Java aura son propre dépôt Git. Ici, nous conseillons un nom comme
inf103-tp2-<votrenom>
. - Project description
- Si vous voulez rajouter une description du projet, n’hésitez pas. Pour ce TP, c’est pas necessaire.
- Visibility Level
- Qui peut voir le dépôt ? Nous conseillons fortement que les dépôts du cours soient
Private
afin de d’éviter le plagiat de votre travail par quelqu’un d’autre.
Puis cliquer le bouton Create Project
.
Basta ! Vous avez créé un dépôt distant pour votre TP. GitLab vous propose quelques ensembles de commandes pour mettre des contenus dans ce dépôt distant, mais on va les ignorer.
SSH
Il y a deux façons dont la commande git
peut communiquer avec votre dépôt distant : via HTTPS
ou via SSH
. La deuxième est un peu plus compliquée à mettre en place mais évite de taper son mot-de-passe à chaque fois qu’on interagit avec le dépôt distant.
Pour utiliser SSH, il faudra :
- Créer une clé SSH.
- Rajouter cette clé à votre compte GitLab.
SSH utilisent le chiffrage à clé publique. Ainsi, une clef SSH, c’est quelque chose en deux parties :
- une partie privée qui doit se trouver sur votre machine principale et qu’il faut protéger au maximum de toute copie. Ne jamais l’échanger par email, la mettre sous dropbox ou google drive… Uniquement sur votre disque personnel, et pas trop souvent sur une clef USB. Les puristes diraient: jamais sur une clef USB. Un nom courant pour la clef privée est
id_rsa
- une partie publique qui doit être présente sur les sites distants sur lesquels vous allez vous connecter. Un nom courant pour la clef publique est
id_rsa.pub
C’est la partie publique de la clé qu’on va mettre dans GitLab. Tant que vous avez la clé privée sur votre machine, la commande git
pourra communiquer avec votre dépôt distant sans mot-de-passe.
Créer une clef sur Linux ou Mac
Si vous avez déjà une clé SSH sur cette machine, vous pouvez passer à la prochaine étape.
Ouvrez un terminal.
Tapez ssh-keygen
↵
Cette commande génère une paire de clés publique/privée. Elle commence par vous demander où mettre les clés. Utilisez le défaut, tapez ↵
Ensuite, on vous demande un mot de passe pour proteger la clé. Si vous la laissez vide, vous n’auriez pas un mot de passe à taper systématiquement. En revanche, il serait primordial de protéger la clé privée — n’importe qui en possession de la clé privée aurait donc accès à vos comptes. Nous conseillons de laisser le mot de passe vide et de protéger la clé privée.
Vous trouverez la clé privée et publique dans un dossier .ssh de votre dossier principal :
Faire un ls .ssh
↵ devrait révéler les fichiers id_rsa
et id_rsa.pub
, ce dernier étant la clé publique que vous pouvez librement partager.
Afficher la clé publique en faisant cat .ssh/id_rsa.pub
↵
→
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAtlnV1GsVsEGb5odmwkmmJxs+TtuPUmmtYr4
vvl3xfovbjDRr+fgXMCgstotO6mmIzxQY5XD+yVels8ZMHHZQETu8n5mJN33BN0gXVcknra
6aOO5QPUFi+jm1Zx4fKpREwEtaEKIf8mYCoI7MM9YEfeUoAxMTn6mSgk+ozOZp36SnSB96+
EMak2v/5vgT4WRnwZ0XzAAoSR4fYEQi6/hp4L2C2hZCyYa5lflCaSMG1c/DGp0umDsnFcWo
eBickLbKkfPuJAXQH0VJlG+Gocy7jTp4mC8m46I9aX8x4DXsazO2v1FaK0VmMtGx/hOAKaU
lH3kTy4YnzJfK/fgIIsiJXw== eaganj@Frog
Puis copier la clé pour qu’on puisse la coller dans GitLab, dessous.
Créer une clef sur Windows avec PuttyGen
- Lancez PuTTYgen
- Pour “Type of key to generate”, choisissez “SSH-2 RSA”.
- Cliquez sur “Generate”.
- Bougez la souris dans la zone sous la barre de progrès. Quand il en a assez, le programme génère les clefs.
- Si vous laissez vide le champ “Key passphrase”, vous n’auriez pas un mot de passe à taper systématiquement. En revanche, il serait primordial de protéger la clé privée — n’importe qui en possession de la clé privée aurait donc accès à vos comptes. Nous conseillons de laisser le mot de passe vide et de protéger la clé privée.
- Cliquez sur “Save private key” et “Save public key”.
Sur Windows, la localisation de la clef privée est un paramètre de l’application qui l’utilise.
Rajouter la clé publique à GitLab
Vous avez créé votre paire de clés publique/privée. Il faut maintenant configurer GitLab pour associer votre clé publique à votre compte.
- En haut à droit, cliquer le menu pour votre compte, puis sélectionnez
Settings
. - Dans le menu à gauche, sélectionnez
SSH Keys
. - Collez les contenus de la clé publique dans le champs de texte “Key”.
- Saisissez un nom pour la clé. Ce nom a typiquement la forme utilisateur@_machine_. Par exemple :
eaganj@Frog
oueaganj@ENST
. - Rajoutez la clé.
Désormais, GitLab traitera n’importe quelle connexion établie avec votre clé privé comme venant de vous.
Connection à un dépot distant avec GitLab
Vous avez créé votre projet dans GitLab et vous avez configuré GitLab avec votre clé publique. On veut maintenant associer votre dépôt distant (GitLab) à votre dépôt local.
Dans un premier temps, cherchez dans l’adresse de votre dépot distant sur GitLab. Revenez au projet que vous avez créé tout à l’heure (e.g. en naviguant vers Projects → Your projects → inf103-tp2
).
En haut de la page, on fait apparaitre l’adresse du dépôt distant en cliquant sur la flêche à droite de Clone :

L’adresse a la forme suivante:
git@gitlab.enst.fr:INF103/2019_gr3_tp/inf103-tp2.git
Nous voulons ensuite rajouter cette adresse de dépôt distant à notre dépôt local. Dans le Terminal, allez à votre dépôt local, puis tapez la command suivante, en remplaçant l’adresse du dépôt comme il faut :
git remote add origin git@gitlab.enst.fr:INF103/2019_gr3_tp/inf103-tp2.git
Cette commande ajoute le dépot distant de nom origin
et d’adresse git@gitlab.enst.fr:INF103/2019_gr3_tp/inf103-tp2.git
à votre dépot local. Le nom origin
est utilisé par convention pour indiqué le dépôt distant principal du projet, mais vous pouvez utiliser n’importe quel nom, et il pourrait y en avoir plusieurs. Par exemple, vous pourriez rajouter un dépôt distant gitlab
et un autre bitbucket
si, e.g., vous vouliez avoir deux dépôts distants redondants.
GIT et les clefs SSH
Quand GIT doit contacter le serveur gitlab et utiliser une clef SSH, il lui manque encore une information: où est la clef à utiliser ? Et surtout, vous pourriez utiliser des clefs différentes pour différents sites: une clef pour GitHub, une pour gitlab, etc.
Pour donner cette information à GIT, il faut créer un fichier config
dans le dossier .ssh
, qui contienne:
Host gitlab.enst.fr
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
où id_rsa est le nom de votre clef privée.
“Pousser” un dépôt Git
Normalement, le dépôt local contient quelques révisions. Vous avez aussi créé un dépôt distant GitLab et configuré le dépôt local avec un dépôt distant du nom origin
.
Par contre, si on regarde dans GitLab, on voit que le dépôt distant est encore vide. Il reste à synchroniser le dépôt local vers le dépôt distant. On appelle ça « pousser un dépôt ».
Revenez au Terminal du dépôt local. La première fois qu’on veut pousser un dépôt, il faut dire à git vers quel dépôt distant pousser, même s’il n’y en a qu’un seul configuré. Git peut parfois être un peu bète.
Tapez la commande git push --set-upstream origin master
↵
Si tout se passe bien, vous verrez quelque chose du genre :
→
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (12/12), 984 bytes | 984.00 KiB/s, done.
Total 12 (delta 0), reused 0 (delta 0)
To gitlab.enst.fr:eaganj/inf103-tp2.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Si vous voyez des erreurs d’authentification, vérifiez que vous avez bien la clé privée SSH sur votre système et la clé publique dans GitLab.
Désormais, vous n’auriez plus besoin de re-dire à Git quel dépôt distant utiliser. Vous pouvez alors faire tout simplement git push
↵.
Git 3
Rajoutez une nouvelle version dans votre dépôt local. Les commandes git status
, git diff
, et git commit
seront sûrement utiles. N’oubliez pas de donner un message utile au commit, du genre « Rajout de tri sélection et tri rapide ».
Travailler avec un dépôt distant
Il est courant de vouloir travailler un projet sur plusieurs machines différents. Par exemple, sur une machine de la salle de TP et sur une machine perso. Plus tard, on vera aussi comment travailler à plusieurs sur un même dépôt. Pour faire cela, nous allons découvrir deux nouvelles commandes : git clone
et git pull
.
Git clone
Lorsqu’on veut récupérer un dépôt distant qui n’est pas encore sur la machine locale, on utilise la commande git clone
. Cette commande cherche un dépôt distant et créé une copie identique de tous les fichiers, de toutes leurs anciennes versions, tous les commits, etc. Ainsi, vous obtiendrez un dépôt local conforme au dépôt distant au moment où vous faites le clone.
- Si vous avez installé Git sur votre machine perso et vous l’avez avec vous
- Si vous avez travaillé sur une machine de la salle de TP jusque là, passez à votre machine perso.
- Si vous avez travaillé sur la machine perso, passez à la machine de la salle de TP.
- Ouvrez un Terminal dans votre workspace Eclipse.
- Si vous avez travaillé sur une machine de la salle de TP jusque là, passez à votre machine perso.
- Sinon, vous pouvez ouvrir un Terminal sur la même machine, dans un nouveau dossier. NB: la command
mkdir
permet de créer un nouveau dossier. Par exemple :mkdir temp
pour créer un dossier du nomtemp
.
Retrouvez l’adresse du dépôt distant en se connectant au GitLab. C’est la même adresse qu’on a utilisée lors de l’exercice précédent, quelque chose comme git@gitlab.enst.fr:eaganj/inf103-tp2.git
.
Puis, en remplaçant l’adresse par la bonne, tapez : git clone git@gitlab.enst.fr:eaganj/inf103-tp2.git
↵
→
Cloning into 'inf103-tp2'...
remote: Counting objects: 17, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 17 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (17/17), done.
Resolving deltas: 100% (2/2), done.
Voilà ! Vous avez créé un dépôt local conforme au dépôt distant. Il suffit de faire cd inf103-tp2
pour rentrer dans le dépôt.
Erreurs d’authentification et les clés SSH
Si vous voyez une erreur de droits d’accès, c’est peut-être lié aux clés d’accès SSH.
Si vous êtes sur une machine Linux ou Mac :
- Regardez dans le dossier
~/.ssh
— (cd ~/.ssh
↵, puisls
↵)- Si le dossier
.ssh
n’existe pas ou il n’y a pas les fichiersid_rsa
etid_rsa.pub
, il faut le générer.
Générez une nouvelle clé sur cette machine et rajoutez-là à GitLab.- Si les clés existent, rajoutez la clé publique à GitLib.
On peut verifier que le nouveau dépôt local contient non seulement la dernière version du projet mais aussi toutes les version antérieures. Faites git log
pour voir l’ensemble des versions dans le dépôt.
Attention aux fichiers non committés
Quand vous faites des opérations Git, par exemple un pull, checkout ou un merge (qu’on ver ra ultérieurement), alors qu’ il y a des fichiers modifiés ou non-suivis dans la copie de travail, alors il peut arriver que vous les perdiez. Normalement, Git vous prévient que vous allez écraser des fichiers non versionnés. Nous avons vu des exemples où ce message était ignoré et l’étudiant a perdu beaucoup de travail.
Quoi qu’il en soit, ajoutez rapidement les nouveaux fichiers à Git, n’ignorez pas de fichiers importants, etc. Avant de faire une opération tel que pull, checkout, ou merge, assurez-vous que votre dépôt est propre en vérifiant que toute modification et tout fichier non-suivi n’est pas important (e.g. avec
git status
etgit diff
). Si vous voulez garder les modifs, faites des commits ou un stash (ci-dessous).
Stash
Dans l’avertissement dessus, vous voyez que certaines opérations Git peuvent modifier votre copie de travail. Avant de faire ces opérations, on veut généralement avoir une copie de travail propre, où il n’y a ni fichier modifié ni fichier non-suivi — ou au moins que ces fichiers non-suivis ne sont pas importants.
Parfois, on peut avoir des modifications incomplètes : on n’est pas prêt à faire commit dans une nouvelle version, mais on ne veut pas les perdre non plus. Alors, on peut les mettre dans un « stash » (une planque ou cachette). Planquer notre copie de travail est comme ramasser tous les fichiers modifiés et les mettre dans la cachette. La planque n’est pas une version dans Git, elle n’est pas poussée vers le dépôt distant.
Pour planquer notre travail, on peut faire git stash
. Alors on se retrouve avec une copie de travail à la dernière version commitée. Pour retrouver nos modifications, on fait git stash pop
, qui enlève les modifications de la planque et les rapplique à notre copie de travail.
Vous avez vu comment cloner un dépôt distant pour créer un nouveau dépôt local, comment mettre à jour un dépôt local à partir d’un dépôt distant (tirer), et comment planquer les modifications locales qu’on n’est pas encore prêt à mettre dans un nouveau commit.
Nous verrons comment résoudre des « conflits » lorsqu’on fait des modifications dans deux dépôts différents.
Git 4
Lors des exercices précédents, vous avez vu comment créer plusieurs dépôts locaux qui sont associés à un dépôt distant. Si on modifie le même code différemment dans deux dépôts, il n’est pas évident de savoir quoi faire lorsqu’on essaie d’intégrer les deux versions. C’est un conflit.
Nous allons recréer la situation.
Je suppose que vous avez un dépôt A connecté avec un dépot distant sur gitlab.
Créez dans un autre dossier un clone du dépôt distant. Si vous avez oublié l’URL du dépôt distant, faites:
git remote -v
Dans le dépôt A. Il vous répond l’URL du remote pour fetch et push (qui peut être différent). Dans un autre dossier, faites git clone
avec cette URL ce qui donne un dépôt local B.
Dans le dépôt local A, modifiez un fichier, add, commit, push.
Dans le dépôt local B, modifiez le même fichier, mais d’une autre manière, add, commit, push.
Normalement, vous devriez voir quelque chose comme ceci:
→
CONFLICT (content): Merge conflict in Heap.java
Automatic merge failed; fix conflicts and then commit the result.
Git est vaguement intelligent. Si ces modifications portaient sur deux fichiers différents ou deux méthodes différentes de notre code, il aurait pu intégrer les deux ensembles de modifications automatiquement. Mais ici, nous avons modifié le même code, les mêmes lignes de texte dans les deux versions.
Alors, Git nous demande quoi faire. Avec git status
on voit que Heap.java
est en conflit.
Si on regarde le code dans Eclipse, on voit que Git a délimité le conflit ainsi :
<<<<<<< identifiant-de-la-version-locale
/* la version du code qui existe dans le dépôt local */
int ceCodePeutEtreSurPlusieursLignes ;
|||||||
// La version qui existait avant les deux modifications
=======
// la version du code qui existe dans le dépôt distant
>>>>>>> identifiant-de-la-version-distante
Pour corriger le conflit, éditez le fichier du conflit et créez la version finale fusionnée à partir des différents éléments, puis git add
et git commit
.
Vérifiez ce qui s’est passé du point de vue du graphe avec git log --all --decorate --oneline --graph
.
Pratique du merge
Clonez le dépôt: git@gitlab.enst.fr:slr201-git-adv/learning-merge.git
Il y a deux branches à merger dans master. Aucune des deux branches ne permet un merge automatique.
- refac1 permet de faire un merge avec juste des choix
- sur Complex.java, il faut choisir le coté refac1 en entier
- sur FFT.java, il faut choisir les commentaires ET les refactorings
- refactor rend obligatoire la retouche manuelle du code, car les modifs des deux cotés touchent les mêmes lignes.
En cours, les deux merges ont été faits devant vous.
Clairement, pour cet exercice, utiliser un outil graphique est plus facile. Utilisez Smartgit en version gratuite, son outil de gestion des conflits est vraiment bien.
Faites le merge simple:
git checkout master
git merge refac1
Puis faites la résolution de conflits jusqu’à ce que git status
vous dise qu’il n’y a plus de conflits, ou que votre outil graphique n’ait plus de fichier marqué comme en conflit.
Puis git merge --abort
pour effacer.
Puis faites le merge complexe:
git checkout master
git merge refactor
Puis faites la résolution de conflits jusqu’à ce que git status
vous dise qu’il n’y a plus de conflits, ou que votre outil graphique n’ait plus de fichier marqué comme en conflit. Dans ce merge, le choix entre l’une ou l’autre version n’est pas suffisant: il faut mélanger.
Et voilà. Vous avez fait deux vrais merges réalistes.
Fin du premier TP.