<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ArthurGeek.net &#187; scm</title>
	<atom:link href="http://www.arthurgeek.net/tag/scm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.arthurgeek.net</link>
	<description>Rails, Mac... e Rock'n Roll!</description>
	<lastBuildDate>Sat, 20 Dec 2008 23:25:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Git Bisect</title>
		<link>http://www.arthurgeek.net/git-bisect/</link>
		<comments>http://www.arthurgeek.net/git-bisect/#comments</comments>
		<pubDate>Fri, 23 May 2008 19:27:00 +0000</pubDate>
		<dc:creator>ArthurGeek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bisect]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[scm]]></category>

		<guid isPermaLink="false">http://www.arthurgeek.net/2008/05/23/git-bisect</guid>
		<description><![CDATA[Você conhece o git bisect?
É uma das features mais interessantes do Git. E até hoje, eu nunca tinha usado o bisect. Mas o que ele faz? De acordo com o próprio site: “Find the change that introduced a bug by binary search”. Interessante, não?
Como funciona?
O bisect ajuda a encontrar quando um bug foi introduzido no [...]]]></description>
			<content:encoded><![CDATA[<p>Você conhece o <a href="http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html">git bisect</a>?</p>
<p>É uma das features mais interessantes do Git. E até hoje, eu nunca tinha usado o bisect. Mas o que ele faz? De acordo com o próprio site: <strong>“Find the change that introduced a bug by binary search”</strong>. Interessante, não?</p>
<h3>Como funciona?</h3>
<p>O bisect ajuda a encontrar quando um bug foi introduzido no seu código, marcando pontos nos commits como <em>‘bons’</em> e <em>‘ruins’</em>, e examinando commits intermediários usando um algoritmo de busca binária que vai eliminando metade dos commits cada vez que você marca um commit como <em>‘bom’</em> ou <em>‘ruim’</em>.</p>
<h3>Exemplo</h3>
<p>Suponha que tenhamos um projeto com o seguinte log:</p>
<pre><code>commit 7dd0f15d4e9a5fc1f625c0ac6e4788de45e0c40f
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 17:36:27 2008 -0300

    Commit 20

commit dc358142a0deb6e1ba8e15f55f5e851e7bcc1ecf
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:50:44 2008 -0300

    Commit 19

commit 648160ea61e194f97c8e11a35866025dca46c9a4
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:34:38 2008 -0300

    Commit 18

commit 786a02663af9aa8eed533ab574b79294eddff4fc
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:34:22 2008 -0300

    Commit 17

commit 9b76092b44f714d780a45e99532593da7b744801
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 16:14:08 2008 -0300

    Commit 16

commit a00ef3d4e836af6777350a5f157132a255804e67
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 11:33:45 2008 -0300

    Commit 15

commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson &lt;bart@simpsons.com&gt;
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

commit 67022233899f78aee7f120337f1ec434d238f23f
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Wed May 21 11:30:31 2008 -0300

    Commit 13

commit 21b8739f2ff271baa492d358e426ea1fc87bb7d7
Merge: ecc25a6... 00560d4...
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Tue May 20 19:32:29 2008 -0300

    Commit 12

commit 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Author: Homer Simpson &lt;homer@simpsons.com&gt;
Date:   Tue May 20 17:11:56 2008 -0300

    Commit 11</code></pre>
<p>Nós temos uma funcionalidade que funcionava no <em>Commit 11</em>, mas que no <em>Commit 20</em> não funciona, porém, não sabemos em que momento este bug foi introduzido. Mentira, eu sei que foi o Bart quem introduziu o bug no <em>Commit 14</em>, mas vamos supor que nós não sabemos disso ainda! :)</p>
<h3>E agora, o Git poderá nos socorrer?</h3>
<p>Aqui é que entra o bisect.</p>
<pre><code>$ git bisect start
$ git bisect bad
$ git bisect good 00560d4b5ff1a2d463bfa19ba3d6346566db8e12
Bisecting: 4 revisions left to test after this
[a00ef3d4e836af6777350a5f157132a255804e67] Commit 15</code></pre>
<p>Nós dizemos ao git que o commit atual é <em>‘bad’</em>. E que o <em>Commit 11</em> estava ok (passando o hash identificador do <em>Commit 11</em>). Sendo assim, o Git escolhe um ponto intermediário entre os 2 commits, resultando no <em>Commit 15</em>.</p>
<p>Nós testamos o sistema, e vimos que o bug já estava presente nesta versão, assim, ou ele foi introduzido neste commit ou antes dele. Se o bug não estivesse presente nesta versão, significa que ele foi introduzido depois. De qualquer maneira, eliminaremos a necessidade de checar metade dos commits.</p>
<p>Vamos dizer ao git que esta versão é <em>‘bad’</em>:</p>
<pre><code>$ git bisect bad
Bisecting: 2 revisions left to test after this
[21b8739f2ff271baa492d358e426ea1fc87bb7d7] Commit 12
$</code></pre>
<p>O Git nos leva até o <em>Commit 12</em>, nós analisamos novamente e o bug não estava presente nesta versão, então, podemos dizer que esta versão é <em>‘good’</em>.</p>
<pre><code>$ git bisect good
Bisecting: 1 revisions left to test after this
[526be2a6b652df597e4d5b7670d58e7f0767e2e3] Commit 14
$</code></pre>
<p>Voltamos ao processo novamente e descobrimos que esta versão estava <em>‘bugada’</em>.</p>
<pre><code>$ git bisect bad
Bisecting: 0 revisions left to test after this
[67022233899f78aee7f120337f1ec434d238f23f] Commit 13</code></pre>
<p>Agora, se esta versão estiver ok, o bug foi introduzido no <em>Commit 14</em>, visto que já dissemos que os commits 12 e 15 estavam ok. Testamos, e esta versão encontra-se ok.</p>
<pre><code>$ git bisect good
526be2a6b652df597e4d5b7670d58e7f0767e2e3 is first bad commit
commit 526be2a6b652df597e4d5b7670d58e7f0767e2e3
Author: Bart Simpson &lt;bart@simpsons.com&gt;
Date:   Wed May 21 11:30:50 2008 -0300

    Commit 14

:040000 040000 58adb210b90786fb300ae1d0f3b478adbe643fb0 4adb482917754cb560e3f0f586c4a0739ebab373 M    file.rb</code></pre>
<p>Sendo assim, o Git nos informa que o <em>Commit 14</em> é o primeiro <em>‘bad’</em> commit e que o bug foi introduzido ali. Após ter encontrado o bug, rodamos:</p>
<pre><code>$ git bisect reset</code></pre>
<p>E agora, podemos corrigir o bug. E reclamar com o Bart que foi quem introduziu ele! :)</p>
<p>Neste caso, era um intervalo de apenas 10 commits, mas se fosse um intervalo maior, o bisect também ajudaria, visto que ele usa um algoritmo de busca binária.</p>
<p>É ou não é, sensacional? :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arthurgeek.net/git-bisect/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
