scratch/output/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/index.html

318 lines
18 KiB
HTML
Raw Normal View History

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<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="/Scratch/assets/css/main.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/twilight.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/idc.css" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://feeds.feedburner.com/yannespositocomfr"/>
<link rel="alternate" lang="fr" xml:lang="fr" title="Git ou Bazaar ?" type="text/html" hreflang="fr" href="/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/" />
<link rel="alternate" lang="en" xml:lang="en" title="Git vs. Bzr" type="text/html" hreflang="en" href="/Scratch/en/blog/2009-12-14-Git-vs--Bzr/" />
<script type="text/javascript" src="/Scratch/js/jquery-1.3.1.min.js"></script>
<script type="text/javascript" src="/Scratch/js/jquery.cookie.js"></script>
<script type="text/javascript" src="/Scratch/js/index.js"></script>
2010-11-17 10:10:55 +00:00
<!-- < % if containMaths %>
<script type="text/javascript" src="/Scratch/js/MathJax/MathJax.js"></script>
< % end %>
-->
<title>Git ou Bazaar ?</title>
</head>
<body lang="fr">
<script type="text/javascript">// <![CDATA[
document.write('<div id="blackpage"><img src="/Scratch/img/loading.gif" alt="Chargement en cours..."/></div>');
// ]]>
</script>
<div id="content">
2010-09-27 18:49:15 +00:00
<div id="choix">
<div class="return"><a href="#entete">&darr; Menu &darr;</a></div>
<div id="choixlang">
<a href="/Scratch/en/blog/2009-12-14-Git-vs--Bzr/" onclick="setLanguage('en')">in English</a>
</div>
</div>
<img src="/Scratch/img/presentation.png" alt="Presentation drawing"/>
<div id="titre">
<h1>
Git ou Bazaar ?
</h1>
<h2>
Pourquoi je suis passé de Bazaar à Git
</h2>
</div>
<div class="flush"></div>
<div class="flush"></div>
<div id="afterheader">
<div class="corps">
<div class="intro">
<p>Même si je considère que <code>git</code> a beaucoup de points noirs, je pense qu&rsquo;il reste le meilleur DCVS à ce jour avec lequel travailler. C&rsquo;est 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-dcouverte-des-dcvs">La découverte des DCVS</h2>
<p>À savoir avant de débuter l&rsquo;article. Je suis, comme beaucoup, un ancien utilisateur de <em>subversion</em>. Je trouve subversion très bien, mais j&rsquo;ai é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 d&rsquo;appliquer des patches. C&rsquo;est-à-dire que l&rsquo;on peut soit se concentrer sur les nœuds soit sur les transitions du graphe induit par les différentes versions d&rsquo;un projet.</p>
<p>Pour git, c&rsquo;est plutôt ce deuxième point de vue qui a été adopté. C&rsquo;est un peu normal, étant donné que c&rsquo;est Linus Torvald qui l&rsquo;a 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>J&rsquo;ai d&rsquo;abord été convaincu par Bazaar. Pourquoi&nbsp;? Les arguments en faveur de bazaar étaient&nbsp;: facilité d&rsquo;utilisation en particulier, facilité d&rsquo;adaptation pour tous ceux qui étaient habitués à subversion. Comme c&rsquo;était mon cas, et que lorsque j&rsquo;avais essayé de suivre la doc Git à l&rsquo;époque c&rsquo;était un peu épique.
Puis avec le temps, je me suis dit que je n&rsquo;allais quand même pas mourir idiot et que j&rsquo;allais 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>&nbsp;! Et ce n&rsquo;est 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 l&rsquo;usage un terme employé pour faire des actions qui semblent très différentes à un utilisateur λ. Exemple&nbsp;:</p>
<div><pre class="twilight">
git checkout pipo
</pre></div>
<p>annule une modification courante du fichier <code>pipo</code></p>
<div><pre class="twilight">
git checkout pipo
</pre></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&nbsp;? Et bien par défaut, ça change de branche. Pour lever l&rsquo;ambigüité il faut utiliser la syntaxe </p>
<div><pre class="twilight">
git checkout ./pipo
</pre></div>
<p>Oui, bon&hellip; Voilà, voilà, voilà&hellip;.</p>
<p>Ça marche, mais ce n&rsquo;est pas très convivial. D&rsquo;autant plus que le mot clé checkout signifiait sous CVS et SVN l&rsquo;opération pour récupérer un projet distant.</p>
<p>Là où la différence se creuse c&rsquo;est avec la terminologie Bazaar qui est bien plus naturelle. Car il n&rsquo;y a pas de commande pour changer de branche, puisqu&rsquo;il 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><pre class="twilight">
bzr revert pipo
</pre></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&rsquo;écrire&nbsp;:</p>
<div><pre class="twilight">
bzr revert -r -3 pipo
</pre></div>
<p>L&rsquo;équivalent sous git est beaucoup plus cryptique&nbsp;:</p>
<div><pre class="twilight">
bzr checkout HEAD~3 pipo
</pre></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><pre class="twilight">
bzr revert -r -3 pipo
</pre></div>
<p>et avec <code>git</code>&nbsp;? <code>git checkout</code>&nbsp;? Bien sûr que non voyons&nbsp;! Ce serait bien trop simple. Ce que l&rsquo;on trouve dans les forums c&rsquo;est&nbsp;:</p>
<div><pre class="twilight">
git reset --hard HEAD~3
</pre></div>
<p>Sauf que cette syntaxe est horrible. Elle oublie &lsquo;réellement&rsquo; les révisions. Il faut donc l&rsquo;utiliser avec prudence. Mais en effet, je conseillerai plutôt&nbsp;:</p>
<div><pre class="twilight">
git checkout HEAD~3 -- . <span class="Keyword">&amp;&amp;</span> git commit -m <span class="String"><span class="String">'</span>back in time<span class="String">'</span></span>
</pre></div>
<p>Histoire d&rsquo;avoir 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 s&rsquo;il y a eu des ajouts de fichier entre temps. <em>Le seul et l&rsquo;unique vraiment propre de revenir en arrière dans git c&rsquo;est de lancer la commande suivante&nbsp;:</em></p>
<div><pre class="twilight">
<span class="Keyword">for</span> i <span class="Keyword">in</span> <span class="String"><span class="String">$(</span>seq 0 2<span class="String">)</span></span><span class="Keyword">;</span> <span class="Keyword">do</span>
git revert -n --no-edit head~<span class="Variable"><span class="Variable">$</span>i</span><span class="Keyword">;</span>
<span class="Keyword">done</span>
git commit -m <span class="String"><span class="String">&quot;</span>reverted 3 versions back<span class="String">&quot;</span></span>
</pre></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 quelqu&rsquo;un d&rsquo;autre à fait un pull de vos modification intermédiaire il ne sera pas embêté et il sera au courant de ce qu&rsquo;il s&rsquo;est passé.</p>
<p>La règle est simple&nbsp;: <em>Ne JAMAIS utiliser la commande <code>git reset</code> avec une version que d&rsquo;autres personnes auraient pu avoir <code>fetcher</code>.</em></p>
<p>Voilà, c&rsquo;est dit. Découvrir ça m&rsquo;a pris pas mal de temps, avec plein d&rsquo;essai 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 d&rsquo;ajouter l&rsquo;alias suivant à votre fichier <code>~/.gitconfig</code>. Bien sûr l&rsquo;alias 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&hellip;).</p>
<div><div class="code"><div class="file"><a href="/Scratch/fr/blog/2009-12-14-Git-vs--Bzr/code/gitconfig"> &#x27A5; gitconfig </a></div><div class="withfile">
<pre class="twilight">
[alias]
uncommit = <span class="Keyword">!</span>zsh -c <span class="String"><span class="String">'</span>&quot;if (($0)); then nb=$(( $0 - 1 )); else nb=0; fi; i=0; while ((i&lt;=nb)); do git revert -n --no-edit HEAD~$i; ((i++)); done; git commit -m \&quot;revert to $0 version(s) back\&quot;&quot;<span class="String">'</span></span>
</pre>
</div></div></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&rsquo;à aujourd&rsquo;hui</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 n&rsquo;importe 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><pre class="twilight">
<span class="Keyword">&gt;</span> vim file1
<span class="Keyword">&gt;</span> vim file2
<span class="Keyword">&gt;</span> git br fix1
<span class="Keyword">&gt;</span> git add file1
<span class="Keyword">&gt;</span> git commit -m <span class="String"><span class="String">'</span>fix1<span class="String">'</span></span>
<span class="Keyword">&gt;</span> git br fix2
<span class="Keyword">&gt;</span> git add file2
<span class="Keyword">&gt;</span> git commit -m <span class="String"><span class="String">'</span>fix2<span class="String">'</span></span>
<span class="Keyword">&gt;</span> git commit master
<span class="Keyword">&gt;</span> git merge fix1
<span class="Keyword">&gt;</span> git merge fix2
</pre></div>
<p>Et il est vraiment très agréable de ne pas se soucier d&rsquo;être dans la <em>bonne</em> branche. Vous n&rsquo;avez à vous occuper que de votre code et seulement ensuite vous occuper du système de version.</p>
<p>Sous Bazaar, il m&rsquo;est 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 c&rsquo;est sale.</p>
<p>C&rsquo;est 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="choixrss">
<a id="rss" href="http://feeds.feedburner.com/yannespositocomfr">
s'abonner
</a>
</div>
<script type="text/javascript">
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
document.write('<div id="clickcomment">Commentaires</div>');
</script>
<div class="flush"></div>
<div class="corps" id="comment">
<h2 class="first">commentaires</h2>
<noscript>
2010-10-26 14:49:21 +00:00
Vous devez activer javascript pour commenter.
</noscript>
<script type="text/javascript">
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
2010-12-21 16:18:52 +00:00
var idcomments_post_id = '/Scratch/fr/blog/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/fr/blog/';
</script>
<span id="IDCommentsPostTitle" style="display:none"></span>
<script type='text/javascript' src='/Scratch/js/genericCommentWrapperV2.js'></script>
</div>
<div id="entete" class="corps_spaced">
<div id="liens">
2011-01-06 14:09:34 +00:00
<ul><li><a href="/Scratch/fr/">Bienvenue</a></li>
<li><a href="/Scratch/fr/blog/">Blog</a></li>
2010-09-30 13:01:14 +00:00
<li><a href="/Scratch/fr/softwares/">Softwares</a></li>
2010-09-28 01:00:51 +00:00
<li><a href="/Scratch/fr/about/">À propos</a></li></ul>
</div>
<div class="flush"></div>
<hr/>
<div id="next_before_articles">
<div id="previous_articles">
articles précédents
<div class="previous_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2009-12-06-iphone-call-filter/"><span class="nicer">«</span>&nbsp;Filtrage d'appel avec l'iPhone</a>
</div>
<div class="previous_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2009-11-12-Git-for-n00b/"><span class="nicer">«</span>&nbsp;Git pour les nuls</a>
</div>
<div class="previous_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2009-10-30-How-to-handle-evil-IE/"><span class="nicer">«</span>&nbsp;Une CSS pour IE seulement</a>
</div>
</div>
<div id="next_articles">
articles suivants
<div class="next_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2010-01-04-Change-default-shell-on-Mac-OS-X/">Changer le shell par défaut sous Mac OS X&nbsp;<span class="nicer">»</span></a>
</div>
<div class="next_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2010-01-12-antialias-font-in-Firefox-under-Ubuntu/">Fontes adoucies sous Ubuntu Firefox&nbsp;<span class="nicer">»</span></a>
</div>
<div class="next_article">
2010-09-28 15:10:12 +00:00
<a href="/Scratch/fr/blog/2010-02-15-All-but-something-regexp/">Expression régulière pour tout sauf quelquechose&nbsp;<span class="nicer">»</span></a>
</div>
</div>
<div class="flush"></div>
</div>
</div>
<div id="bottom">
<div>
<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.fr">Droits de reproduction ©, Yann Esposito</a>
</div>
<div id="lastmod">
2010-08-31 13:06:43 +00:00
Écrit le : 14/12/2009
2010-09-02 09:51:46 +00:00
modifié le : 09/05/2010
</div>
<div>
Site entièrement réalisé avec
<a href="http://www.vim.org">Vim</a>
et
<a href="http://nanoc.stoneship.org">nanoc</a>
</div>
<div>
<a href="/Scratch/fr/validation/">Validation</a>
<a href="http://validator.w3.org/check?uri=referer"> [xhtml] </a>
.
<a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3"> [css] </a>
.
<a href="http://validator.w3.org/feed/check.cgi?url=http%3A//yannesposito.com/Scratch/fr/blog/feed/feed.xml">[rss]</a>
</div>
</div>
<div class="clear"></div>
</div>
</body>
</html>