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.
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 :
~/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.
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.
merge
et donc de résoudre le conflit en
revenant une étape
plus tôt dans le processus. Pour autant les versions du fichier restent différentes et nous n'avons pas avancer sur
les moyens de push
notre version locale. 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 :
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 :
git checkout --theirs helloworld.txt
git checkout --ours helloworlrd.txt
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.