Ce TP va vous permettre de travailler en groupe 3 ou 4 sur un même dépôt GitLab afin de pratiquer :
main
Le TP est volontairement simple : les fichiers Java ne nécessitent pas de framework. L’objectif principal est de comprendre Git, GitLab et les conflits.
Chaque groupe doit être composé de 3 à 4 personnes.
Un membre du groupe joue le rôle de mainteneur du dépôt. Les autres membres jouent le rôle de développeur.euse.s.
feature/personne-a-catalogue
feature/personne-b-calculateur
feature/personne-c-client
feature/personne-d-message
depot-java-collaboratif/ ├── README.md └── src/ └── main/ └── java/ └── fr/ └── formation/ └── gitlabtp/ ├── Application.java ├── CatalogueService.java ├── CalculateurPrix.java ├── ClientService.java └── MessageService.java
Les fichiers Java contiennent volontairement du code simple, avec une ou deux imperfections. L’objectif n’est pas de faire une application métier complète, mais de provoquer des modifications concurrentes.
Le mainteneur crée un projet GitLab nommé :
tp-gitlab-conflits-groupe
Dans GitLab :
Project information > Members > Invite members
Attribuer les rôles suivants :
Depuis le dossier depot-java-collaboratif :
depot-java-collaboratif
git init git branch -M main git add . git commit -m "Initialisation du TP GitLab conflits" git remote add origin URL_DU_DEPOT_GITLAB git push -u origin main
Chaque participant modifie son fichier principal, mais plusieurs participants modifient aussi Application.java. Cette modification volontairement commune provoque les conflits.
Application.java
CatalogueService.java
CalculateurPrix.java
ClientService.java
MessageService.java
Chaque participant clone le dépôt :
git clone URL_DU_DEPOT_GITLAB cd tp-gitlab-conflits-groupe
Vérifier l’état :
git status
Résultat attendu :
On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
Dans IntelliJ :
File > Open > choisir le dossier du projet
git checkout -b feature/personne-a-catalogue
git checkout -b feature/personne-b-calculateur
git checkout -b feature/personne-c-client
git checkout -b feature/personne-d-message
Vérifier :
git branch
Modifier CatalogueService.java :
package fr.formation.gitlabtp; import java.util.List; public class CatalogueService { public String titreCatalogue() { return "Catalogue bancaire et loisirs"; } public List<String> produitsDisponibles() { return List.of( "Compte courant", "Carte bancaire premium", "Assurance voyage", "Compte épargne loisirs" ); } }
Modifier aussi dans Application.java :
System.out.println("=== Application GitLab - Catalogue enrichi ===");
Modifier CalculateurPrix.java :
package fr.formation.gitlabtp; public class CalculateurPrix { public double calculerTotal(double prixUnitaire, int quantite) { if (prixUnitaire < 0 || quantite < 0) { throw new IllegalArgumentException("Le prix et la quantité doivent être positifs."); } return prixUnitaire * quantite; } public double appliquerRemise(double total, double tauxRemise) { if (tauxRemise < 0 || tauxRemise > 1) { throw new IllegalArgumentException("Le taux de remise doit être compris entre 0 et 1."); } return total * (1 - tauxRemise); } }
System.out.println("=== Application GitLab - Calculateur corrigé ===");
Modifier ClientService.java :
package fr.formation.gitlabtp; public class ClientService { public String formaterNomComplet(String prenom, String nom) { if (prenom == null || prenom.isBlank()) { throw new IllegalArgumentException("Le prénom est obligatoire."); } if (nom == null || nom.isBlank()) { throw new IllegalArgumentException("Le nom est obligatoire."); } return prenom.trim() + " " + nom.trim().toUpperCase(); } }
System.out.println("=== Application GitLab - Client sécurisé ===");
Modifier MessageService.java :
package fr.formation.gitlabtp; public class MessageService { public String messageBienvenue(String nom) { return "Bienvenue " + nom + ", votre espace bancaire et loisirs est prêt."; } public String messageConfirmationImport() { return "Les données ont été traitées avec succès."; } }
System.out.println("=== Application GitLab - Messages améliorés ===");
Chaque participant fait :
git status git add . git commit -m "Modification fonctionnalité personne X" git push -u origin NOM_DE_LA_BRANCHE
Exemple :
git push -u origin feature/personne-a-catalogue
Merge requests > New merge request
Choisir :
Source branch : feature/personne-x-... Target branch : main
Titre conseillé :
Ajout fonctionnalité personne X
Le mainteneur accepte d’abord la merge request de la personne A.
Ensuite, les personnes B, C et D auront probablement un conflit dans Application.java, car chaque branche a modifié la même ligne :
System.out.println("=== Application de démonstration GitLab ===");
GitLab peut afficher :
Merge blocked: merge conflicts must be resolved.
C’est normal. Ce n’est pas une catastrophe. C’est Git qui demande un adulte dans la pièce.
Exemple personne B :
git checkout feature/personne-b-calculateur
git fetch origin
git merge origin/main
Si conflit :
CONFLICT (content): Merge conflict in src/main/java/fr/formation/gitlabtp/Application.java Automatic merge failed; fix conflicts and then commit the result.
Dans IntelliJ, ouvrir le fichier en conflit. Il contient des marqueurs comme :
<<<<<<< HEAD System.out.println("=== Application GitLab - Calculateur corrigé ==="); ======= System.out.println("=== Application GitLab - Catalogue enrichi ==="); >>>>>>> origin/main
Il faut supprimer les marqueurs et conserver une version cohérente.
Après fusion de la personne A, la personne B doit résoudre ainsi :
System.out.println("=== Application GitLab - Catalogue enrichi et calculateur corrigé ===");
Puis :
git add . git commit -m "Résolution conflit Application personne B" git push
Après fusion de A et B :
System.out.println("=== Application GitLab - Catalogue, calculateur et client sécurisé ===");
git add . git commit -m "Résolution conflit Application personne C" git push
Après fusion de A, B et C :
System.out.println("=== Application GitLab - Catalogue, calculateur, client et messages ===");
git add . git commit -m "Résolution conflit Application personne D" git push
La version finale complète est fournie dans le dossier :
solutions/version-finale/
Elle doit compiler avec :
javac src/main/java/fr/formation/gitlabtp/*.java java -cp src/main/java fr.formation.gitlabtp.Application
Résultat attendu approximatif :
=== Application GitLab - Catalogue, calculateur, client et messages === Catalogue bancaire et loisirs [Compte courant, Carte bancaire premium, Assurance voyage, Compte épargne loisirs] Total avant remise : 149.7 Total après remise : 134.73 Bienvenue Alice MARTIN, votre espace bancaire et loisirs est prêt. Les données ont été traitées avec succès.
git checkout -b nom-branche
git checkout nom-branche
git add .
git commit -m "message"
git push
git log --oneline --graph --all
Vous devez savoir :
Git compare du texte. Il ne comprend pas le métier. Quand deux personnes modifient la même ligne, Git ne tranche pas arbitrairement : il demande au développeur de décider.