Git/Synchroniser le dépôt local avec le dépôt distant

< Git

Dans le chapitre précédent, nous avons vu comment vous pouviez travailler seul dans votre dépôt local. Nous allons maintenant nous pencher sur l'aspect distribué de git et voir comment travailler de façon collaborative en communiquant avec d'autres dépôts. Nous allons voir comment publier vos modifications et recevoir les modifications des autres développeurs.

Simulons un environnement de travail distribué

modifier

Nous allons faire travailler ensemble deux personnages, dont la réputation n'est plus à faire, Alice et Bob. Nous allons supposer que Alice et Bob vont chacun créer leur dépôt local sur leur machine avec git clone. Bien évidemment, ils vont utiliser clone en indiquant l'adresse du dépôt principal du projet : http://, https://, git:// ou file:////.

Pour créer un dépôt HTTP(s), il faut qu'il soit lisible par un serveur web (ex : Apache).

Créons un faux dépôt distant pour nos tests

modifier

Il serait prématuré d'expliquer ici comment créer un dépôt sur le réseau. Aussi, pour travailler, nous allons créer un faux dépôt distant en local.

Placez-vous dans un dossier qui ne risque rien (par exemple /tmp), nous allons créer le faux dépôt distant.

mkdir tests-avec-git
cd tests-avec-git
git init faux-depot-distant --bare
Initialized empty Git repository in /tmp/tests-avec-git/faux-depot-distant/

 

Les fichiers d'un dépôt --bare sont cryptés dans le sous-répertoire objects, ils ne sont donc pas accessibles par d'autres programmes que Git.

Simulons deux utilisateurs utilisant le dépôt distant

modifier

Le faux dépôt distant est créé. Maintenant, Alice et Bob vont créer leur copie locale avec clone.

git clone faux-depot-distant depot-local-alice
cd depot-local-alice
git config user.email "alice@fr.wikibooks.org"
git config user.name "Alice"

# Idem pour Bob
cd ..
git clone faux-depot-distant depot-local-bob
cd depot-local-bob
git config user.email "bob@fr.wikibooks.org"
git config user.name "Bob"

Alice commence à travailler

modifier

En tant qu'Alice, créons quelques modifications.

cd depot-local-alice
echo "Ceci est un test de git" > mon_nouveau_fichier.txt
git add mon_nouveau_fichier.txt
git commit -m "ajout d'un fichier"
echo "Une seconde ligne" >> mon_nouveau_fichier.txt
git add mon_nouveau_fichier.txt
git commit -m "ajout d'une seconde ligne dans le fichier"
echo "Une troisième ligne" >> mon_nouveau_fichier.txt
git add mon_nouveau_fichier.txt
git commit -m "ajout d'une troisième ligne dans le fichier"

Alice a maintenant quelques modifications dans son dépôt local, nous allons voir comment elle peut échanger avec Bob.

Commencer à travailler avec un dépôt distant

modifier

