I’m used to, when I want to update my local git repository with the distant one, to use git pull.
It works well. Until …

A few days ago, I wanted to release the version 1.0.0 of jesus. And to do so, I wanted to update the documentation.
The principle is simple. I use GitHub Pages. So I need a branch « gh-pages », which content is what’s online at GitHub for my documentation.
Whenever I commit on that branch, the online page is updated.

However my two branches master and gh-pages doesn’t have the same index. So they can’t be merged !
So I did

git pull origin gh-pages:gh-pages

Thinking « I get the content of my documentation branch ».
And I see a dozen of conflict errors ! WTF as we should say.

And I should have done

git fetch origin gh-pages:gh-pages

The difference between those two commands apparently similar is huge.
Git fetch only gets the datas. Git pull gets them and merges them with the current branch …
So when merging my two branches, as they don’t have the same base, it’s not cool.

Morality : you can git fetch when you want to update your local copy with the last distant commits. The branch on which you do the fetch will have the last commits.
But your working branch won’t be modified.
If you do a pull, not only the branch where you do the fetch will have the last distant commits. But your working branch will also be merged with those last commits.

After a second thought, fetch seems highly more recommandable that pull, which can break a repository pretty easily.

Si j’étais marseillais un verre de ricard à la main, je me serai posé cette question bien plus tôt !
Mais ce n’est pas le cas. Heureusement il n’est jamais trop tard ! ;)

Par habitude, afin de mettre à jour un repository GIT distant, j’utilise git pull.
Ca fonctionne à merveille, tout le monde a ses données à jour et on se croirait presque au pays des bisounours.
Mais Gargamel vient mettre son nez là-dedans (ouais je mélange Schtroumpf et Bisounours. Honte sur moi !).

Ce matin, j’ai voulu, avant de faire la release de la version 1.0.0 de jesus (car il est prêt pour la production), mettre à jour la documentation.
Le principe est simple. J’utilise GitHub Pages. Il me faut donc juste une branche « gh-pages », dont le contenu correspond à ce qui est en ligne chez GitHub pour ma documentation.
Dès que je commit sur cette branche, la page en ligne est mise à jour.

Cependant mes deux branches master et gh-pages n’ont pas le même index. Les deux ne peuvent pas être mergées !
Ce matin, je me vois donc faire un

git pull origin gh-pages:gh-pages

En me disant « comme cela, je récupère le contenu de la branche de documentation ».
Et la je me retrouve avec une dizaine d’erreurs de conflit ! WTF comme dirait l’autre.

Et justement pour le coup, j’aurai du faire un

git fetch origin gh-pages:gh-pages

La différence entre ces deux commandes en apparence similaires est pourtant énorme.
Git fetch ne fait que récupérer les données. Git pull les récupère et fait un merge avec la branche courante …
Du coup merge mes deux branches, vu qu’elles ont pas la même base, c’est pas super cool.

Moralité : vous pouvez faire un git fetch afin de mettre à jour votre copie locale avec les derniers commits distants. La branche sur laquelle vous faites le fetch aura les derniers commits.
Mais votre branche de travail ne sera pas modifiée.
Si vous faites un git pull, non seulement la branche sur laquelle vous faites le fetch aura les derniers commits distants. Mais votre branche de travail sera également mergée avec ces derniers commits.

En y réflechissant bien, fetch est bien plus recommandable que pull, qui peut casser un repository assez facilement.

Je viens de réaliser un screencast sur GIT et la synchronisation multi repositories.
Celui-ci explique :

  • Comment transmettre les données committées sur votre serveur de développement
  • Comment les transmettre sur un système de fichier local (par exemple une clé USB) lorsque vous êtes en hors ligne
  • Comment récupérer les derniers commits distants

Vous pouvez visualiser ce screencast ci-dessous.

 
Fork me on GitHub