<?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/"
	
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Maestros del Web &#187; Alvaro Cabrera</title>
	<atom:link href="http://www.maestrosdelweb.com/author/pateketrueke/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maestrosdelweb.com</link>
	<description>Un espacio para los entusiastas del web</description>
	<lastBuildDate>Thu, 23 May 2013 18:22:24 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Revisando Cambios en nuestro proyecto</title>
		<link>http://www.maestrosdelweb.com/editorial/git-revisando-cambios/</link>
		<comments>http://www.maestrosdelweb.com/editorial/git-revisando-cambios/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 15:16:08 +0000</pubDate>
		<dc:creator>Alvaro Cabrera</dc:creator>
				<category><![CDATA[Editorial]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[cambios git]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[mi-libreria]]></category>
		<category><![CDATA[repositorio]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/?p=21463</guid>
		<description><![CDATA[Volviendo a nuestro proyecto mi-libreria vamos a echar un vistazo al registro de cambios. Tres herramientas básicas son las que nos facilitan ésta tarea, pero si no hacemos un buen trabajo con los commits se va degradando la utilidad de las mismas. Registrando todo Antes de avanzar hay que revisar nuestro trabajo. Para ello empleamos [...]]]></description>
				<content:encoded><![CDATA[<p>Volviendo a nuestro proyecto <strong>mi-libreria</strong> vamos a echar un vistazo al registro de cambios. Tres herramientas básicas son las que nos facilitan ésta tarea, pero si no hacemos un buen trabajo con los commits se va degradando la utilidad de las mismas.</p>
<h3>Registrando todo</h3>
<p>Antes de avanzar hay que revisar nuestro trabajo. Para ello empleamos <strong>log</strong>.</p>
<p><code>$ git log<br />
commit b7bbecf3622b94e79ac5e5ff37e2beae9cfb28f6<br />
Author:  pateketrueke@gmail.com<br />
Date:   Thu Nov 17 16:17:13 2011 -0600</p>
<p>    El primer spec funciona, y muy bien</p>
<p><code>commit 953de57c91e88ba5641def12b17ba66041971add<br />
Author:  pateketrueke@gmail.com<br />
Date:   Thu Nov 17 15:54:55 2011 -0600</code></p>
<p>    Especificaciones para config()</p>
<p><code>commit 14d857892b6f97be52ef6413d653d937eca5290b<br />
Author:  pateketrueke@gmail.com<br />
Date:   Fri Nov 11 12:31:25 2011 -0600</code></p>
<p>    Primer commit; agregue la estructura de archivos<br />
</code></p>
<p>Si aún no recordamos lo último que hicimos la mejor manera de averiguarlo es revisando los cambios por cada commit hecho.</p>
<h3>El buen hábito</h3>
<p>La utilidad de <strong>log</strong> es tan solo una vista rápida de los cambios, si no escribimos mensajes de commit que hagan sentido pierde su finalidad y tendremos que buscar otras alternativas. Mi rutina comienza por revisar el repo, luego la rama donde me encuentro, la lista de cambios, los cambios individuales y finalmente las diferencias. Todo un ritual.</p>
<p><code>$ git status<br />
# On branch develop<br />
nothing to commit (working directory clean)</p>
<p><code>$ git branch<br />
* develop<br />
  master</code></p>
<p>$ git log<br />
...<br />
</code></p>
<p>Tampoco hay que ser tan estricto, nadie tiene tan mala memoria como yo.</p>
<h3>Lo siento git pero, ¿Qué acabo de hacer?</h3>
<p>Si deseamos observar los últimos cambios registrados en el commit mas reciente debemos usar <strong>show</strong> sin argumentos.</p>
<p><code>...<br />
$ git show</p>
<p><code>commit b7bbecf3622b94e79ac5e5ff37e2beae9cfb28f6<br />
Author:  pateketrueke@gmail.com<br />
Date:   Thu Nov 17 16:17:13 2011 -0600</code></p>
<p>    El primer spec funciona, y muy bien</p>
<p>diff --git a/include/funciones.php b/include/funciones.php<br />
index efea0e2..438a62c 100644<br />
--- a/include/funciones.php<br />
+++ b/include/funciones.php<br />
@@ -12,3 +12,30 @@ config(array('clave' =&gt; 'valor'));<br />
 config(function ($t) {<br />
   $t-&gt;clave = 'valor';<br />
 });<br />
+<br />
+<br />
+/* Contenedor estático de configuraciones */<br />
+<br />
+function config($key = NULL, $val = NULL) {<br />
+  static $bag = array();<br />
+<br />
+  if (func_num_args() === 0) {<br />
+    // Si no hay argumentos devolvemos la configruación<br />
+    return $bag;<br />
+  } elseif (is_string($key)) {<br />
+    if (func_num_args() === 1) {<br />
+      // Si solo hay un argumento devolvemos la opción (getter)<br />
+      return isset($bag[$key]) ? $bag[$key] : NULL;<br />
+    } else {<br />
+      // Si hay dos argumentos asignamos un único valor (setter)<br />
+      $bag[$key] = $val;<br />
+    }<br />
+  }<br />
+<br />
+  // TODO: implementar los specs restantes<br />
+}<br />
+<br />
+<br />
+/* Pruebas */<br />
+<br />
+print_r(config());<br />
</code></p>
<p>La herramienta <strong>show</strong> puede mostrarnos cualquier cambio hecho, que en realidad es la diferencia del commit especificado contra el anterior. Si deseamos ver la diferencia en otro punto del historial debemos especificar también el hash del commit que buscamos.</p>
<p><code>$ git show 953de57<br />
commit 953de57c91e88ba5641def12b17ba66041971add<br />
Author:  pateketrueke@gmail.com<br />
Date:   Thu Nov 17 15:54:55 2011 -0600</p>
<p>    Especificaciones para config()</p>
<p><code>diff --git a/include/funciones.php b/include/funciones.php<br />
index 8b13789..efea0e2 100644<br />
--- a/include/funciones.php<br />
+++ b/include/funciones.php<br />
@@ -1 +1,14 @@<br />
+&lt;?php</code></p>
<p>+/* Especificaciones */<br />
+<br />
+# asignación sencilla<br />
+config('clave', 'valor');<br />
+<br />
+# asignación múltiple<br />
+config(array('clave' =&gt; 'valor'));<br />
+<br />
+# asignación múltiple (fancy)<br />
+config(function ($t) {<br />
+  $t-&gt;clave = 'valor';<br />
+});<br />
</code></p>
<p>Observamos precisamente lo que hicimos antes, tan solo las especificaciones.</p>
<h3>Las diferencias marcan el cambio</h3>
<p>Bien, la utilidad de diferencia es significativamente crucial al momento de hacer commit. Nos detenemos en un punto después de programar intensivamente aquella característica que hará increíble nuestro software pero de pronto no recordamos lo que hemos hecho&#8230; ¿les ha pasado algo igual?</p>
<p>En nuestro archivo <strong>include/funciones.php</strong> tenemos un error de ortografía, nada trivial. Así que simplemente lo corregimos y revisamos nuestros pasos con <strong>diff</strong>.</p>
<p><code>$ git diff<br />
diff --git a/include/funciones.php b/include/funciones.php<br />
index 438a62c..cee6be7 100644<br />
--- a/include/funciones.php<br />
+++ b/include/funciones.php<br />
@@ -20,7 +20,7 @@ function config($key = NULL, $val = NULL) {<br />
   static $bag = array();</p>
<p>   if (func_num_args() === 0) {<br />
-    // Si no hay argumentos devolvemos la configruación<br />
+    // Si no hay argumentos devolvemos la configuración<br />
     return $bag;<br />
   } elseif (is_string($key)) {<br />
     if (func_num_args() === 1) {<br />
</code></p>
<p>Con esto ya nos damos una idea de lo que sucedió, así que simplemente lo indicamos en nuestro mensaje de commit y guardamos los cambios para conservar la referencia de que tan malos solos en gramática.</p>
<p><code>$ git commit -am "Error ortografico hombre, tu tranqui"<br />
[develop d4ad04e] Error ortografico hombre, tu tranqui<br />
 1 files changed, 1 insertions(+), 1 deletions(-)<br />
</code></pre>
<p>Al igual que show, la utilidad diff acepta distintos tipos de argumentos. Siempre podremos comparar un commit contra cualquier otro sin importar si son consecutivos o no. ¡Haz la prueba!</p>
<p><code>$ git diff 14d8578 b7bbecf<br />
...<br />
</code></p>
<h3>Resumen</h3>
<ul>
<li>Cada <strong>commit</strong> nos abre la posibilidad de revisar dicho cambio cuando se nos<br />
de la gana, al inspeccionar un bug, analizar las mejoras del software, calcular el tiempo de trabajo invertido, etc.</li>
<li>Revisar nuestros commits nos permite conocer mejor el software que desarrollamos, ayuda a reflexionar sobre la calidad del mismo y también a vislumbrar el rumbo de nuestros proyectos entre otras cosas.</li>
<li>Un registro de cambios eficiente se fundamenta no solo en los cambios de código, sino también en los humanos que revisan el código.</li>
</ul>
<p>De verdad que es genial leer código bien desarrollado. O bien explicado.</p>
<blockquote><p>
  No por nada GitHub es considerado, eso pienso, una representación colectiva de arte moderno.
</p></blockquote>
<p><strong>Repositorio</strong>: <a href="https://github.com/pateketrueke/mi-libreria/">Mi libreria</a></p>
<hr /><p style="height: 64px;"><img alt='Alvaro Cabrera' src='http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&amp;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&amp;r=G' class='avatar avatar-64 photo' height='64' width='64' style="float:left;padding:0 5px" /> <strong>Alvaro Cabrera</strong> para <a href="http://www.maestrosdelweb.com">Maestros del Web</a>.<br /><a href="http://www.maestrosdelweb.com/editorial/git-revisando-cambios/#respond">Agrega tu comentario</a> | <a href="http://www.maestrosdelweb.com/editorial/git-revisando-cambios/">Enlace permanente</a> al artículo</p><hr style="clear: both;"/>
		<p><strong>Síguenos en:</strong> <img src="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" style="vertical-align:middle;"> <a href="http://twitter.com/maestros">@maestros</a> | <img style="vertical-align:middle;" src="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png"> <a href="http://facebook.com/maestrosdelweb">Fan page</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/git-revisando-cambios/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:thumbnail url="http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&#38;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&#38;r=G" />
		<media:content url="http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&#38;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&#38;r=G" medium="image">
			<media:title type="html">Alvaro Cabrera</media:title>
		</media:content>
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" medium="image" />
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png" medium="image" />
	</item>
		<item>
		<title>Ramificaciones e integración de cambios en Git</title>
		<link>http://www.maestrosdelweb.com/editorial/git-ramificaciones-integracion-de-cambios/</link>
		<comments>http://www.maestrosdelweb.com/editorial/git-ramificaciones-integracion-de-cambios/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 07:00:44 +0000</pubDate>
		<dc:creator>Alvaro Cabrera</dc:creator>
				<category><![CDATA[Editorial]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[integracion git]]></category>
		<category><![CDATA[ramificaciones]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/?p=21340</guid>
		<description><![CDATA[Ya hemos visto como crear un repositorio con Git, también hemos hecho un par de commits bastante básicos. Ahora quiero hablar un poco acerca de las ramas en Git y básicamente que utilidad tienen, que es bastante. El proyecto mi libreria solo es la estructura de archivos y no tenemos nada de código aún, ¿Cómo [...]]]></description>
				<content:encoded><![CDATA[<p>Ya hemos visto como <a href="http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios">crear un repositorio con Git</a>, también hemos hecho un par de commits bastante básicos. Ahora quiero hablar un poco acerca de las ramas en Git y básicamente que utilidad tienen, que es bastante. El proyecto <a href="https://github.com/pateketrueke/mi-libreria">mi libreria</a> solo es la estructura de archivos y no tenemos nada de código aún, ¿Cómo continuar con el desarrollo?</p>
<blockquote><p>Lo ideal es que siempre trabajemos la versión estable de nuestros proyectos en la rama <strong>master</strong> que es el estándar bajo el ecosistema Gitero. Es posible usar otro nombre de rama pero como un amigo mío dijo &#8220;las convenciones existen por algo, si no las sigues es síntoma de que un proyecto OpenSource fracase.</p></blockquote>
<h3>Preparativos</h3>
<p>La rama que vamos a crear y utilizar intensivamente en el desarrollo es conocida como <strong>develop</strong>, a partir de esa rama podemos desprender otras ramas para desarrollar otras características de nuestro software sin afectar el desarrollo principal, ni mucho menos la versión estable del repositorio.</p>
<p>Para mostrar las ramas existentes localmente ejecutamos:</p>
<p><code>$ git branch<br />
* master</code></p>
<p>Entonces creamos la rama develop:</p>
<p><code>$ git branch develop<br />
$ git branch<br />
  develop<br />
* master<br />
</code></p>
<p>El asterisco al inicio del nombre de una rama nos indica que estamos actualmente en dicha rama, para cambiar entre ramas debemos usar <strong>checkout</strong>:</p>
<p><code>$ git checkout develop<br />
Switched to branch 'develop'</code></p>
<p>Bien, ahora si podemos comenzar el desarrollo de nuestro proyecto desde la rama develop. ¿No les parece genial?</p>
<h3>Ramas inferiores</h3>
<p>Es recomendable crear ramas cuando los cambios que llevemos a cabo tenga una relación entre sí, digamos, si vamos a editar tan solo nuestros archivos en <strong>include/</strong> sería conveniente crear una rama exclusivamente para los cambios realizados ahí.</p>
<blockquote>
<p>No es obligatorio, pero de verdad mas adelante descubrirán el poder que existe al separar nuestros cambios sin la posibilidad de afectar a otros archivos.</p>
</blockquote>
<p>Así pues, vamos a crear una rama llamada <strong>include-specs</strong> a partir de nuestra rama actual (develop) donde describiremos lo que haga nuestro software:</p>
<p><code>$ git checkout -b include-specs<br />
Switched to a new branch 'include-specs'<br />
</code></p>
<p>Este sería el contenido de nuestro archivo <strong>include/funciones.php</strong>:</p>
<p><code>&lt;?php<br />
/* Especificaciones */<br />
# asignación sencilla<br />
config('clave', 'valor');<br />
# asignación múltiple<br />
config(array('clave' =&gt; 'valor'));<br />
# asignación múltiple (fancy)<br />
config(function ($t) {<br />
  $t-&gt;clave = 'valor';<br />
});<br />
</code></p>
<p>La bandera <strong>-b</strong> de <strong>checkout</strong> nos permite crear una nueva rama basada en la rama actual y cambiar a ella, usualmente es un atajo que nos ahorra el trabajo de hacer lo siguiente:</p>
<p><code>$ git branch include-specs<br />
$ git checkout include-specs<br />
Switched to a new branch 'include-specs'</code></p>
<p>Revisamos los cambios con status:</p>
<p><code>$ git status<br />
# On branch include-specs<br />
# Changes not staged for commit:<br />
#   (use "git add &lt;file&gt;..." to update what will be committed)<br />
#   (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)<br />
#<br />
#   modified:   include/funciones.php<br />
#<br />
no changes added to commit (use "git add" and/or "git commit -a")</code></p>
<p>Hacemos commit y revisamos cambios de nuevo:</p>
<p><code>$ git commit -am "Especificaciones para config()"<br />
1 files changed, 13 insertions(+), 0 deletions(-)<br />
$ git status<br />
# On branch include-specs<br />
nothing to commit (working directory clean)</code></p>
<h3>Más cambios, por favor</h3>
<p>Excelente, ya sabemos crear ramas y realizar cambios que solo permanezcan ahí, para comprobarlo cambiamos a la rama <strong>develop</strong> y revisamos el contenido del archivo que modificamos en <strong>include-specs</strong>:</p>
<p><code>$ git checkout develop<br />
$ cat include/funciones.php<br />
</code></p>
<p>No hay nada, y eso es bueno, quiere decir que vamos bien. Ahora necesitamos comenzar a implementar la función <code>config()</code> para posteriormente hacer pruebas y si todo funciona como esperamos combinamos el resultado a nuestra rama develop.</p>
<p>Cambiamos de nuevo a la rama <strong>include-specs</strong> y agregamos lo siguiente a nuestro script de funciones:</p>
<p><code>/* Contenedor estático de configuraciones */</p>
<p>function config($key = NULL, $val = NULL) {<br />
  static $bag = array();</p>
<p>  if (func_num_args() === 0) {<br />
    // Si no hay argumentos devolvemos la configuración<br />
    return $bag;<br />
  } elseif (is_string($key)) {<br />
    if (func_num_args() === 1) {<br />
      // Si solo hay un argumento devolvemos la opción (getter)<br />
      return isset($bag[$key]) ? $bag[$key] : NULL;<br />
    } else {<br />
      // Si hay dos argumentos asignamos un único valor (setter)<br />
      $bag[$key] = $val;<br />
    }<br />
  }<br />
  // TODO: implementar los specs restantes<br />
}<br />
/* Pruebas */<br />
print_r(config());</code></p>
<p>Verificamos la sintaxis y ejecutamos el script desde la consola:</p>
<p><code>$ php -l include/funciones.php<br />
No syntax errors detected in include/funciones.php<br />
$ php include/funciones.php<br />
Array<br />
(<br />
    [clave] =&gt; valor<br />
)</code></p>
<p>El script funciona, no en su totalidad, pero cumple al menos una de las especificaciones que contemplamos en nuestro script inicialmente.</p>
<p>Si no queremos perder los cambios que llevamos hasta este punto vamos a hacer commit y no más.</p>
<p><code>$ git commit -am "El primer spec funciona, y muy bien"<br />
 1 files changed, 27 insertions(+), 0 deletions(-)<br />
</code></p>
<p>Las banderas <strong>-am</strong> nos permiten agregar automáticamente los archivos modificados y establecer un mensaje para el commit.</p>
<h3>Integrando los cambios, gracias</h3>
<p>Hemos creado ya la rama <strong>develop</strong>, una auxiliar <strong>include-specs</strong> para separar los cambios en porciones y ya verificamos que nuestro código cumple las expectativas que nos planteamos. Entonces ya es tiempo de formalizar todo esto y llevar los cambios hacía la rama de desarrollo, hay que utilizar <strong>merge</strong> para finalizar nuestro trabajo del día de hoy:</p>
<p><code>$ git checkout develop<br />
Switched to branch 'develop'<br />
$ git merge include-specs<br />
Updating 14d8578..cfdd6ae<br />
Fast-forward<br />
 include/funciones.php |   40 ++++++++++++++++++++++++++++++++++++++++<br />
 1 files changed, 40 insertions(+), 0 deletions(-)<br />
</code></p>
<p>Y ahí tenemos, nuestros cambios realizados en la rama auxiliar los hemos integrado a la rama oficial de desarrollo.</p>
<p>Integrar cambios es lo más sencillo del mundo si mantenemos la calma y trabajamos en orden, despacio y por partes, si nos ponemos a editar y mover mucho código en una sola sesión de commits cuando intentemos mezclar los cambios nos vamos a encontrar conflictos. Tampoco son complicados de solucionar cuando hablamos de un solo archivo, pero bueno, creo que ya se darán una mejor idea cuando toquemos el tema.</p>
<p><strong>¡Buen trabajo!</strong></p>
<blockquote>
<p>Es importante notar que no trabajamos directamente sobre la rama develop, mucho menos aún con la rama master. Aunque hay quienes les gusta arriesgar su trabajo poniendo en riesgo la integridad y estabilidad de su software pero no es conveniente hacer todo en un solo sitio, para eso están diseñadas las ramas y efectivamente funcionan. No hay que ser extremista tampoco, pero de verdad, un poco de sentido común basta.</p>
</blockquote>
<p>Aunque por ahora no hemos terminado de usar la rama <strong>include-specs</strong> vamos a suponer que ya no sirve, pues nuestro código se encuentra estable y necesitamos eliminar referencias innecesarias. Veamos lo siguiente para ejemplificar:</p>
<p><code>$ git branch experimental<br />
$ git branch -d experimental<br />
Deleted branch experimental (was cfdd6ae).<br />
</code></p>
<h3>Resumen</h3>
<ul>
<li>Así como un commit debe ser considerado atómico, una rama debe tratarse como un conjunto de dichos átomos, es decir, una forma de agrupar cambios en común y no más.</li>
<li>Es sencillo pensar en ramas cuando agregamos alguna funcionalidad a nuestro software, de hecho es la manera sugerida para su utilización.</li>
</ul>
<p>Por ahora no vamos a profundizar a detalle sobre banderas y opciones de cada comando así como ningún tipo de técnica avanzada. La idea de estos ejercicios es mostrar el flujo de trabajo mas sencillo posible que se puede llevar a cabo con Git. Hay escenarios mas complejos y cuando se trabaja con más de una persona pueden suceder cosas complicadas, pero no hay que temer, Git es el salvador de nuestro código.</p>
<p>Github: <a href="https://github.com/pateketrueke/mi-libreria">Mi librería.</a></p>
<hr /><p style="height: 64px;"><img alt='Alvaro Cabrera' src='http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&amp;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&amp;r=G' class='avatar avatar-64 photo' height='64' width='64' style="float:left;padding:0 5px" /> <strong>Alvaro Cabrera</strong> para <a href="http://www.maestrosdelweb.com">Maestros del Web</a>.<br /><a href="http://www.maestrosdelweb.com/editorial/git-ramificaciones-integracion-de-cambios/#respond">Agrega tu comentario</a> | <a href="http://www.maestrosdelweb.com/editorial/git-ramificaciones-integracion-de-cambios/">Enlace permanente</a> al artículo</p><hr style="clear: both;"/>
		<p><strong>Síguenos en:</strong> <img src="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" style="vertical-align:middle;"> <a href="http://twitter.com/maestros">@maestros</a> | <img style="vertical-align:middle;" src="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png"> <a href="http://facebook.com/maestrosdelweb">Fan page</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/git-ramificaciones-integracion-de-cambios/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:thumbnail url="http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&#38;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&#38;r=G" />
		<media:content url="http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&#38;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&#38;r=G" medium="image">
			<media:title type="html">Alvaro Cabrera</media:title>
		</media:content>
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" medium="image" />
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png" medium="image" />
	</item>
		<item>
		<title>Primeros pasos en Git: Creación y gestión de repositorios</title>
		<link>http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios/</link>
		<comments>http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 16:00:02 +0000</pubDate>
		<dc:creator>Alvaro Cabrera</dc:creator>
				<category><![CDATA[Editorial]]></category>
		<category><![CDATA[GIT]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linus torvalds]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://www.maestrosdelweb.com/?p=18800</guid>
		<description><![CDATA[Git es un sistema de control de versiones que se centra en la velocidad, &#8220;diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.&#8221; Hoy iniciamos una serie de artículos en donde nos concentraremos en conocer el [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://es.wikipedia.org/wiki/Git">Git</a> es un sistema de control de versiones que se centra en la velocidad, &#8220;diseñado por <a href="http://www.maestrosdelweb.com/editorial/linus/">Linus Torvalds</a>, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.&#8221; </p>
<p><img src="http://www.maestrosdelweb.com/images/2011/08/cintillo-git.jpg" alt="Git-logo" /></p>
<p>Hoy iniciamos una serie de artículos en donde nos concentraremos en conocer el flujo de trabajo (workflow) básico para llevar a cabo el versionado de nuestros proyectos.</p>
<p>El proyecto de ejemplo se puede consultar directamente en su repositorio de GitHub, en el cual colocaré un tag por cada articulo, para que sean fácil de reconocer los avances.</p>
<h3>¿Como lo consigo?</h3>
<p>Asumo que ya tenemos instalado Git en nuestro sistema, es fácil conseguirlo si tenemos alguna distribución Linux u OS X, cualquier sistema basado en *nix funciona excelente. Después de <a href="http://git-scm.com/download">instalar Git</a> hay que configurar nuestros datos básicos:</p>
<p><code>$ git config --global user.name "Mi nombre"<br />
$ git config --global user.email "mi@correo.com" </code></p>
<p>Considero que los primeros pasos que debemos concretar tienen que ver en la creación y gestión de un repositorio de forma local, a nivel bastante básico veremos como iniciar nuestros repositorios y registrar cambios en el historial de Git.</p>
<p>Por si mismo, Git es una herramienta con una curva de aprendizaje pronunciada, si no disciplinamos nuestro flujo de trabajo a la par de Git es muy posible que nos encontremos en problemas casi todo el tiempo. No hay que temer, si llevamos un orden y aprendemos a registrar nuestros cambios casi de forma atómica es poco probable que ocurra algo que lamentar.</p>
<h3>Creando nuestro repositorio</h3>
<p>Cualquier carpeta de nuestro sistema puede ser un contenedor o repositorio para Git, en dicho lugar se establecerá la configuración e historial bajo una carpeta nombrada <strong>.git</strong> que se encuentra oculta.</p>
<p>Para crear un repositorio no es necesario empezar desde cero con nuestro proyecto, de hecho podemos iniciar uno aún cuando ya tenemos nuestro código en estado avanzado. Por ejemplo, tenemos la estructura de un sistema o librería sencilla:</p>
<p><code>  /proyectos/mi-libreria<br />
  /proyectos/mi-libreria/include<br />
  /proyectos/mi-libreria/include/sistema.class.php<br />
  /proyectos/mi-libreria/include/funciones.php<br />
  /proyectos/mi-libreria/index.php<br />
</code></p>
<p>Solo hay que ubicarnos en la carpeta y ejecutar <strong>git init</strong> para crear el repositorio:</p>
<p><code>$ cd /proyectos/mi-libreria<br />
$ git init</p>
<p>Initialized empty Git repository in /proyectos/mi-libreria/.git/<br />
</code></p>
<h3>Registrar y guardar archivos</h3>
<p>Cada repositorio guarda un historial de los cambios que hemos ido realizando en nuestro proyecto, ejecutando <strong>git status</strong> podemos verificar los cambios hechos en el estado actual:</p>
<p><code>$ git status</p>
<p># On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Untracked files:<br />
#   (use "git add &lt;file&gt;..." to include in what will be committed)<br />
#<br />
#    include/<br />
#    index.php<br />
nothing added to commit but untracked files present (use "git add" to track)<br />
</code></p>
<p>En el ejemplo notamos que nos hace falta registrar los archivos contenidos en la raíz de nuestro proyecto, ahora vamos a agregarlos:</p>
<p><code>$ git add .<br />
$ git status</p>
<p># On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Changes to be committed:<br />
#   (use "git rm --cached &lt;file&gt;..." to unstage)<br />
#<br />
#    new file:   include/funciones.php<br />
#    new file:   include/sistema.class.php<br />
#    new file:   index.php<br />
#<br />
</code></p>
<p>He usado <strong>git add .</strong> pues el punto indica la ruta actual y, por defecto, Git agrega recursivamente al emplear ésta instrucción con una carpeta como argumento. Desde luego es posible agregar archivos individualmente con solo especificar la ruta relativa con relación a la raíz del repositorio, por ejemplo:</p>
<p><code>$ git add include/funciones.php<br />
</code></p>
<p>Finalmente debemos dar por hechos los cambios que llevamos en el repositorio, entonces ejecutamos <strong>git commit</strong> para confirmarlo:</p>
<p><code>$ git commit -m "Primer commit; agregue la estructura de archivos"</p>
<p>[master (root-commit) 0034116] Primer commit; agregue la estructura de archivos<br />
3 files changed, 3 insertions(+), 0 deletions(-)<br />
create mode 100644 include/funciones.php<br />
create mode 100644 include/sistema.class.php<br />
create mode 100644 index.php<br />
</code></p>
<p>Verificamos que todo esté en orden con <strong>git status</strong> de nuevo:</p>
<p><code>$ git status</p>
<p># On branch master<br />
nothing to commit (working directory clean)<br />
</code></p>
<p>Supongamos que la frecuencia de los cambios que realizamos a nuestro código determina la cantidad de <em>commits</em> que podemos efectuar en el repositorio. Lo ideal sería que por cada nuevo cambio significativo en el código o estructura de archivos, registremos lo que hicimos agregando los archivos afectados con una descripción puntual, breve y clara de lo realizado.</p>
<p>Si por ejemplo hay que mover un archivo de lugar, o simplemente le cambiamos de nombre debemos asegurarnos de tener el historial de cambios limpio antes de proceder.</p>
<h3>Resumen</h3>
<ul>
<li>
<p>Un repositorio en Git es un registro de cambios hechos a través del tiempo que sirve para llevar un orden progresivo con respecto al desarrollo de algún proyecto, básicamente código fuente y documentos.</p>
</li>
<li>
<p>Cada archivo agregado, renombrado, editado o eliminado debe ser registrado para no perder el orden de los cambios en nuestro proyecto; pensar en un cambio a la vez es fundamental.</p>
</li>
</ul>
<p>En los siguientes artículos iremos viendo estos dos puntos a detalle, sobre todo el manejo de ramas a nivel básico usando <strong>branch</strong>, <strong>checkout</strong>, <strong>rebase</strong> y <strong>merge</strong> para lograr un flujo de trabajo mas flexible así como diversas técnicas y recomendaciones para un registro de cambios mas efectivo con <strong>commit</strong>, <strong>cherry-pick</strong>, <strong>reset</strong>, <strong>diff</strong>, <strong>show</strong> y <strong>log</strong>.</p>
<p>Una vez tengamos dominado el flujo de trabajo básico de manera local podremos continuar con la obtención, publicación y actualización de repositorios con <strong>remote</strong>, <strong>fetch</strong>, <strong>pull</strong> y <strong>push</strong>.</p>
<p><strong>Github:</strong> <a href="https://github.com/pateketrueke/mi-libreria">Mi libreria</a></p>
<hr /><p style="height: 64px;"><img alt='Alvaro Cabrera' src='http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&amp;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&amp;r=G' class='avatar avatar-64 photo' height='64' width='64' style="float:left;padding:0 5px" /> <strong>Alvaro Cabrera</strong> para <a href="http://www.maestrosdelweb.com">Maestros del Web</a>.<br /><a href="http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios/#respond">Agrega tu comentario</a> | <a href="http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios/">Enlace permanente</a> al artículo</p><hr style="clear: both;"/>
		<p><strong>Síguenos en:</strong> <img src="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" style="vertical-align:middle;"> <a href="http://twitter.com/maestros">@maestros</a> | <img style="vertical-align:middle;" src="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png"> <a href="http://facebook.com/maestrosdelweb">Fan page</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.maestrosdelweb.com/editorial/primeros-pasos-git-creacion-gestion-repositorios/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:thumbnail url="http://www.maestrosdelweb.com/images/2011/08/cintillo-git.jpg" />
		<media:content url="http://www.maestrosdelweb.com/images/2011/08/cintillo-git.jpg" medium="image">
			<media:title type="html">Git-logo</media:title>
		</media:content>
		<media:content url="http://1.gravatar.com/avatar/33a95eb0bf5fff65a20d776ad340c85f?s=64&#38;d=http%3A%2F%2Fwww.maestrosdelweb.com%2Fwp-content%2Fthemes%2Fmdw2%2Fimages%2Fno-avatar64.png%3Fs%3D64&#38;r=G" medium="image">
			<media:title type="html">Alvaro Cabrera</media:title>
		</media:content>
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/twitter.png" medium="image" />
		<media:content url="http://www.maestrosdelweb.com/diseno/imagenes/facebook.png" medium="image" />
	</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached
Database Caching 18/25 queries in 0.017 seconds using memcached
Object Caching 676/720 objects using memcached

 Served from: www.maestrosdelweb.com @ 2013-05-23 13:15:14 by W3 Total Cache -->