Feuille de travaux pratiques - Gestion de version

Concepts/ Subversion/ Git

IUT de Nantes – Département Informatique

LINA - Laboratoire d’Informatique de Nantes Atlantique

Cours de Licence professionnelle 2016

Copyright (C) 2016 Bertrand FLORAT (bertrand@florat.net)

Version 1.6 du 17 septembre 2016 / http://florat.net/cours_vcs/tp.html / Cours

Naviguer avec les fléches ou la molette de la souris

Notes importantes
  • Le travail se fera en binôme. Chaque binôme possède un dépôt SVN et Git distant et dédié. 'A' et 'B' désignent respectivement l'un et l'autre membre du binôme. Si un étudiant est seul, il devra simuler A et B dans deux consoles différentes et avec deux utilisateurs différents
  • Il est possible d'utiliser Subversion ou Git dans Eclipse via des plugins, néanmoins dans le cadre de ce TP, il vous est demandé de n'utiliser que la ligne de commande
  • Vous êtes responsable des données présentes sur vos deux dépôts. Ne stocker que des données relatives à votre travail à l’IUT et uniquement des sources
  • Veuillez vous référer aux pages 'man' et aux documents référencés à la fin du support de cours
  • Tous les exercices se feront sous Gnu/Linux avec vi (vim) comme éditeur de texte.

    Commandes de base: :i insérer, :o insérer à la ligne, :q! quitter sans enregistrer, :x quitter en enregistrant, shift J (ligne n) : remonte la ligne n+1, y : copier, p : coller, dd : supprimer toute une ligne, u : undo . Voir [6] au besoin.


TP1 Motivations gestion de configuration

Echanges en séance

TP2 Commandes SVN de base

Préparation de l'environnement

A faire par A et B

Créer un repertoire ~/dev qui contiendra les projets sur lesquels nous travaillerons et toutes leurs branches

Si un étudiant est seul, il devra simuler A et B dans deux consoles différentes et avec deux utilisateurs différents

Exercice 2.1 : Récupération d'une copie locale

Cet exercice est fait par A et B

Récupérer dans le répertoire ~/dev/my-app-trunk la branche trunk du projet qui vient d'être créé par A et situé à cette adresse :

file:///var/cours/depots_svn/b<code_binôme>/my-app/trunk

Vous pouvez consulter le répertoire .svn à la racine de votre copie locale, que contient-il ?

Exercice 2.2 : Commit d'une modification

Cet exercice est fait par A uniquement

  1. Modifier le source Calcul.java et ajouter un nouveau fichier CalculAlternatif.java dans le même package
  2. Afficher le statut de la copie locale à ce stade
  3. Commiter cette modification de fichier et cet ajout d'un nouveau fichier en un seul commit en utilisant un message de commit dans les règles de l'art
  4. Afficher le commit dans l'historique et les différences qu'il a introduit
  5. Attention : svn doit récupérer l'historique depuis le dépôts même si les commits ont été faits sur le poste qui a effectué les commits).

Exercice 2.3 : Résolution d'une mise à jour concurrente sans conflit

Cet exercice est fait simultanément par A et B

  1. A et B modifient simultanément le fichier pom.xml: A modifie le groupId, B modifie l'artifactId.
  2. A et B consultent le status de leurs copies locales respectives.
  3. A commite
  4. B tente de commiter. Que se passe-t-il ? que faut-il faire ? Une fois le problème résolu, B affiche le statut puis commite à son tour sa modification.
  5. A prend en compte la modification de B
Exercice 2.4 : Résolution d'un conflit

Cet exercice est fait simultanément par A et B

Modifier (toujours simultanément) une nouvelle fois le fichier pom.xml. Cette fois, A et B modifient la même zone (par exemple la version du projet). A commite d’abord ces modifications. Puis c’est au tour de B. Que se passe-t-il ? Résoudre le problème.

Exercice du soir no 1 (SVN)

A faire avant le prochain cours ;

Exercice individuel ;

Expliquer en moins de 200 mots les différences majeures entre Git et SVN et dans quel cas utiliser l'un ou l'autre ;

Laisser le texte sur le serveur https://cours.florat.net dans le fichier ~/soir1.txt

TP3 Commandes Git de base

Exercice 3.1 : Clonage d'un dépot

Chaque binôme dispose d'un dépôt Git accessible en ssh et situé à l'URL

file:///var/cours/depots_git/b<code_binôme>/my-app.git
  • A et B clonent dans leur répertoire ~/dev le dépôt distant affecté au binôme
  • Afficher les branches avec git branch -a
  • Consultez votre répertoire .git (commande: find .git)
