Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TP5 : Voyager entre univers parallèles

IUT d'Orsay, Université Paris-Saclay

Objectifs

Le but de ce TP est de comprendre les commandes et concepts suivants :

La fusion des branches divergentes

Quand une fusion ne peut pas se faire automatiquement, nous obtenons des branches divergentes avec des fusions manuelles à effectuer et des conflits potentiels à résoudre.

Merge sans conflit

D’abord, cherchons à reproduire des branches divergentes.

  1. Créez un répertoire TP5/ avec un fichier merge-without-conflict.txt contenant trois lignes de texte arbitraire sur les lignes 1, 3 et 5.

  2. Synchronisez votre Local Repo avec le Remote Repo.

  3. Localement, modifiez la troisième ligne de texte du fichier merge-without-conflict.txt.

  4. Effectuez un commit de ce changement sans faire de push.

  5. Sur le Web IDE, modifiez la cinquième ligne de texte du fichier merge-without-conflict.txt afin de simuler un changement effectué sur un autre poste ou par un collaborateur.

  6. Effectuez un commit de ce changement.

Vous devez maintenant avoir deux versions de merge-without-conflict.txt.

Par exemple, sur le Local Repo, vous avez :

merge-without-conflict.txt
First line of text

Third line of text

Fifth line

Sur le Remote Repo, vous avez :

merge-without-conflict.txt
First line of text

Third line

Fifth line of text
  1. Effectuez un git push et observez l’erreur.

Git détecte qu’il y a eu des changements sur le Remote Repo qui ne sont pas présents sur notre Local Repo et nous propose d’effectuer un git pull pour mettre d’abord notre Local Repo à jour.

  1. Effectuez un git pull et observez l’erreur. Avez-vous compris pourquoi nous avons créé des branches divergentes ? Sinon, appelez votre encadrant.

  2. Exécutez git graph et observez.

Nous devons maintenant procéder à une fusion manuelle.

  1. Exécutez la commande suivante.

git merge origin/main

Cette fusion est considérée comme une fusion (automatique) sans conflit car les modifications provenant des deux branches se trouvent sur des blocs de lignes distinctes.

  1. Git a effectué un add automatiquement et vous propose d’écrire un message de commit pour l’opération de fusion, avec un message auto-généré déjà pré-rempli. Vous pouvez modifier ce message si vous le souhaitez.

  2. Une fois le commit effectué, vérifiez que le contenu de merge-without-conflict.txt combine à la fois celui de origin/main et main.

Par exemple :

merge-without-conflict.txt
First line of text

Third line of text

Fifth line of text
  1. Exécutez git graph et observez.

  2. Exécutez git push pour synchroniser votre Local Repo avec le Remote Repo.

Merge avec conflit

Dans l’exemple précédent, nous avons vu une fusion où les modifications apportées aux deux versions d’un même fichier ne se chevauchaient pas, ce qui a permis à Git de fusionner automatiquement les changements.

Cette fois, nous allons à nouveau créer et fusionner des branches divergentes mais avec des modifications en conflit.

  1. Créez un fichier merge-with-conflict.txt dans TP5/ avec une seule ligne de texte arbitraire.

  2. Synchronisez votre Local Repo avec le Remote Repo.

  3. Localement, ajoutez une deuxième ligne de texte au fichier merge-with-conflict.txt.

  4. Effectuez un commit de ce changement sans faire de push.

  5. Sur le Web IDE, ajoutez une autre deuxième ligne de texte à merge-with-conflict.txt.

  6. Effectuez un commit de ce changement.

Vous devez maintenant avoir deux versions de merge-with-conflict.txt.

Par exemple, sur le Local Repo, vous avez :

merge-with-conflict.txt
First line of text
Second line of text

Sur le Remote Repo, vous avez :

merge-with-conflict.txt
First line of text
Another second line of text
  1. En effectuant git push ou git pull, vous recevrez les mêmes erreurs qu’avant concernant les branches divergentes.

  2. Exécutez git graph et observez.

Nous devons maintenant procéder à une fusion manuelle.

  1. Exécutez git merge origin/main.

Cette fois, la fusion automatique échoue car les deux versions de merge-with-conflict.txt possèdent des modifications différentes sur la même ligne. Git vous signale qu’il faut résoudre le(s) conflit(s) dans merge-with-conflict.txt puis de faire un commit de cette résolution.

  1. Exécutez git status et observez.

  2. Ouvrez merge-with-conflict.txt dans un éditeur de texte. Vous devez voir les lignes suivantes :

merge-with-conflict.txt
First line of text
<<<<<<< HEAD
Second line of text
=======
Another second line of text
>>>>>>> origin/main
  1. Remplacez ce bloc de texte (entre <<<<<<< HEAD et >>>>>>> origin/main) par la version finale de votre choix (qui peut différer des deux versions proposées). Par exemple :

merge-with-conflict.txt
First line of text
Merged line of text

Cette fois, notre fusion (manuelle) avec conflit ne vient pas avec un add et commit automatiques.

  1. Add, commit et push cette résolution de conflit.

  2. Exécutez git graph et observez.

