her.esy.fun/src/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/index.html
Yann Esposito (Yogsototh) 059fabd7d0
many minor details to update
2022-10-26 11:38:50 +02:00

162 lines
14 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>YBlog - Git ou Bazaar ?</title>
<meta name="keywords" content="git, bzr, DCVS, Bazaar" />
<link rel="shortcut icon" type="image/x-icon" href="../../../../Scratch/img/favicon.ico" />
<link rel="stylesheet" type="text/css" href="../../../../css/y.css" />
<link rel="stylesheet" type="text/css" href="/css/legacy.css" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="apple-touch-icon" href="../../../../Scratch/img/about/FlatAvatar@2x.png" />
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
<!-- IndieAuth -->
<link href="https://twitter.com/yogsototh" rel="me">
<link href="https://github.com/yogsototh" rel="me">
<link href="mailto:yann.esposito@gmail.com" rel="me">
<link rel="pgpkey" href="../../../../pubkey.txt">
</head>
<body lang="fr" class="article">
<div id="content">
<div id="header">
<div id="choix">
<span id="choixlang">
<a href="../../../../Scratch/en/blog/2009-12-14-Git-vs--Bzr/">Anglais</a>
</span>
<span class="tomenu"><a href="#navigation">↓ Menu ↓</a></span>
<span class="flush"></span>
</div>
</div>
<div id="titre">
<h1>Git ou Bazaar ?</h1>
<h2>Pourquoi je suis passé de Bazaar à Git</h2>
</div>
<div class="flush"></div>
<div id="afterheader" class="article">
<div class="corps">
<div class="intro">
<p>Même si je considère que <code>git</code> a beaucoup de points noirs, je pense quil reste le meilleur DCVS à ce jour avec lequel travailler. Cest pourquoi je commencerai par parler des qualité de bazaar qui manquent à git. Ensuite seulement je donnerai le seul avantage de git qui suffit à le rendre préférable à Bazaar.</p>
</div>
<h2 id="la-découverte-des-dcvs">La découverte des DCVS</h2>
<p>À savoir avant de débuter larticle. Je suis, comme beaucoup, un ancien utilisateur de <em>subversion</em>. Je trouve subversion très bien, mais jai été conquis par les capacités supplémentaires apportées par les systèmes de versions concurrentes <em>décentralisés</em>.</p>
<p>Il y a deux façon de percevoir les systèmes de versions. Soit on voit un système de branches (voir le très bon article sur <a href="http://betterexplained.com/articles/a-visual-guide-to-version-control/">betterexplained</a>). Soit on peut voir les systèmes de versions comme des moyens dappliquer des patches. Cest-à-dire que lon peut soit se concentrer sur les nœuds soit sur les transitions du graphe induit par les différentes versions dun projet.</p>
<p>Pour git, cest plutôt ce deuxième point de vue qui a été adopté. Cest un peu normal, étant donné que cest Linus Torvald qui la inventé pour combler les problèmes inhérent aux problèmes de création de code dans le noyau Linux. Et comme historiquement, la communauté Linux se base beaucoup sur les patches, il semblait logique que ce soit ce second point de vue qui soit adopté.</p>
<p>Jai dabord été convaincu par Bazaar. Pourquoi ? Les arguments en faveur de bazaar étaient : facilité dutilisation en particulier, facilité dadaptation pour tous ceux qui étaient habitués à subversion. Comme cétait mon cas, et que lorsque javais essayé de suivre la doc Git à lépoque cétait un peu épique. Puis avec le temps, je me suis dit que je nallais quand même pas mourir idiot et que jallais me mettre sérieusement à <code>git</code> histoire de voir si ses défenseurs avaient vraiment raison.</p>
<p>Mon dieu, que ce fut fastidieux. La terminologie est <em>affreuse</em> ! Et ce nest rien de le dire.</p>
<h2 id="là-où-bazaar-est-meilleur-que-git">Là où Bazaar est meilleur que <code>git</code></h2>
<p>Par exemple, <code>checkout</code> qui sert certainement à la même chose du point de vue technique, est dans lusage un terme employé pour faire des actions qui semblent très différentes à un utilisateur λ. Exemple&nbsp;:</p>
<div>
<code class="zsh"> git checkout pipo </code>
</div>
<p>annule une modification courante du fichier <code>pipo</code></p>
<div>
<code class="zsh"> git checkout pipo </code>
</div>
<p>change de la branche courante vers la branche <code>pipo</code></p>
<p>Et là, comme moi, vous remarquez que la même commande à deux sens complètement différents. Comment ça se passe alors, quand il y a une branche <code>pipo</code> et un fichier <code>pipo</code> alors ? Et bien par défaut, ça change de branche. Pour lever lambigüité il faut utiliser la syntaxe</p>
<div>
<code class="zsh"> git checkout ./pipo </code>
</div>
<p>Oui, bon… Voilà, voilà, voilà….</p>
<p>Ça marche, mais ce nest pas très convivial. Dautant plus que le mot clé checkout signifiait sous CVS et SVN lopération pour récupérer un projet distant.</p>
<p>Là où la différence se creuse cest avec la terminologie Bazaar qui est bien plus naturelle. Car il ny a pas de commande pour changer de branche, puisquil y a une branche par répertoire. Ainsi, pour changer de branche, il suffit de faire <code>cd path/to/branch</code>. Et pour revenir en arrière&nbsp;:</p>
<div>
<code class="zsh"> bzr revert pipo </code>
</div>
<p>De plus, la plupart des commandes bazaar prennent en paramètre un numéro de révision, par exemple pour revenir 3 versions précédentes il suffit décrire&nbsp;:</p>
<div>
<code class="zsh"> bzr revert -r -3 pipo </code>
</div>
<p>Léquivalent sous git est beaucoup plus cryptique&nbsp;:</p>
<div>
<code class="zsh"> bzr checkout HEAD~3 pipo </code>
</div>
<p>Encore un fois, Bazaar est bien plus lisible.</p>
<p>Revenir dans le temps pour tout le projet&nbsp;:</p>
<p>avec Bazaar&nbsp;:</p>
<div>
<code class="zsh"> bzr revert -r -3 pipo </code>
</div>
<p>et avec <code>git</code> ? <code>git checkout</code> ? Bien sûr que non voyons ! Ce serait bien trop simple. Ce que lon trouve dans les forums cest&nbsp;:</p>
<div>
<code class="zsh"> git reset hard HEAD~3 </code>
</div>
<p>Sauf que cette syntaxe est horrible. Elle oublie réellement les révisions. Il faut donc lutiliser avec prudence. Mais en effet, je conseillerai plutôt&nbsp;:</p>
<div>
<code class="zsh"> git checkout HEAD~3 . &amp;&amp; git commit -m back in time </code>
</div>
<p>Histoire davoir la branche backup sous la main, car sinon, on risque de perdre définitivement la version courante de HEAD. Qui ramène la branche locale à ce point. Mais il reste des erreur sil y a eu des ajouts de fichier entre temps. <em>Le seul et lunique vraiment propre de revenir en arrière dans git cest de lancer la commande suivante :</em></p>
<div>
<code class="zsh"> for i in <span class="math inline">(<em>s</em><em>e</em><em>q</em>02);<em>d</em><em>o</em><em>g</em><em>i</em><em>t</em><em>r</em><em>e</em><em>v</em><em>e</em><em>r</em><em>t</em><em>n</em><em>n</em><em>o</em><em>e</em><em>d</em><em>i</em><em>t</em><em>h</em><em>e</em><em>a</em><em>d</em> </span>i; done git commit -m “reverted 3 versions back” </code>
</div>
<p>ce qui signifie sur un système <code>UNIX</code> en <code>zsh</code> (ou <code>bash</code>) faire <code>git revert</code> de toutes les dernières versions. Même si quelquun dautre à fait un pull de vos modification intermédiaire il ne sera pas embêté et il sera au courant de ce quil sest passé.</p>
<p>La règle est simple : <em>Ne JAMAIS utiliser la commande <code>git reset</code> avec une version que dautres personnes auraient pu avoir <code>fetcher</code>.</em></p>
<p>Voilà, cest dit. Découvrir ça ma pris pas mal de temps, avec plein dessai de tous les cotés. Le plus sûr reste toujours la méthode vue plus haut. Si vous souhaitez automatiser cela, le plus simple est dajouter lalias suivant à votre fichier <code>~/.gitconfig</code>. Bien sûr lalias ne fonctionnera que sur les environnement possédant <code>zsh</code>, ce qui est le cas de la plupart des environnements UNIX (Ubuntu, Mac OS X…).</p>
<div>
<code class="zsh" file="gitconfig"> [alias] uncommit = !zsh -c “if ((<span class="math inline">0));<em>t</em><em>h</em><em>e</em><em>n</em><em>n</em><em>b</em>=</span>(( <span class="math inline">01));<em>e</em><em>l</em><em>s</em><em>e</em><em>n</em><em>b</em>=0;<em>f</em><em>i</em>;<em>i</em>=0;<em>w</em><em>h</em><em>i</em><em>l</em><em>e</em>((<em>i</em>&lt;=<em>n</em><em>b</em>));<em>d</em><em>o</em><em>g</em><em>i</em><em>t</em><em>r</em><em>e</em><em>v</em><em>e</em><em>r</em><em>t</em><em>n</em><em>n</em><em>o</em><em>e</em><em>d</em><em>i</em><em>t</em><em>H</em><em>E</em><em>A</em><em>D</em> </span>i; ((i++)); done; git commit -m "revert to $0 version(s) back"”’ </code>
</div>
<h1 id="ce-qui-fait-que-git-est-le-meilleur-dcvs-jusquà-aujourdhui">Ce qui fait que <code>git</code> est le meilleur DCVS jusquà aujourdhui</h1>
<p>Après avoir énoncé les cotés négatifs (et je les trouve nombreux) de git. Voici les cotés positifs qui a eux seul valent la peine de se coltiner tous les problèmes inhérent à <code>git</code>.</p>
<h2 id="cheap-branching">Cheap branching</h2>
<p>Vous travaillez toujours dans le même répertoire principal. Par exemple, vous pouvez travailler sur deux corrections de bug. Disons <code>fix1</code> et <code>fix2</code> nécessitant la modification respective de <code>file1</code> et <code>file2</code>. Vous pouvez travailler dans nimporte quel ordre sur vos deux fichiers dans la branche <code>master</code>. Puis, une fois votre travail fini. Aller dans la branche <code>fix1</code> pour commiter <code>file1</code>. Puis aller dans la branche <code>fix2</code> pour commiter <code>file2</code>. Et enfin, merger les deux branches dans <code>master</code>.</p>
<div>
<code class="zsh"> &gt; vim file1 &gt; vim file2 &gt; git br fix1 &gt; git add file1 &gt; git commit -m fix1 &gt; git br fix2 &gt; git add file2 &gt; git commit -m fix2 &gt; git commit master &gt; git merge fix1 &gt; git merge fix2 </code>
</div>
<p>Et il est vraiment très agréable de ne pas se soucier dêtre dans la <em>bonne</em> branche. Vous navez à vous occuper que de votre code et seulement ensuite vous occuper du système de version.</p>
<p>Sous Bazaar, il mest souvent arriver de coder dans la mauvaise branche. Pour récupérer le coup, on doit copier les modifications du fichier dans la bonne branche et faire un revert sur le fichier en question, puis aller dans la bonne branche pour commiter les modifications. Enfin, la plupart du temps, je me trompe de branche et puis tant pis, je merge les deux tout en sachant que cest sale.</p>
<p>Cest pourquoi je préfère utiliser <code>git</code>. Si Bazaar venait à implémenter ce système de <em>cheap branching</em>, je le replacerai certainement en tête.</p>
</div>
<div id="afterarticle">
<div id="social">
<a href="/rss.xml" target="_blank" rel="noopener noreferrer nofollow" class="social">RSS</a>
·
<a href="https://twitter.com/home?status=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/%20via%20@yogsototh" target="_blank" rel="noopener noreferrer nofollow" class="social">Tweet</a>
·
<a href="http://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/" target="_blank" rel="noopener noreferrer nofollow" class="social">FB</a>
<br />
<a class="message" href="../../../../Scratch/fr/blog/Social-link-the-right-way/">Ces liens sociaux préservent votre vie privée</a>
</div>
<div id="navigation">
<a href="../../../../">Accueil</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/blog">Blog</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/softwares">Logiciels</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/about">Auteur</a>
</div>
<div id="totop"><a href="#header">↑ Top ↑</a></div>
<div id="bottom">
<div>
Published on 2009-12-14
</div>
<div>
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
</div>
<div>
<a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US">Yann Esposito©</a>
</div>
<div>
Done with
<a href="http://www.vim.org" target="_blank" rel="noopener noreferrer nofollow"><strike>Vim</strike></a>
<a href="http://spacemacs.org" target="_blank" rel="noopener noreferrer nofollow">spacemacs</a>
<span class="pala">&amp;</span>
<a href="http://nanoc.ws" target="_blank" rel="noopener noreferrer nofollow"><strike>nanoc</strike></a>
<a href="http://jaspervdj.be/hakyll" target="_blank" rel="noopener noreferrer nofollow">Hakyll</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>