Exercice 3.2 : Commit d'une modification

Cet exercice se fait simultanément par A et B

  1. Configurer correctement son nom et e-mail Git (voir support de cours)
  2. Vérifier que vous vous trouvez dans la branche master, s'y positionner si ce n'est pas le cas.
  3. Modifier le source Calcul.java et ajouter un fichier source CalculAlternatif.java dans le même package
  4. Afficher le statut de la copie locale à ce stade
  5. Commiter ensemble cette modification et cet ajout de nouveau fichier en utilisant un message de commit dans les règles de l'art.
  6. Afficher le commit dans l'historique et les différences qu'il a introduites (commande git show).
Exercice 3.3.1 : Merge fast-forward

Cet exercice se fait simultanément par A et B

  1. Créer une branche nommée bug42 et s'y positionner
  2. Effectuer des modifications sur Calcul.java et les commiter
  3. Positionnez vous dans la branche master
  4. Fusionner (par merge) les modifications de la branche bug42 dans la branche master. Comment git qualifie ce type de merge ?
  5. Supprimer cette branche
Exercice 3.3.2 : Merge non fast-forward

Cet exercice se fait simultanément par A et B

  1. Créer une branche nommée bug42 et s'y positionner
  2. Effectuer des modifications au début du fichier Calcul.java et les commiter
  3. Positionnez vous dans la branche master
  4. Effectuer des modifications à la fin du fichier Calcul.java et les commiter
  5. Fusionner (par merge) les modifications de la branche bug42 dans la branche master. Comment git qualifie ce type de merge ?
  6. Supprimer cette branche
Exercice 3.4 : Gestion d'un conflit

Cet exercice se fait simultanément par A et B

Voir cours slide "Merge"

  1. Refaire l'exercice 3.3.2 mais cette fois en créant un conflit sur le fichier Calcul.java entre les branches master et bug42 (modifier de façon différente les mêmes lignes de code)
  2. Que vous reporte Git ? Un commit a-t-il été créé ? afficher le statut de la copie locale.
  3. Résoudre le conflit manuellement et le commiter
Exercice 3.5 : Manipulation des branches distantes

A sauvegarde (commande mv ~/dev/my-app ~/dev/my-app~) son dépôt local puis le réinitialise en le clonnant à nouveau (voir ex 3.1) depuis le repertoire ~/dev

  1. Afficher le détail du dépôt origin et des branches remote via les commandes suivantes :
    $ git branch -r
    $ git remote show origin
  2. B pousse ses commits des exercices précédents dans la branche origin/master
  3. A compare sa branche master à la branche origin/master. Il y-a-t-il des différences? Pourquoi ?
  4. A intégre les modifications distantes soit via fetch + merge soit par un pull. Quelle est la différence ? quel est la méthode la plus prudente ?

TP4 Utilitaires Git

Ce TP a comme prérequis le TP3

Exercice 4.1 : Ignorer des fichiers
  1. Créer un fichier (fictif) .class avec les fichier java
  2. Configurer git pour qu'il ignore recurvivement tous les .class
  3. Utiliser git status pour vérifier l'opération avant et après
Exercice 4.2 : Réécrire son historique
  1. Effectuez trois commits
  2. Renommez le premier commit
  3. Fusionnez le second et le troisième
Exercice 4.3 : Rechercher une expression
Recherchez une expression de votre choix dans les différentes révisions du dépôt avec la commande git grep <expression> <reference>
Exercice 4.4 : Utilisation de git-flow
  1. Initialiser git-flow sur votre dépôt local
  2. Démarrer une release
  3. Créer puis fermer une branche topic de fonctionnailité
  4. Créer puis fermer une branche topic hotfix
  5. Finaliser la release
Exercice du soir no 2 (Git)

Attentation: c'est un travail individuel à faire par chaque étudiant, délai: une semaine

  • Aller sur http://pcottle.github.io/learnGitBranching/?NODEMO
  • Faire un commit sur master
  • Poser un tag V1 sur ce commit
  • Créer depuis ce commit une branche maintv1, y faire deux commits, tagger ce dernier commit V1Fix1
  • Faire un commit sur master puis tagger V2
  • Créer depuis ce commit une branche maintv2, y faire deux commits puis y merger le commit V1Fix1
  • Faire un dernier commit dans la branche maintv2, puis le tagger par votre nom de famille
  • Faire une capture d'écrans et l'envoyer par mail en piece jointe à http://florat.net/contact