Git/Synchroniser le dépôt local avec le dépôt distant
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é
modifierNous 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
modifierIl 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
modifierLe 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
modifierEn 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
modifierDè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
modifierAlice 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
modifierVoyons 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
modifierVous 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.