Dès que vous voulez faire une opération qui concerne le dépôt distant (publication ou récupération d'informations), commencez toujours par

git fetch

Cela met à jour les informations sur les dépôts distants auxquels est rattaché votre dépôt local, si vous oubliez de le faire, vous risquez d'être faussé par le fait que l'historique des modifications que vous voyez (par exemple) n'est pas complet.

Ainsi, dès que vous voulez faire une opération qui implique le dépôt distant, souvenez-vous de toujours faire un git fetch.

Publier les modifications locales sur le dépôt distant

modifier

Alice a fait plusieurs modifications sur master, elle voudrait les partager avec Bob, elle doit donc publier ses derniers commits sur le dépôt distant.

git push origin master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 787 bytes | 0 bytes/s, done.
Total 9 (delta 1), reused 0 (delta 0)
To /tmp/tests-avec-git/faux-depot-distant
 * [new branch]      master -> master

Git nous indique que la branche master a été créée sur le dépôt distant.

Récupérer les modifications d'un dépôt distant

modifier

Voyons comment Bob peut récupérer le travail d'Alice.

cd depot-local-bob
git fetch
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 9 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
Depuis /tmp/tests-avec-git/faux-depot-distant
 * [nouvelle branche] master     -> origin/master

Git nous indique qu'une nouvelle branche a été créée sur le dépôt distant. On va essayer de la récupérer.

git checkout master
git log
git log
commit 99d23406a342a94dd8c7be9c21a47d6d11b8d7f0
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:04 2014 +0100

    ajout d'une troisième ligne dans le fichier

commit 659937374dd1612ea8f33c07173f45aa42cabce1
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'une seconde ligne dans le fichier

commit a3b17da118bf2cfda9e6bcb6f70d305566827373
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'un fichier

On a bien récupéré les modifications faites par Alice. Si vous ouvrez le fichier mon_nouveau_fichier.txt, vous retrouverez toutes les modifications d'Alice.

cat mon_nouveau_fichier.txt
Ceci est un test de git
Une seconde ligne
Une troisième ligne

À notre tour, faisons une modification :

echo "Une quatrième ligne" >> mon_nouveau_fichier.txt
git add mon_nouveau_fichier.txt
git commit -m "ajout d'une quatrième ligne dans le fichier"
git log
commit 6b99e801c2b37535a84fa6f73510b720f8aeeb31
Author: Bob <bob@fr.wikibooks.org>
Date:   Sat Nov 15 11:37:13 2014 +0100

    ajout d'une quatrième ligne dans le fichier

commit 99d23406a342a94dd8c7be9c21a47d6d11b8d7f0
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:04 2014 +0100

    ajout d'une troisième ligne dans le fichier

commit 659937374dd1612ea8f33c07173f45aa42cabce1
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'une seconde ligne dans le fichier

commit a3b17da118bf2cfda9e6bcb6f70d305566827373
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'un fichier

Le résultat de ce git log ne devrait pas vous surprendre. Néanmoins, cette sortie ne montre pas l'état du dépôt distant. Pour cela, nous allons utiliser l'option --decorate.

git log --decorate
commit 6b99e801c2b37535a84fa6f73510b720f8aeeb31 (HEAD, master)
Author: Bob <bob@fr.wikibooks.org>
Date:   Sat Nov 15 11:37:13 2014 +0100

    ajout d'une quatrième ligne dans le fichier

commit 99d23406a342a94dd8c7be9c21a47d6d11b8d7f0 (origin/master)
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:04 2014 +0100

    ajout d'une troisième ligne dans le fichier

commit 659937374dd1612ea8f33c07173f45aa42cabce1
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'une seconde ligne dans le fichier

commit a3b17da118bf2cfda9e6bcb6f70d305566827373
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'un fichier

Là, on voit bien que notre branche master locale (master) est en avance de un commit sur la branche master distante (origin/master). HEAD indique simplement le commit sur lequel nous nous trouvons. Cela est confirmé par git status :

git status
Sur la branche master
Votre branche est en avance sur 'origin/master' de 1 commit.
  (utilisez "git push" pour publier vos commits locaux)

rien à valider, la copie de travail est propre

Publions nos modifications comme git nous le propose :

git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 341 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /tmp/tests-avec-git/faux-depot-distant
   99d2340..6b99e80  master -> master

On retourne chez Alice :

cd depot-local-alice
git status
Sur la branche master
Votre branche est à jour avec 'origin/master'.

rien à valider, la copie de travail est propre

La copie d'Alice semble à jour. Mais où est passé la modification de Bob ? Nous avons oublié le git fetch !

git fetch
git status
Sur la branche master
Votre branche est en retard sur 'origin/master' de 1 commit, et peut être mise à jour en avance rapide.
  (utilisez "git pull" pour mettre à jour votre branche locale)

rien à valider, la copie de travail est propre

Cette fois-ci, git nous indique que nous sommes en retard de 1 commit, en effet nous n'avons pas récupéré les modifications de Bob. Voyons ce que donne git log. Cette fois-ci, nous allons utiliser l'option --all pour indiquer à git que nous voulons voir toutes les branches, c'est à dire que nous voulons voir origin/master et pas seulement master.

git log --decorate --all
commit 6b99e801c2b37535a84fa6f73510b720f8aeeb31 (origin/master)
Author: Bob <bob@fr.wikibooks.org>
Date:   Sat Nov 15 11:37:13 2014 +0100

    ajout d'une quatrième ligne dans le fichier

commit 99d23406a342a94dd8c7be9c21a47d6d11b8d7f0 (HEAD, master)
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:04 2014 +0100

    ajout d'une troisième ligne dans le fichier

commit 659937374dd1612ea8f33c07173f45aa42cabce1
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'une seconde ligne dans le fichier

commit a3b17da118bf2cfda9e6bcb6f70d305566827373
Author: Alice <alice@fr.wikibooks.org>
Date:   Sat Nov 15 11:27:02 2014 +0100

    ajout d'un fichier

On voit bien notre retard sur le commit de Bob puisque origin/master est plus haut que master. Demandons à git de récupérer les modifications distantes et de les fusionner avec notre master local.

git pull
Mise à jour 99d2340..6b99e80
Fast-forward
 mon_nouveau_fichier.txt | 1 +
 1 file changed, 1 insertion(+)

Et ainsi de suite. Chacun peut localement faire plusieurs commits et faire régulièrement git push (« pousser » en anglais) pour publier ses propres modifications et des pull (« tirer » en anglais) pour récupérer les modifications des autres.

 git pull origin nom_de_branche ne récupère que les informations de celle-ci.

Continuer

modifier

Vous maîtrisez maintenant l'essentiel de git pour pouvoir travailler collaborativement sur un projet.

Évidemment, dans notre exemple, nous avons utilisé un faux dépôt distant. Dans la réalité, il faudra créer un dépôt central (régulièrement sauvegardé pour ne pas perdre le projet !) sur une machine réseau pour que tout le monde puisse faire le clone.