1
2
3
4
5
6
7
8
9

Approfondissement de l'utilisation de Git

Nous avons vu dans une première partie comment mettre en place un dépôt git sur vos machines et les opérations de base pour commencer à versionner votre travail. Nous avons aussi vu comment utiliser un serveur distant pour sauvegarder vos données en ligne. Le but de cette nouvelle section est de voir ensemble comment récupérer des projets disponibles sur la plateforme Github ou sur tout autre serveur distant et comment travailler à plusieurs sur un même projet en gérant les conflits éventuels.

Cloner un dépôt Git

Nous allons voir dans cette partie comment récupérer en local un dépôt qui existe déjà soit à un autre emplacement de votre machine, soit, comme ici, un dépôt sur un serveur distant.

TO DO :

    Placez-vous dans un nouveau dossier de travail et, à partir d'un terminal, clonez le dépôt usrs46 présent sur mon GitHub.
    ~/Desktop/ git clone https://github.com/Azerolie/usrs46.git
    

L'adresse https du dépôt est disponible sur GitHub pour chaque projet public. Il suffit de dérouler l'onglet Code et de copier le lien fournit.

TO DO : Observez le dossier récupérer et agissez en conséquence.

Travailler à pluieurs et gérer les confits

Comme nous l'avons vu dans l'introduction à Git, un avantage précieux de ce logiciel de gestion de versions réside dans la possibilité de travailler à plusieurs sur un même projet, et peut être même un même fichier et pourquoi pas une même instruction. En même temps. Vous avez peut être rencontré cette situation dans l'exercice précédent en manipulant le fichier helloworld.txt.

Mais alors que se passe-t-il si un même fichier et plus spécifiquement les mêmes instructions d'un même fichier sont amenées à être modifiées en même temps ? Et bien Git n'est pas capable de choisir quelle version conservée, il vous laissera la main pour ça. C'est ce qu'on appelle dans le vocabulaire Git un conflit. Plusieurs versions d'un même fihcier peuvent entrer en conflit si Git n'est pas capable d'appliquer tous les changements sans recouvrement. Et c'est à la dernière personne qui push un changement conflictuellement de résoudre la situation.

Illustrons l'apparition d'un conflit par un exemple pratique. J'ai un dépôt usrs46 sur le serveur distant GitHub et un clone de ce dépôt sur ma machine en local. Je vais modifier des deux côtés le fichier helloworld.txt pour lui ajouter un titre.


J'ai donc maintenant une version en locale différente de la verison sur le serveur distant. Si j'essaye de récupérer la version du serveur distant, Git ne sera pas capable de choisir entre les deux versions puisque la première ligne change d'un fichier à l'autre. Il va donc générer un conflit.

~/Desktop/usrs46 (master) git add helloworld.txt
~/Desktop/usrs46 (master) git commit -m "Ajout d'un titre en local"
~/Desktop/usrs46 (master) git push

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/Azerolie/usrs46.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

~/Desktop/usrs46 (master) git pull
  
[...]
Auto-merging helloworld.txt
CONFLICT (content): Merge conflict in helloworld.txt
Automatic merge failed; fix conflicts and then commit the result.

Aïe aïe aïe ! Ça n'a pas l'air de s'être bien passé ! On peut voir que notre tentative de push sur le serveur à été rejetée. Lorsque l'on essaye de récupérer les données du serveur via un pull on remarque sur les dernières lignes qu'un conflit a été généré car Git n'a pas réussi à faire le merge entre la version locale du fichier hellowolrd.txt et la version distante. Jetons un oeil au retour de la commande git status pour en apprendre plus.

~/Desktop/usrs46 (master|MERGING) git status

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add ..." to mark resolution)
        both modified:   helloworld.txt

On retrouve l'information “You have unmerged paths.” qui nous rappelle qu'une opération de merge n’a pas pu aboutir. Git nous propose même directement deux solutions pour résoudre le conflit.

Nous avons également dans le retour de la commande git status une indication sur la cause du conflit : "both modified: helloworld.txt". On le savait déjà mais sur des projets plus importants, il n'est pas toujours évident de savoir a priori d'où vient le conflit.

Bon, nous savons donc que le problème vient du fichier hellowolrd.txt et que, tant que nous n'avons pas pris de décision, la situation est bloquée : il n'est plus possible ni de push ni de pull sur le serveur. Nous avons à notre disposition 3 solutions pour résoudre ce conflit :

  1. Conserver la version locale et écraser la version distante.
  2. Conserver la version distante et écraser la version locale.
  3. Proposer une nouvelle version qui écrasera la version locale et la version distante

Si vous êtes plusieurs à travailler sur le même projet, c'est le bon moment d'échanger avec les autres membres du groupe pour déterminer quelle solution choisir.

Allons donc jeter un oeil à notre fichier helloworld.txt, nous allons voir que Git ne nous laisse pas tomber et nous montre clairement où est le problème.

Qu'est-ce que tout ça signifie ?

Nous avons tous les éléments nécessaires pour prendre une décision :

Voyons plus précisément le cas où l'on choisit de conserver la version locale :

~/Desktop/usrs46 (master|MERGING) git checkout --ours helloworlrd.txt
~/Desktop/usrs46 (master|MERGING) git add helloworld.txt
~/Desktop/usrs46 (master|MERGING) git commit -m "Résolution du conflit sur le 
fichier helloworld"
~/Desktop/usrs46 (master) git push

Problème résolu !

Vous avez maintenant de nouveaux outils pour travailler à plusieurs sur Git et gérer d'éventuels conflits s'ils se présentent. Il reste encore beaucoup de choses à découvrir sur l'utilisation de Git. Vous serez amenées à les voir au fur et à mesure de votre vie de développeurs et de vos besoins.

Autonomie : Mémo sur les commandes git

TO DO : Formez des groupes de 4 et mettez en place votre environnement de travail Git pour le projet. Déposez sur GitHub la première version de votre diagramme de classes.



← Réflexion sur le diagramme de classes du projet TD - Cellule Mutante →