Les branches

Les branches divergentes sont des branches créés par accident mais nous pouvons également créer des branches volontairement pour mieux gérer notre projet (par exemple, pour suivre les principes de travail collaboratif dans votre projet SAÉ).

Créer et voyager entre branches

  1. Créez une branche experiment/branch en exécutant la commande suivante.

git branch experiment/branch
  1. Changez de branche en exécutant la commande suivante.

git checkout experiment/branch
  1. Créez un fichier experiment-branch.txt dans TP5/ avec une ligne de texte arbitraire.

  2. Effectuez un add et un commit de ce changement.

  3. Synchronisez cette nouvelle branche avec votre Remote Repo en exécutant la commande suivante.

git push --set-upstream origin experiment/branch
  1. Revenez sur la branche main en exécutant la commande suivante.

git checkout main

Observez que experiment-branch.txt n’apparaît pas dans la branche main car le commit correspondant à la création de ce fichier est dans la branche experiment/branch.

  1. Créez un fichier main-branch.txt dans TP5/ avec une ligne de texte arbitraire.

  2. Effectuez un add et un commit de ce changement.

  3. Exécutez git graph et observez.

Fusionner deux branches

  1. Utilisez ce que vous avez appris pour fusionner la branche experiment/branch vers la branche main.

  2. Exécutez git graph et observez.

Créer une branche à partir d’un commit passé

Parfois, il est utile de créer une branche à partir d’un commit dans le passé

  1. Revenez à un ancien commit grâce à git checkout.

  2. Exécutez git status et observez que vous êtes en état detached HEAD.

Nous pouvons maintenant créez une branche à partir de ce commit et effectuez des changements qui seront sauvegardés dans notre historique.

  1. Créez une branche experiment/old-commit grâce à git branch.

  2. Changez de branche grâce à git checkout.

  3. Effectuez des changements puis add et commit dans la nouvelle branche.

  4. Exécutez git graph et observez.

  5. Synchronisez cette nouvelle branche avec votre Remote Repo.

Lister les branches

  1. Listez les branches de votre Local Repo avec la commande suivante.

git branch

Vous devez voir main, experiment/branch et experiment/old-commit.

  1. Listez les branches de votre Local Repo et votre Remote Repo avec la commande suivante.

git branch -a

Vous devez voir six branches avec les versions distantes des branches locales.

  1. Listez les branches de votre Local Repo qui sont déjà fusionnées avec la branche main avec la commande suivante.

git branch --merged main

Vous pouvez aussi combiner les options -a et --merged avec la commande suivante.

git branch -a --merged main
  1. Listez les branches de votre Local Repo qui ne sont pas encore fusionnées avec la branche main avec la commande suivante.

git branch --no-merged main

Similairement, vous pouvez aussi combiner les options -a et --no-merged.

git branch -a --no-merged main

Stash sur plusieurs branches

Nous avons vu comment stash du travail en cours sur une branche avant de checkout des commits dans le passé ou une autre branche. Naturellement, nous voulons aussi pouvoir stash du travail en cours sur plusieurs branches différentes sans les mélanger.

  1. Sur la branche main, effectuez quelques changements sans faire de add ou de commit.

  2. Stash votre travail en cours avec la commande suivante.

git stash push -a -m "main: work in progress"
  1. Refaites la même chose sur les branches experiment/branch et experiment/old-commit avec les messages "experiment/branch: work in progress" et "experiment/old-commit: work in progress" respectivement.

  2. Regardez l’état de la pile de stash avec la commande suivante.

git stash list

Vous pouvez observez un numéro pour chaque stash avec le message associé.

  1. Revenons à la branche main et réappliquons les changements de main avec la commande suivante.

git stash apply stash@{<le bon numéro>}
  1. Revérifiez l’état de la pile de stash. Observez que le stash de la branche main est toujours présente.

  1. Supprimez le stash contenant du travail de la branche main avec la commande suivante.

git stash drop stash@{<le bon numéro>}
  1. Revérifiez l’état de la pile de stash et observez que les numéros des stashes ont changé.

  2. Refaites les questions de 5. à 7. pour les deux autres branches pour vous familiariser avec les commandes autour de git stash.

Supprimer des branches

Nous ne pouvons pas supprimer une branche quand nous sommes sur la branche en question donc revenez d’abord sur la branche main.

  1. Pour supprimer une branche locale qui est déjà fusionnée avec la branche main (par exemple experiment/branch), utilisez la commande suivante.

git branch -d <nom de la branche>
  1. Pour supprimer une branche locale qui n’est pas encore fusionnée avec la branche main (par exemple experiment/old-commit), utilisez la commande suivante.

git branch -D <nom de la branche>
  1. Pour supprimer les mêmes branches sur le Remote Repo, utilisez la commande suivante.

git push origin --delete <nom de la branche>

Par exemple :

git push origin --delete experiment/branch
  1. Revenez aux objectifs et cochez les points que vous avez maîtrisés. Entraînez-vous sur les commandes et les notions que vous n’avez pas encore bien comprises. Faites appel à votre encadrant si besoin.