<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Juan Carrillo - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Juan Carrillo - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 13 May 2026 20:04:25 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/juanca/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo pararte en hombros de gigantes ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por: Quincy Larson [https://www.freecodecamp.org/news/author/quincylarson/] Artículo original: How to stand on the shoulders of giants [https://www.freecodecamp.org/news/how-to-stand-on-shoulders-16e8cfbc127b/] Traducido y adaptado por: Juan Carrillo [/espanol/news/author/juancarrillo/] > "Si he visto más lejos que otros, es por pararme en hombros de gigantes" — Isaac Newton En 1676, Isaac Newton habló de los ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-pararte-en-hombros-de-gigantes/</link>
                <guid isPermaLink="false">61b940c1c859ba091c01dabf</guid>
                
                    <category>
                        <![CDATA[ Tecnología ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Tue, 04 Jan 2022 18:39:49 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/12/stand-on-the-shoulders.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original escrito por</strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong> </strong><a href="https://www.freecodecamp.org/news/author/quincylarson/">Quincy Larson</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong> </strong></strong><a href="https://www.freecodecamp.org/news/how-to-stand-on-shoulders-16e8cfbc127b/">How to stand on the shoulders of giants</a><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por</strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong> </strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/juancarrillo/">Juan Carrillo</a></p><blockquote>"Si he visto más lejos que otros, es por pararme en hombros de gigantes" <strong><strong>— </strong></strong>Isaac Newton</blockquote><p>En 1676, Isaac Newton habló de los grandes pensadores que le precedieron como "gigantes". Sus ideas le ayudaron a descubrir nuevas ideas propias.</p><p>345 años después, los gigantes son mucho más altos. Están por todas partes, no sólo en los libros, como en la época de Newton. Están en revistas académicas abiertas. En proyectos de código abierto. Conjuntos de datos abiertos.</p><p>Con una conexión a Internet, puedes pararte en los hombros de todos los gigantes que quieras.</p><p>Pero la mayoría de la gente no se da cuenta de todo lo que vería si se molestara en subir. La mayoría de la gente piensa que puede ver lo suficiente desde donde ya está parado. La subida no parece que valga la pena.</p><p>Antes de pararte en los hombros de gigantes, hay que aceptar que no ves todo. Tienes que reconocer lo mucho que hay ahí fuera y que solo esos gigantes pueden mostrarte.</p><h3 id="ubuntu">Ubuntu</h3><blockquote>"Soy lo que soy por lo que somos todos." — Traducción al español de la palabra Zulú "Ubuntu"</blockquote><p>Incluso en la oscuridad de la prehistoria humana, empezamos a descubrir algunas cosas interesantes.</p><p>Comenzaron a surgir los gigantes, montados en la tradición oral. Luego los libros.</p><p>Hemos acumulado conocimientos sobre conocimientos. Y los gigantes crecieron.</p><p>A lo largo de los eones, descubrimos algunas ideas muy buenas y construimos algunas cosas muy buenas. Cosas que valen la pena usar.</p><p>Pero cada día, miles de personas ignoran estas cosas. Dicen: "Ya sé, voy a construir esta nueva cosa desde cero".</p><p>Y se embarcan en un costoso viaje para construir sus sueños desde cero.</p><p>Gastamos mucho dinero en software. Alrededor del <a href="https://www.idc.com/getdoc.jsp?containerId=prUS41006516">60%</a> de los 2.5 billones de dólares que gastamos en tecnología cada año se destina al desarrollo de software y a los servicios de consultoría de software.</p><p>Eso es un <em>billón y medio</em> de dólares. Suficiente para adquirir Instagram 1,500 veces. Cada año.</p><p>Y no siempre <a href="https://www.zdnet.com/article/ten-budget-busting-it-disasters-you-should-learn-from/">obtenemos el valor de nuestro dinero</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/12/image-1.png" class="kg-image" alt="Vitrales de la catedral de Chartes" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/12/image-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/12/image-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="425" loading="lazy"><figcaption>La catedral de Chartes debe su nombre a Bernardo de Chartre, el erudito del siglo XII que observó por primera vez que "estamos parados en hombros de gigantes". Los vitrales del sur de la catedral representan a eruditos a hombros de eruditos.</figcaption></figure><h3 id="no-inventado-aqu-not-invented-here-">No inventado aquí (Not invented here)</h3><p>Los humanos tenemos un exceso de confianza. Creemos que podemos reinventar la rueda y que nuestra versión será mejor.</p><p>Quién sabe, tal vez la rueda pueda mejorarse. Pero si tratamos de diseñar algo más complicado, como un coche, ¿realmente queremos pasar todo el tiempo reinventando ruedas?</p><p>Está en nuestra naturaleza querer construir las cosas nosotros mismos.</p><p>Nos encantan los productos integrados verticalmente, como los Ferraris, los Rolex y los iPhones.</p><p>Admiramos el trabajo artesanal que se realiza en cada detalle.</p><p>Nos maravilla cómo el diseño, la fabricación y la distribución fluyen juntos en un proceso controlado.</p><p>Y también queremos toda esa pila para nosotros.</p><p>Pero al hacerlo, caemos presa de una mentalidad paralizante llamada "No inventado aquí".</p><blockquote>"El síndrome 'No inventado aquí' es la tendencia de un grupo de proyecto a creer que posee el monopolio del conocimiento de su campo, lo que le lleva a rechazar nuevas ideas de personas ajenas a él, en probable detrimento de su rendimiento." — Ralph Katz y Thomas J. Allen, de la Sloan School of Management del MIT</blockquote><p>Aquí está el PDF del <a href="https://dspace.mit.edu/bitstream/handle/1721.1/1961/SWP-1114-08905619.pdf">artículo más citado</a> sobre Not Invented Here (publicado originalmente en 1982), por si quieres informarte sobre la gravedad de sus conclusiones.</p><p>Lo que no dice este documento es que, 39 años después, seguimos cayendo en el mismo sesgo cognitivo de siempre.</p><p>Un ejemplo reciente de No inventado aquí es la plataforma de cursos en línea Swayam, de la India. Podrían haberse limitado a construir sobre la plataforma de cursos de código abierto de edX de forma gratuita. <a href="https://openedx.atlassian.net/wiki/spaces/COMM/pages/162245773/Sites+powered+by+Open+edX+Platform">Decenas de otras organizaciones</a> lo hicieron, incluida la popular plataforma china XuetangX.</p><p>En su lugar, Swayam gastó 6 millones de dólares en construir una plataforma propia. Y gastarán millones más en los próximos años para mantener esta solución personalizada.</p><p>Puede que no parezca mucho dinero, pero pon esa cifra en el contexto de los 30 millones de dólares que se presupuestaron para pagar a los profesores que crearon los cursos. Y esto también retrasó su fecha de lanzamiento en dos años.</p><p>No inventado aquí comienza de forma bastante inocente...</p><blockquote>"¿Por qué deberíamos usar WordPress para nuestro blog? Los blogs no son difíciles. Construyamos nuestro propio CMS".</blockquote><p>Entonces la gente se pone más atrevida y empieza a pensar...</p><blockquote>"¿Por qué deberíamos usar Sugar CRM para hacer un seguimiento de los donantes? El seguimiento de los donantes no es difícil. Construyamos nuestro propio CRM".</blockquote><p>Lo que sólo anima a la gente a proponer cosas como:</p><blockquote>"¿Por qué deberíamos usar AWS? La nube no es difícil. Construyamos nuestro propio centro de datos e implementemos nuestra propia nube privada".</blockquote><p>Si no se controla, esta mentalidad puede conducir a proyectos como HealthCare.gov, un proyecto de 90 millones de dólares que acabó costando 1,700 millones a los contribuyentes estadounidenses.</p><p>Yo fui uno de los millones de personas que perdieron horas de su vida intentando contratar un seguro médico, sólo para verme frustrado por errores de JavaScript y servidores que no responden.</p><p>En medio del colapso de Healthcare.gov, tres desarrolladores de San Francisco decidieron tomar algunos componentes disponibles. Integraron algunas APIs públicas. Construyeron partes importantes de la funcionalidad de Healthcare.gov. Y lo hicieron en unas pocas semanas, por unos <a href="http://www.cnn.com/2013/11/11/tech/web/alternate-healthcare-site/">pocos cientos de dólares</a>.</p><h3 id="una-historia-de-pararse-en-los-hombros-de-gigantes-la-m-a-">Una historia de pararse en los hombros de gigantes. La mía.</h3><p>Hace siete años, quise crear una comunidad en la que las personas ocupadas pudieran aprender a programar juntas.</p><p>Acababa de pasar 18 meses construyendo una enorme solución a la medida: un motor de recomendación de cursos que resultó que nadie quería usar.</p><p>Así que decidí ir en la dirección opuesta. Escribiría tan poco código como fuera necesario y me centraría en utilizar el código de otras personas.</p><p>¿Qué necesitaba la comunidad?</p><ol><li>Una forma de comunicarse entre sí</li><li>Un blog en el que todos pudieran compartir sus ideas e historias personales</li><li>Un plan de estudios y una forma de seguir el progreso de las personas a través de él</li></ol><p>El viejo "no inventado aquí" de mí habría hecho lo siguiente:</p><ol><li>Construí una sala de chat usando web sockets, luego construí las herramientas de moderación, varias integraciones de API, y descubrí una buena manera de persistir los mensajes a través de las sesiones.</li><li>Construí un blog desde cero, me ocupé de cuestiones de diseño como la legibilidad, el etiquetado, la incrustación y las funciones básicas que la gente espera, como RSS.</li><li>Construí un CMS personalizado para los retos de programación interactivos, luego construí el sistema de perfiles, y después <strong>diseñé e implementé un plan de estudios de programación básico</strong>.</li></ol><p>Este último paso probablemente me habría llevado años hacerlo por mi cuenta.</p><p>Y antes de que me digas "en estos tiempos, nadie es tan tonto como para crear su propio blog"... pues parece que yo sí lo fui, porque pasé unos días haciéndolo. Unos días que nunca recuperaré.</p><p>Pero esto es lo que el nuevo yo — recién salido de un descenso de 18 meses al infierno de no inventado aquí — decidió hacer.</p><p>En ese momento no conocía Node.js. Pero conocía a gente inteligente que me convenció de que el full Stack JavaScript era el futuro.</p><p>También conocía el <a href="https://github.com/sahat/hackathon-starter">Hackathon Starter</a>, un popular boilerplate de Node.js de código abierto. Así que hice un fork de él.</p><p>Como me había pasado los últimos 18 meses recopilando, auditando y clasificando miles de cursos en línea, sabía cuáles eran los que mejor cubrían la programación y la informática. Así que, en lugar de diseñar un plan de estudios, he seleccionado los recursos existentes.</p><p>Para la sala de chat, sólo usé HipChat. Para el blog, sólo usé Blogger.</p><p>Y en 3 días, la nueva comunidad estaba en marcha.</p><p>Es difícil predecir cómo evolucionará una solución con el tiempo. Se aprende mucho cuando se manda a producción la maldita cosa.</p><p>Si empiezas inmediatamente a utilizar soluciones estándar, puedes cambiarlas más tarde y ajustar las cosas sobre la marcha.</p><p>Con el tiempo, nuestra comunidad ha hecho miles de pequeños ajustes basados en los comentarios. También hemos trasladado nuestras salas de chat a Gitter y el blog de nuestra comunidad a <a href="https://www.freecodecamp.org/news/we-just-abandoned-our-blog-for-medium-you-probably-should-too-33e742a1d49/">Medium</a>.</p><p>Una vez que tuvimos una masa crítica de colaboradores de código abierto, nos pusimos a trabajar en el diseño e implementación de nuestro propio plan de estudios de 1,200 horas.</p><p>Hoy, más de 5,000 personas de nuestra comunidad han aprendido a programar lo suficientemente bien como para conseguir sus primeros trabajos de desarrollador.</p><p>Pero si no me hubiera resistido a mis tendencias de "No inventado aquí", nunca habría conseguido que las cosas despegaran.</p><h3 id="c-mo-pararte-en-los-hombros-de-gigantes">Cómo pararte en los hombros de gigantes</h3><p>Te dejo con tres sencillos consejos para aprovechar al máximo los miles de años de conocimientos que tienes a tu alcance.</p><h3 id="consejo-1-aprende-a-reconocer-el-no-inventado-aqu-en-ti-mismo-y-en-los-dem-s-">Consejo #1: Aprende a reconocer el "No inventado aquí" en ti mismo y en los demás.</h3><p>Aceptar que está en nuestra naturaleza querer construir cosas por nosotros mismos. El lado luminoso de esto es un aficionado que construye sus propios muebles. El lado oscuro es un desarrollador que <a href="http://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own ">lanza su propia seguridad</a>.</p><h3 id="consejo-2-conoce-las-herramientas-que-existen-">Consejo #2: Conoce las herramientas que existen.</h3><p>La forma más fácil de entender qué tipos de herramientas están disponibles es seguir haciendo lo que estás haciendo ahora mismo: leer sobre tecnología.</p><p>La mayoría de <a href="https://github.com/search?utf8=%E2%9C%93&amp;q=stars%3A%3E0&amp;type=Repositories&amp;ref=searchresults">los principales proyectos de código abierto</a> están en GitHub, donde puedes ver su documentación. Puedes desplegar muchas de estas herramientas <a href="https://bitnami.com/stacks">en minutos</a> en tu propio servidor en la nube.</p><h3 id="consejo-3-lee-sobre-historia-">Consejo #3: Lee sobre historia.</h3><p>Seguro que tu profesor de historia de la preparatoria te citó esto, y tenía razón:</p><blockquote>"Los que no leen sobre historia están condenados a repetirla". — George Santayana en 1905</blockquote><p>Hay muchos libros excelentes sobre la historia de la tecnología. Recomiendo este de Walter Isaacson, el mismo que escribió las famosas biografías de Albert Einstein y Steve Jobs. Trata específicamente de la historia del software:</p><p><a href="http://amzn.to/2aZVCR6" rel="noopener"><strong><strong>The Innovators: How a Group of Hackers, Geniuses, and Geeks Created the Digital Revolution</strong></strong></a></p><p>Los gigantes están deseando subirte a sus hombros. Déjalos. Te darán una visión de cuántos problemas hay todavía ahí fuera, esperando que vayas a resolverlos.</p><p><strong>Sólo escribo sobre programación y tecnología. Si me <a href="https://twitter.com/ossia">sigues en Twitter</a> no te haré perder el tiempo. ?</strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sentencia SQL Update — Ejemplo de Consultas para Actualizar los Valores de una Tabla ]]>
                </title>
                <description>
                    <![CDATA[ SQL (pronunciado Seequel) significa lenguaje de consulta estructurado (Structured Query Language). Es un lenguaje de consulta fuertemente tipado [https://es.wikipedia.org/wiki/Tipado_fuerte] (los tipos se comprueban antes del tiempo de ejecución) y estático que apareció por primera vez en 1974 (¡Woah, 46 años!), pero no se publicó inicialmente hasta 1986. Podrías pensar que ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/declaracion-sql-update/</link>
                <guid isPermaLink="false">600476b4a4e0700982a9e6ee</guid>
                
                    <category>
                        <![CDATA[ SQL ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Mon, 08 Mar 2021 05:05:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/markus-winkler-cxoR55-bels-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>SQL (pronunciado Seequel) significa lenguaje de consulta estructurado (Structured Query Language). Es un lenguaje de consulta <a href="https://es.wikipedia.org/wiki/Tipado_fuerte">fuertemente tipado</a> (los tipos se comprueban antes del tiempo de ejecución) y estático que apareció por primera vez en 1974 (¡Woah, 46 años!), pero no se publicó inicialmente hasta 1986.</p><p>Podrías pensar que una herramienta tan "vieja" tienes sus mejores días detrás de ella, pero estarías lejos de estar en lo cierto. En 2019, a través de la <a href="https://scalegrid.io/blog/2019-database-trends-sql-vs-nosql-top-databases-single-vs-multiple-database-use/">encuesta de Scale Grid DeveloperWeek</a>, SQL fue utilizado por el 60.5% de los encuestados, mientras que <a href="https://es.wikipedia.org/wiki/NoSQL">NoSQL</a> fue utilizado por solo el 39.5% de los encuestados.</p><p>Para ser claros, la categoría SQL se dividió en varias subcategorías que incluían <a href="https://es.wikipedia.org/wiki/MySQL">MySQL</a>, <a href="https://es.wikipedia.org/wiki/PostgreSQL">PostgreSQL</a>, <a href="https://es.wikipedia.org/wiki/Microsoft_SQL_Server">SQL Server</a>, etc., mientras que la categoría NoSQL se dividió en subcategorías que contenían <a href="https://es.wikipedia.org/wiki/MongoDB">MongoDB</a>, <a href="https://es.wikipedia.org/wiki/Apache_Cassandra">Cassandra</a>, etc.</p><p>Incluso en 2017, según la <a href="https://insights.stackoverflow.com/survey/2017">Stack Overflow Developer's Survey</a>, el segundo lenguaje más utilizado fue SQL (justo detrás de JavaScript) con el 50% de los 64,000 encuestados diciendo que todavía utilizan SQL en alguna forma.</p><p>Su popularidad se debe, al menos en parte, a la simplicidad del lenguaje, al hecho de que fue construido con datos relacionales en mente, y porque ha demostrado ser fiable para buscar, unir y filtrar datos.</p><p>Basta con decir que SQL no sólo está vivito y coleando, sino que prospera entre la comunidad de desarrollo de hoy en día.</p><p>¡Ahora vamos a ver por qué!</p><h2 id="las-partes-divertidas">Las partes divertidas</h2><p>SQL Server es el sabor preferido de SQL que utilizo en mis actividades cotidianas en el trabajo, por lo que los ejemplos siguientes se ajustarán a esas normas.</p><p>Una de las cosas que más me gusta hacer es actualizar varios registros dentro de una tabla. Ahora podría hacer este registro de uno en uno, pero SQL nos da la capacidad de actualizar múltiples (miles y miles si es necesario) registros a la vez a través de la declaración <code>UPDATE</code>.</p><p>La declaración <code>UPDATE</code> puede utilizarse para actualizar una sola columna, un conjunto más amplio de registros (mediante el uso de condiciones), y/o toda la tabla en una base de datos. La(s) condición(es) puede(n) ser un booleano, una verificación de cadena de texto o una secuencia matemática que se resuelve en un booleano (mayor que, menos que, etc.).</p><p>Aunque puede variar ligeramente de un sabor a otro, la sintaxis general es la siguiente:</p><pre><code class="language-SQL">UPDATE nombre-de-la-tabla
SET nombre-de-la-columna = valor[, nombre-de-la-columna=valor]
[WHERE condición]</code></pre><p>Los corchetes ( [] ) de arriba denotan adiciones opcionales a la consulta.</p><p><strong><u>***Es muy importante tener en cuenta que sin la condición de WHERE, TODOS los registros de la tabla se actualizarán tan pronto como se ejecute la consulta.***</u></strong></p><h2 id="consultas-de-ejemplo">Consultas de ejemplo</h2><p>Como nuestro conjunto de datos, usaré esta tabla llamada <em><strong>Work_Tickets</strong></em>:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
            <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
            <td>1250</td> 
              <td>sales@wayneindustries.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>  
              <td>contact@starkindustries.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>0.00</td>
            <td>False</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td></tr></tbody></table><!--kg-card-end: html--><!--kg-card-begin: html--><table><tbody><tr><td></td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="consulta-simple-sin-condiciones">Consulta simple sin condiciones</h4><p>Aquí hay una consulta de actualización muy simple que cambiará todos los campos de <code>UnitCost</code> al número <code>131.6152</code>:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET UnitCost = 131.6152</code></pre><p>Nota que no hay cláusula de <code>WHERE</code>, así que cada línea de la tabla se actualizará y nuestro conjunto de datos se verá así:</p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>False</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="consultas-simples-con-condici-n-es-">Consultas simples con condición(es)</h4><p>Aquí hay una simple consulta con una declaración de condición:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET Billed = true
WHERE UnitCost &lt;&gt; 0.00</code></pre><p>Esta consulta actualizará el campo de <code>Billed</code> para que sea <em>true</em> en cada línea que coincida con la condición de <code>UnitCost</code> no igual a 0. Después de ejecutar nuestra consulta, el conjunto de datos se verá así:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085569</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><p>Abajo hay una consulta en la que cambiamos el <code>ParentLineKey</code> por la cadena <code>000134</code> en la que el <code>SalesOrderNum</code> y el <code>WorkTicketNum</code> coinciden con las cadenas dadas.</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET ParentLineKey = 000134
WHERE SalesOrderNum = 00061358 and WorkTicketNumber = 000933</code></pre><p>Así que, el 085569 en el campo <code>ParentLineKey</code> será reemplazado por 000134 y nuestro conjunto de datos ahora se ve así:</p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
            <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>000134</td>
            <td>17.5</td>
            <td>0</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="actualizando-m-ltiples-campos">Actualizando múltiples campos</h4><p>Digamos que tienes un conjunto de datos mucho más grande que el que estamos usando actualmente y tienes varios campos para actualizar.</p><p>Sería tedioso y aburrido actualizarlos con diferentes declaraciones de actualización. Por suerte para nosotros también es posible actualizar varios campos a la vez con una declaración de actualización (update), siempre y cuando separemos los nombres de las columnas con una coma:</p><pre><code class="language-SQL">UPDATE Work_Tickets
SET UnitCost = 129.8511, Qty_Ordered = 72, Qty_Shipped = 72
WHERE SalesOrderNum = 00061358</code></pre><p>Y aquí está el resultado con los campos actualizados después de ejecutar la consulta:</p><!--kg-card-begin: html--><table><tbody><tr><td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>129.8511</td>
            <td>True</td>
            <td>000134</td>
            <td>72</td>
            <td>72</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><h4 id="usando-update-en-una-subconsulta">Usando Update en una subconsulta</h4><p>Los ejemplos anteriores son perfectos si se trabaja con una sola fuente de datos. Sin embargo, la mayoría de tus datos no se almacenarán en una sola tabla. Ahí es donde el uso de <em>UPDATE </em>con múltiples fuentes de datos es útil.</p><p>La sintaxis para actualizar una columna/tabla cambia un poco si queremos traer datos de otra tabla:</p><pre><code class="language-SQL">UPDATE nombre-de-la-tabla
SET nombre-de-la-columna = (SELECT nombre de columna(s)
FROM nombre-de-la-tabla2
WHERE condición(es))
[WHERE condición]</code></pre><p>Y aquí están las dos tablas que usaremos para esta consulta - la <strong>tabla</strong> <strong><em>Work_Tickets</em></strong><em>:</em></p><!--kg-card-begin: html--><table><tbody><tr><th>
          </th></tr><tr>
            <td><strong>SalesOrderNum</strong></td>
            <td><strong>WorkTicketNum</strong></td>
              <td><strong>Customer_Code</strong></td>
              <td><strong>Customer_Contact</strong></td>
            <td><strong>UnitCost</strong></td>
            <td><strong>Billed</strong></td>
            <td><strong>ParentLineKey</strong></td>
            <td><strong>Qty_Ordered</strong></td>
            <td><strong>Qty_Shipped</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>00061356</td>
            <td>000931</td>
              <td>1250</td>
              <td>sales@wayneindustires.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>079777</td>
            <td>12.0</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061357</td>
            <td>000932</td>
              <td>1251</td>
              <td>contact@starkindustries.com</td>
            <td>131.6152</td>
            <td>True</td>
            <td>085695</td>
            <td>196.5</td>
            <td>0</td>
          </tr>
          <tr>
            <td>00061358</td>
            <td>000933</td>
              <td>1252</td>
              <td>animation@acmetoons.com</td>
            <td>129.8511</td>
            <td>True</td>
            <td>000134</td>
            <td>72</td>
            <td>72</td>
          </tr>
        </tbody>
      </table><!--kg-card-end: html--><p>y la <strong>tabla <em>Customer_Info</em></strong><em>:</em></p><!--kg-card-begin: html--><table><tbody><tr><th></th></tr><tr>
            <td><strong>Name</strong></td>
            <td><strong>Industry</strong></td>
            <td><strong>Code</strong></td>
            <td><strong>Address</strong></td>
              <td><strong>City</strong></td>
            <td><strong>Discount</strong></td>
            <td><strong>PhoneNumber</strong></td>
            <td><strong>Email</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>Wayne Enterprises</td>
            <td>Defense,weaponry,aerospace,enginerring</td>
            <td>NULL</td>
            <td>1631 Dark Knight Way</td>
            <td>Gotham</td>
            <td>19.75</td>
            <td>5556614000</td>
              <td>sales@wayneindustires.com</td>
          </tr>
          <tr>
            <td>Stark Industries</td>
            <td>Defense,weaponry,protection</td>
              <td>1251</td>
            <td>5641 Iron Dr</td>
            <td>Undisclosed</td>
            <td>19.73</td>
            <td>9993126156</td>
            <td>contact@starkindustries.com</td>
          </tr>
          <tr>
            <td>Acme Corp</td>
            <td>Comedy,laughter,animation</td>
            <td>1252</td>
            <td>24569 Smiling St</td>
            <td>Toon Town</td>
            <td>17.53</td>
            <td>3216549877</td>
              <td>animation@acmetoons.com
          </td></tr>
        </tbody>
      </table><!--kg-card-end: html--><p>La declaración <code>UPDATE</code> con la <a href="https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-ver15">subconsulta</a> se ve así:</p><pre><code class="language-SQL">UPDATE Customer_Info
SET Code = (SELECT Customer_Code
FROM Work_Tickets
WHERE Work_Tickets.Customer_Contact = Customer_Info.Email)
FROM Work_Tickets
WHERE Code IS NULL</code></pre><p>Este ejemplo actualizará el campo <em>Code</em> de la tabla <em>Customer_Info</em> donde la dirección de correo electrónico coincide con la de ambas tablas. Y así es como se ve ahora nuestra tabla <em>Customer_Info</em>:</p><!--kg-card-begin: html--><table>
        <tbody><tr><th>
          </th></tr><tr>
            <td><strong>Name</strong></td>
            <td><strong>Industry</strong></td>
            <td><strong>Code</strong></td>
            <td><strong>Address</strong></td>
              <td><strong>City</strong></td>
            <td><strong>Discount</strong></td>
            <td><strong>PhoneNumber</strong></td>
            <td><strong>Email</strong></td>
          </tr>
        
        </tbody><tbody>
          <tr>
            <td>Wayne Enterprises</td>
            <td>Defense,weaponry,aerospace,enginerring</td>
            <td>1250</td>
            <td>1631 Dark Knight Way</td>
            <td>Gotham</td>
            <td>19.75</td>
            <td>5556614000</td>
              <td>sales@wayneindustires.com</td>
          </tr>
          <tr>
            <td>Stark Industries</td>
            <td>Defense,weaponry,protection</td>
              <td>1251</td>
            <td>5641 Iron Dr</td>
            <td>Undisclosed</td>
            <td>19.73</td>
            <td>9993126156</td>
            <td>contact@starkindustries.com</td>
          </tr>
          <tr>
            <td>Acme Corp</td>
            <td>Comedy,laughter,animation</td>
            <td>1252</td>
            <td>24569 Smiling St</td>
            <td>Toon Town</td>
            <td>17.53</td>
            <td>3216549877</td>
              <td>animation@acmetoons.com
          </td></tr>
        </tbody>
      </table><!--kg-card-end: html--><h2 id="concluyendo">Concluyendo</h2><p>Espero que este artículo te haya sido útil para entender cómo funciona la declaración <em>UPDATE </em>en SQL.</p><p>¡Ahora estás listo para escribir tus propias sentencias SQL <em>UPDATE</em> como un campeón! ¡Después de hacerlo, me encantará que lo compartieras conmigo en redes sociales!</p><p>No olvides visitar mi <a href="https://jonathansexton.me/blog">blog</a> donde frecuentemente publico artículos sobre desarrollo web.</p><p>Ya que estás allí, ¿por qué no te inscribes en mi boletín de noticias? Puedes hacerlo en la parte superior derecha de la página principal del blog. Me gusta enviar artículos interesantes (míos y de otros), recursos y herramientas para desarrolladores de vez en cuando.</p><p>Si tienes preguntas sobre este artículo o en general, mis MDs están abiertos - ven a saludar en <a href="https://twitter.com/jj_goose">Twitter</a> o en cualquiera de mis otras cuentas de redes sociales que puedes encontrar debajo del botón de suscripción del boletín de noticias en la página principal de mi blog o en mi perfil aquí en fCC :)</p><p>¡Qué tengas un día increíble y feliz día programando, amigo!</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/jonathan/">Jonathan Sexton</a> - <a href="https://www.freecodecamp.org/news/sql-update-statement-example-queries-for-updating-table-values/">SQL Update Statement — Example Queries for Updating Table Values </a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ La regla de Simpson: la fórmula y cómo funciona ]]>
                </title>
                <description>
                    <![CDATA[ La regla de Simpson es un método de integración numérica. En otras palabras, es la aproximación numérica de integrales definidas. La regla de Simpson es la siguiente: En ella,  * f(x) es llamado el integrand  * a = es el límite inferior de integración  * b = ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/la-regla-de-simpson-la-formula-y-como-funciona/</link>
                <guid isPermaLink="false">60045f05a4e0700982a9e510</guid>
                
                    <category>
                        <![CDATA[ Matemáticas ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Fri, 05 Mar 2021 06:59:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/photo-1528082992860-d520150d6f6c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>La regla de Simpson es un método de integración numérica. En otras palabras, es la aproximación numérica de integrales definidas.</p><p>La regla de Simpson es la siguiente:</p><p>En ella,</p><ul><li><code>f(x)</code> es llamado el <em>integrand</em></li><li><code>a</code> = es el límite inferior de integración</li><li><code>b</code> = es el límite superior de integración</li></ul><h2 id="la-regla-de-1-3-de-simpson">La Regla de 1/3 de Simpson</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim01.jpg" class="kg-image" alt="sim01" width="600" height="400" loading="lazy"></figure><p>Como se muestra en el diagrama anterior, el integrando <code>f(x)</code> es aproximado por un polinomio de segundo orden, el interpolante cuadrático es <code>P(x)</code>.</p><p>Sigue la aproximación,</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim3.png" class="kg-image" alt="sim3" width="600" height="400" loading="lazy"></figure><p>Reemplazando <code>(b-a)/2</code> como <code>h</code>, obtenemos,</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim4.png" class="kg-image" alt="sim4" width="600" height="400" loading="lazy"></figure><p>Como puedes ver, hay un factor de <code>1/3</code> en la expresión anterior. Por eso, se llama la <strong>Regla de 1/3 de Simpson</strong>.</p><p>Si una función es altamente oscilatorio o carece de derivados en ciertos puntos, entonces la regla anterior puede no producir resultados precisos.</p><p>Una forma común de manejar esto es usando el enfoque de la <em>regla compuesta de Simpson</em>. Para ello, dividir <code>[a,b]</code> en pequeños subintervalos, y luego aplicar la regla de Simpson a cada subintervalo. Luego, sumar los resultados de cada cálculo para producir una aproximación sobre la integral completa.</p><p>Si el intervalo <code>[a,b]</code> se divide en <code>n</code> subintervalo, y <code>n</code> es un número par, la regla compuesta de Simpson se calcula con la siguiente fórmula:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim7.png" class="kg-image" alt="sim7" width="600" height="400" loading="lazy"></figure><p>donde <strong><strong>x<sub>j</sub> = a+jh</strong></strong> para <strong><strong>j = 0,1,…,n-1,n</strong></strong> con <strong><strong>h=(b-a)/n </strong></strong>; en particular, <strong><strong>x<sub>0</sub> = a</strong></strong> y <strong><strong>x<sub>n</sub> = b</strong></strong>.</p><h3 id="ejemplo-en-c-">Ejemplo en C++:</h3><p>Para aproximar el valor de la integral dada abajo donde n = 8:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim9.png" class="kg-image" alt="sim9" width="600" height="400" loading="lazy"></figure><pre><code class="language-c">#include&lt;iostream&gt;
#include&lt;cmath&gt;
using namespace std;

float f(float x)
{
	return x*sin(x);	//Define la función f(x)
}

float simpson(float a, float b, int n)
{
	float h, x[n+1], sum = 0;
	int j;
	h = (b-a)/n;
	
	x[0] = a;
	
	for(j=1; j&lt;=n; j++)
	{
		x[j] = a + h*j;
	}
	
	for(j=1; j&lt;=n/2; j++)
	{
		sum += f(x[2*j - 2]) + 4*f(x[2*j - 1]) + f(x[2*j]);
	}
	
	return sum*h/3;
}

int main()
{
	float a,b,n;
	a = 1;		//Ingresa el límite inferior a
	b = 4;		//Ingresa el límite superior b
	n = 8;		//Ingresa la longitud del intervalo n
	if (n%2 == 0)
		cout&lt;&lt;simpson(a,b,n)&lt;&lt;endl;
	else
		cout&lt;&lt;"n debería ser un número par";
	return 0;
}</code></pre><h2 id="la-regla-de-3-8-de-simpson">La Regla de 3/8 de Simpson</h2><p>La regla de 3/8 de Simpson es similar a la regla de 1/3 de Simpson, con la única diferencia de que, para la regla de 3/8, el interpolante es un polinomio cúbico. Aunque la regla de 3/8 utiliza un valor de función más, es aproximadamente dos veces más precisa que la regla de 1/3.</p><p>La regla de 3/8 de Simpson establece:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim6.png" class="kg-image" alt="sim6" width="600" height="400" loading="lazy"></figure><p>Reemplazando <code>(b-a)/3</code> como <code>h</code>, obtenemos,</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim5.png" class="kg-image" alt="sim5" width="600" height="400" loading="lazy"></figure><p>La regla de 3/8 de Simpson para n intervalos (n debería ser un múltiplo de 3):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/sim8.png" class="kg-image" alt="sim8" width="600" height="400" loading="lazy"></figure><p>donde <strong><strong>x<sub>j</sub> = a+jh</strong></strong> para <strong><strong>j = 0,1,…,n-1,n</strong></strong> con <strong><strong>h=(b-a)/n</strong></strong>; en particular, <strong><strong>x<sub>0</sub> = a</strong></strong> y <strong><strong>x<sub>n</sub> = b</strong></strong>.</p><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/simpsons-rule/"><strong>Simpson's Rule: the Formula and How it Works</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ La Guía Definitiva para Git Merge y Git Rebase ]]>
                </title>
                <description>
                    <![CDATA[ Bienvenido a nuestra guía definitiva de los comandos git merge y git rebase. Este tutorial te enseñará todo lo que necesitas saber sobre la combinación de múltiples ramas con Git. Git Merge El comando git merge fusionará cualquier cambio que se haya hecho en la base de código en una ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/la-guia-definitiva-para-git-merge-y-git-rebase/</link>
                <guid isPermaLink="false">5feccdac8c7cd154bb981fc2</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Sun, 07 Feb 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1556075798-4825dfaaf498.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Bienvenido a nuestra guía definitiva de los comandos <code>git merge</code> y <code>git rebase</code>. Este tutorial te enseñará todo lo que necesitas saber sobre la combinación de múltiples ramas con Git.</p><h2 id="git-merge">Git Merge</h2><p>El comando <code>git merge</code> fusionará cualquier cambio que se haya hecho en la base de código en una rama separada de tu rama actual como un nuevo commit.</p><p>La sintaxis del comando es la siguiente:</p><pre><code class="language-shell">git merge NOMBRE-DE-LA-RAMA</code></pre><p>Por ejemplo, si estás trabajando actualmente en una rama llamada <code>dev</code> y deseas fusionar los nuevos cambios que se hayan realizado en una rama llamada <code>new-features</code>, ejecutarías el siguiente comando:</p><pre><code class="language-shell">git merge new-features</code></pre><p><strong>Nota: </strong>Si hay algún cambio al que no se le ha hecho commit en la rama actual, Git no te permitirá fusionar hasta que se hayan realizado commit todos los cambios en tu rama actual. Para manejar esos cambios, puedes hacer lo siguiente:</p><p>Crear una nueva rama y realizar commit a los cambios</p><pre><code class="language-shell">git checkout -b nombre-de-la-nueva-rama
git add .
git commit -m "&lt;tu mensaje de commit&gt;"</code></pre><p>Guardarlos en el stash</p><pre><code class="language-shell">git stash               # agregarlos al stash
git merge new-features  # fusionarlos
git stash pop           # obtén los cambios devuelta al árbol de trabajo (working tree)</code></pre><p>Abandonar todos los cambios</p><pre><code class="language-shell">git reset --hard        # remueve todos los cambios pendientes</code></pre><h2 id="git-rebase">Git Rebase</h2><p>Realizar un rebase a una rama (branch) en Git es una form ade mover la totalidad de una rama a otro punto del árbol. El ejemplo más simple es mover una rama más arriba en el árbol. Digamos que tenemos una rama que se separó de la rama <code>master</code> en el punto A:</p><pre><code class="language-text">        /o-----o---o--o-----o--------- branch
--o-o--A--o---o---o---o----o--o-o-o--- master</code></pre><p>Cuando se realiza rebase se puede mover así:</p><pre><code class="language-text">                                   /o-----o---o--o-----o------ branch
--o-o--A--o---o---o---o----o--o-o-o master</code></pre><p>Para realizar rebase, asegúrate de tener todos los commits que quieras en el rebase en tu rama <code>master</code>. Revisar la rama en la que quieres hacer el rebase y escribe <code>git rebase master</code> (donde <code>master</code> es la rama en la que quieres hacer el rebase).</p><p>También es posible hacer rebase en una rama diferente, de modo que, por ejemplo, una rama que se basaba en otra rama (llamémosla <code>feature</code>) se rebasa en <code>master</code>:</p><pre><code class="language-text">                            /---o-o branch
           /---o-o-o-o---o--o------ feature
----o--o-o-A----o---o--o-o-o--o--o- master</code></pre><p>Después de <code>git rebase master branch</code> o <code>git rebase master</code> si te encuentras (checked out) en <code>branch</code>, obtendrás:</p><pre><code class="language-text">           /---o-o-o-o---o--o------ feature
----o--o-o-A----o---o--o-o-o--o--o- master
                                  \---o-o branch</code></pre><h3 id="git-rebase-interactivo-en-la-consola">Git rebase interactivo en la consola</h3><p>Para usar <code>git rebase</code> en la consola con una lista de commits, puedes elegir, editar o soltar en el rebase:</p><ul><li>Introduce <code>git rebase -i HEAD~5</code> con el último número que sea cualquier número de commits del más reciente hacia atrás que quieras revisar.</li><li>En vim, presiona <code>esc</code>, luego <code>i</code> para empezar a editar la prueba.</li><li>A la izquierda puedes sobreescribir <code>pick</code> con uno de los comandos de abajo. Si quieres aplastar (squash) un commit a uno anterior y descartar el mensaje de commit, introduce <code>f</code> en lugar de <code>pick</code> en el commit.</li><li>Guarda y sal del editor de texto.</li><li>Cuando se detiene a rebase, haz los ajustes necesarios, y luego usa <code>git rebase --continue</code> hasta que el rebase sea exitoso.</li><li>Si el rebase es exitoso, entonces necesitas forzar el push de tus cambios con <code>git push -f</code> para agregar la versión con rebase a tu repositorio remoto.</li><li>Si hay un "merge conflict" (conflicto al querer fusionar las ramas), hay varias maneras de arreglarlo, incluyendo seguir las sugerencias de <a href="https://help.github.com/enterprise/2.11/user/articles/resolving-a-merge-conflict-using-the-command-line/">esta guía</a>. Una forma es abrir los archivos en un editor de texto y eliminar las partes del código que no quieras. Luego usa <code>git add &lt;file name&gt;</code> seguido de <code>git rebase --continue</code>. Puedes saltarte el commit de conflicto ejecutando <code>git rebase --skip</code>, para el rebase ejecutando <code>git rebase --abort</code> en tu consola.</li></ul><pre><code class="language-text">pick 452b159 &lt;message for this commit&gt;
pick 7fd4192 &lt;message for this commit&gt;
pick c1af3e5 &lt;message for this commit&gt;
pick 5f5e8d3 &lt;message for this commit&gt;
pick 5186a9f &lt;message for this commit&gt;

# Rebase 0617e63..5186a9f onto 0617e63 (30 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but stop to edit the commit message.
# e, edit = use commit, but stop to amend or add commit.
# s, squash = use commit, meld into previous commit and stop to edit the commit message.
# f, fixup = like "squash", but discard this commit's log message thus doesn't stop.
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom. 
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out</code></pre><h2 id="merge-conflicts">Merge Conflicts</h2><p>Un merge conflict es cuando realizar commits en ramas separadas que alteran la misma línea de manera conflictiva. Si esto ocurre, Git no sabrá que versión del archivo guardar en un mensaje de error similar al siguiente:</p><pre><code class="language-shell">CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.</code></pre><p>Si miras el archivo <code>resumé.txt</code> en tu editor de texto, puedes ver dónde tuvo lugar el conflicto:</p><pre><code class="language-shell">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
Address: 808 South Street
=======
Address: 505 North Street
&gt;&gt;&gt;&gt;&gt;&gt;&gt; updated_address</code></pre><p>Git agregó algunas líneas adicionales en el archivo:</p><ul><li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code></li><li><code>=======</code></li><li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; updated_address</code></li></ul><p>Piensa en &nbsp;<code>=======</code> como la línea divisoria del conflicto. Todo lo que hay entre <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code> y <code>=======</code> es el contenido de la rama actual a la que apunta HEAD ref. Por otro lado, todo lo que hay entre &nbsp;<code>=======</code> y <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; updated_address</code> es el contenido de la rama que se está fusionando, <code>updated_address</code>.</p><h2 id="git-merge-vs-git-rebase">Git Merge vs Git Rebase</h2><p>Tanto <code>git merge</code> como <code>git rebase</code> son comandos muy útiles, y uno no es mejor que el otro. Sin embargo, hay algunas diferencias muy importantes entre los dos comandos que tú y tu equipo deben tener en cuenta.</p><p>Cada vez que se ejecuta <code>git merge</code>, se crea un merge commit extra. Siempre que trabajes en tu repositorio local, tener demasiados merge commits puede hacer que el historia del commits parezca confuso. Una forma de evitar el merge commit es usar <code>git rebase</code> en su lugar.</p><p><code>git rebase</code> es una característica muy poderosa. Dicho esto, también es <strong>arriesgado</strong> si no se usa de la manera correcta. <code>git rebase</code> altera el historial de commits, así que úsalo con cuidado. Si el rebase se hace en el repositorio remoto, entonces puede crear muchos problemas cuando otros desarrolladores intentan sacar los últimos cambios de código del repositorio remoto. Recuerda que sólo debes ejecutar <code>git rebase</code> en un repositorio local.</p><p>Eso es todo lo que necesitas saber para merge y rebase con lo mejor de ellos.</p><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-git-merge-and-git-rebase/">The Ultimate Guide to Git Merge and Git Rebase</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Stash Explicado: Cómo Almacenar Temporalmente los Cambios Locales en Git ]]>
                </title>
                <description>
                    <![CDATA[ Git tiene un área llamada "stash" donde puedes almacenar temporalmente una captura de tus cambios sin enviarlos al repositorio. Está separada del directorio de trabajo (working directory), del área de preparación (staging area), o del repositorio. Esta funcionalidad es útil cuando has hecho cambios en una rama que no estás ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/git-stash-explicado/</link>
                <guid isPermaLink="false">5fecbfca8c7cd154bb981f5f</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Sat, 06 Feb 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1551313158-73d016a829ae.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Git tiene un área llamada "stash" donde puedes almacenar temporalmente una captura de tus cambios sin enviarlos al repositorio. Está separada del directorio de trabajo (working directory), del área de preparación (staging area), o del repositorio.</p><p>Esta funcionalidad es útil cuando has hecho cambios en una rama que no estás listo para realizarle commit, pero necesitas cambiar a otra rama.</p><h3 id="guardar-cambios-en-el-stash">Guardar cambios en el stash</h3><p>Para guardar tus cambios en el stash, ejecuta el comando:</p><pre><code class="language-shell">git stash save "mensaje opcional para ti"</code></pre><p>Esto guarda los cambios y revierte el directorio de trabajo a como se veía en tu último commit. Los cambios guardados están disponibles en cualquier rama de ese repositorio.</p><p>Ten en cuenta que los cambios que quieras guardar deben estar en los archivos rastreados. Si has creado un nuevo archivo e intentas guardar tus cambios, puede que obtengas el error <code>No local changes to save</code> (No hay cambios locales que guardar).</p><h3 id="ver-los-cambios-guardados-en-el-stash">Ver los cambios guardados en el stash</h3><p>Para ver lo que hay en tu stash, ejecuta el comando:</p><pre><code class="language-shell">git stash list</code></pre><p>Esto devuelve una lista de tus capturas guardadas en el formato <code>stash@{0}: RAMA-STASHED-CAMBIOS-SON-PARA: MESSAGE</code>. La parte de <code>stash@{0}</code> es el nombre del stash, y el número en las llaves (<code>{ }</code>) es el índice (index) del stash. Si tienes múltiples conjuntos de cambios guardados en stash, cada uno tendrá un índice diferente.</p><p>Si olvidaste los cambios que hiciste en el stash, puedes ver un resumen de ellos con el comando <code>git stash show NOMBRE-DEL-STASH</code>. Si quieres ver el típico diseño "diff" (con los + y - en las líneas con los cambios), puedes incluir la opción <code>-p</code> (para parche o patch). Aquí tienes un ejemplo:</p><pre><code class="language-shell">git stash show -p stash@{0}

# Ejemplo de un resultado:
diff --git a/PathToFile/fileA b/PathToFile/fileA
index 2417dd9..b2c9092 100644
--- a/PathToFile/fileA
+++ b/PathToFile/fileA
@@ -1,4 +1,4 @@
-What this line looks like on branch
+What this line looks like with stashed changes</code></pre><h3 id="recuperar-cambios-en-stash">Recuperar Cambios en Stash</h3><p>Para recuperar los cambios del stash y aplicarlos a la rama actual en la que estás, tienes dos opciones:</p><ol><li><code>git stash apply NOMBRE-DEL-STASH</code> aplica los cambios y deja una copia en el stash</li><li><code>git stash pop NOMBRE-DEL-STASH</code> aplica los cambio y elimina los archivos del stash</li></ol><p>Puede haber conflictos cuando se aplican los cambios. Puedes resolver los conflictos de forma similar a un merge (<a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-git-merge-and-git-rebase/">ver <code>git merge</code> para más detalles</a>).</p><h3 id="borrar-los-cambios-guardados-en-stash">Borrar los Cambios Guardados en Stash</h3><p>Si quieres remover los cambios guardados en stash sin aplicarlos, ejecuta el comando:</p><pre><code class="language-shell">git stash drop NOMBRE-DEL-STASH</code></pre><p>Para limpiar todo del stash, ejecuta el comando:</p><pre><code class="language-shell">git stash clear</code></pre><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/git-stash-explained/">Git Stash Explained: How to Temporarily Store Local Changes in Git</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ El Comando Git Commit Explicado ]]>
                </title>
                <description>
                    <![CDATA[ El comando git commit guardará todos los cambio hechos en la zona de montaje o área de preparación (staging area), junto con una breve descripción del usuario, en un "commit" al repositorio local. Los commits están en el corazón del uso de Git. Puedes pensar en un commit como una ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/el-comando-git-commit-explicado/</link>
                <guid isPermaLink="false">5fea316a8c7cd154bb980e13</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Fri, 05 Feb 2021 06:29:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1520371764250-8213f40bc3ed.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El comando <code>git commit</code> guardará todos los cambio hechos en la zona de montaje o área de preparación (staging area), junto con una breve descripción del usuario, en un "commit" al repositorio local.</p><p>Los commits están en el corazón del uso de Git. Puedes pensar en un commit como una captura de tu proyecto, donde se crea una nueva versión de ese proyecto en el repositorio actual. Dos características importantes de los commits son:</p><ul><li>puedes recordar los cambios a los que se les hizo commits en una fecha posterior, o revertir el proyecto a esa versión (<a href="https://guide.freecodecamp.org/git/git-checkout">ver Git checkout</a>)</li><li>si varios commits editan diferentes partes del proyecto, no se sobrescribirán entre sí aunque los autores de los commits no se conozcan entre sí. Este es uno de los beneficios de usar Git sobre una herramienta como Dropbox o Google Drive.</li></ul><h2 id="opciones">Opciones</h2><p>Hay un número de opciones que puedes incluir con <code>git commit</code>. Sin embargo, esta guía sólo cubrirá las dos opciones más comunes. Para una lista extensa de opciones, por favor consulta la <a href="https://git-scm.com/docs/git-commit">documentación de Git</a>.</p><h3 id="la-opci-n-m">La Opción -m</h3><p>La opción más común utilizada con <code>git commit</code> es la opción <code>-m</code>. La <code>-m</code> significa mensaje. Cuando se llama a <code>git commit</code>, es necesario incluir un mensaje. El mensaje debe ser una breve descripción de los cambios a los que se les está realizando commit. El mensaje debe estar al final del comando y debe estar envuelto entre comilla <code>" "</code>.</p><p>Un ejemplo de cómo usar la opción <code>-m</code>:</p><pre><code class="language-shell">git commit -m "Mi mensaje"</code></pre><p>La salida de tu terminal debería ser algo así:</p><pre><code class="language-shell">[master 13vc6b2] Mi mensaje
 1 file changed, 1 insertion(+)</code></pre><p>NOTA: Si la <code>-m</code> no está incluida en el comando <code>git commit</code>, se te pedirá que agregues un mensaje en tu editor de texto predeterminado - ve "Uso de mensajes de commit detallados" más abajo.</p><h3 id="la-opci-n-a">La Opción -a</h3><p>Otra opción popular es la opción <code>-a</code>. La <code>-a</code> representa todo (all). Esta opción prepara automáticamente todos los archivos para realizarles commit. Si se agregan nuevos archivos, la opción <code>-a</code> no los preparará. Solo se confirmarán los archivos que el repositorio de Git tenga conocimiento.</p><p>Por ejemplo:</p><p>Digamos que tienes un archivo <code>README.md</code> que ya se le ha realizado commit en el repositorio. Si haces cambios en este archivo, puedes usar la opción <code>-a</code> en tu comando commit para preparar y agregar los cambios a tu repositorio. Sin embargo, ¿qué pasaría si también agregara un nuevo archivo llamado <code>index.html</code>? La opción <code>-a</code> no pondrá en escena (no lo pondrá en el staging area) el <code>index.html</code> ya que no existe actualmente en el repositorio. Cuando se han agregado nuevos archivos, el comando <code>git add</code> debería ser invocado para preparar los archivos antes de que se les realice commit en el repositorio.</p><p>Un ejemplo de cómo usar la opción <code>-a</code>:</p><pre><code class="language-shell">git commit -am “Mis nuevos cambios”</code></pre><p>La salida de tu terminal debería ser algo así:</p><pre><code class="language-shell">[master 22gc8v1] Mis nuevos cambios
 1 file changed, 1 insertion(+)</code></pre><h2 id="uso-de-mensajes-de-commit-detallados">Uso de mensajes de commit detallados</h2><p>Aunque <code>git commit -m "mensaje de commit"</code> funciona muy bien, puede ser útil para proporcionar información más detallada y sistemática.</p><p>Si realizas un commit sin usar la opción <code>-m</code>, git abrirá tu editor de texto por defecto con un nuevo archivo, que incluirá una lista comentada de todos los archivos/cambios que se han puesto en escena en el commit. Luego escribes tu mensaje de commit detallado (la primera línea será tratada como la línea de asunto) y el commit se realizará cuando guardes/cierres el archivo.</p><p>Ten en cuenta:</p><ul><li>Mantén la longitud de tus líneas de mensajes de commit por debajo de 72 caracteres como práctica estándar.</li><li>Está perfectamente bien, e incluso recomendado, escribir mensajes de commit multilínea.</li><li>También puedes referirte a otros temas o a pull requests en tu mensaje de commit. GitHub asignó un número de referencia a todos los pull requests e issues, así que por ejemplo si quieres referirte al pull request #788 simplemente hazlo en la línea de asunto o en el cuerpo del texto según sea apropiado.</li></ul><h3 id="la-opci-n-amend">La Opción --amend</h3><p>La opción <code>--amend</code> te permite cambiar tu último commit. Digamos que acabas de realizar un commit y cometiste un error en tu mensaje de commit. Puedes modificar convenientemente el último commit usando el comando:</p><pre><code class="language-shell">git commit --amend -m "un mensaje de commit actualizado"</code></pre><p>Si se te olvida incluir un archivo en el commit:</p><pre><code class="language-shell">git add NOMBRE-DEL-ARCHIVO-OLVIDADO
git commit --amend -m "un mensaje de commit actualizado"

# Si no necesitar cambiar el mensaje de commit, usa la opción --no-edit
git add NOMBRE-DEL-ARCHIVO-OLVIDADO
git commit --amend --no-edit</code></pre><p>Los commits prematuros suceden todo el tiempo en el curso del desarrollo diario. Es fácil olvidarse de preparar un archivo o de cómo formatear correctamente tu mensaje de commit. La bandera <code>--amend</code> es una forma conveniente de corregir estos pequeños errores. Este comando sustituirá el antiguo mensaje de commit por el actualizado que se especifica en el comando.</p><p>Los commits enmendados son en realidad commits completamente nuevos y el commit anterior ya no estará en tu rama actual. Cuando estés trabajando con otros, deberías intentar evitar modificar los commits si el último commit ya se encuentra empujado (en la nube o remoto) en el repositorio.</p><p>Con <code>--amend</code>, una de las opciones útiles que puedes usar es <code>--author</code>, que te permite cambiar el autor del último commit que has hecho. Imagina una situación en la que no has configurado correctamente tu nombre o tu correo electrónico en las configuraciones de git, pero ya has hecho un commit. Con la bandera <code>--author</code> puedes simplemente cambiarlos sin reiniciar el último commit.</p><pre><code class="language-text">git commit --amend --author="John Doe &lt;johndoe@email.com&gt;"</code></pre><h3 id="la-opci-n-v-o-verbose">La Opción -v o --verbose</h3><p>La opción <code>-v</code> o <code>--verbose</code> se usa sin la opción <code>-m</code>. La opción <code>-v</code> puede ser útil para cuando deseas editar un mensaje de commit de Git en tu editor por defecto, mientras que puedes ver los cambios que has hecho para el commit. El comando abre tu editor de texto por defecto con una plantilla de mensaje de commit, <em>así como</em> una copia de los cambios que has realizado para este commit. Los cambios, o diferencias (diff), no se incluirán en el mensaje de commit, pero proporcionan una bonita forma de referenciar tus cambios cuando los describas en tu mensaje de commit.</p><h2 id="c-mo-aplastar-varios-commits-en-uno-solo">Cómo aplastar varios commits en uno solo</h2><p>Esta es una característica genial de <code>rebase</code> que puede ser usada en el modo interactivo. Para aplastar los últimos <em>n</em> commits en uno, ejecuta el siguiente comando:</p><pre><code class="language-text">git rebase -i HEAD~n</code></pre><p>Eso abrirá tu editor de texto con algo similar a lo siguiente:</p><pre><code class="language-text">pick commit_1
pick commit_2
pick commit_3
...
pick commit_n
# Un montón de comentarios</code></pre><p>Deja el primer commit solo, y cambia el resto de los <code>pick</code>s por <code>squash</code>. Guarda y sal del editor.</p><p>Así que si quieres aplastar (squash) los últimos tres commits, primero ejecutarás <code>git rebase -i HEAD~3</code> y luego querrás editar tus commits para que se parezcan a esto:</p><pre><code class="language-text">pick dd661ba Commit 1
squash 71f5fee Commit 2
squash f4b4bf1 Commit 3</code></pre><p>Si ya has empujado a remoto antes de aplastar tus commits, tendrás que volver a empujar a remoto de nuevo, con la bandera <code>-f</code>, de lo contrario git te arrojará un error.</p><p>Se recomienda encarecidamente que leas la información del archivo abierto, ya que hay muchas cosas que puedes hacer.</p><h3 id="m-s-informaci-n-"><strong>Más información:</strong></h3><ul><li>Documentación de Git: <a href="https://git-scm.com/docs/git-commit">commit</a></li></ul><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/git-commit-command-explained/">Git Commit Command Explained</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo Deshacer un Git Add ]]>
                </title>
                <description>
                    <![CDATA[ Para deshacer un git add antes de un commit, ejecuta git reset <archivo> o git reset para deshacer todos los cambios. En versiones antiguas de Git, los comandos eran git reset HEAD <archivo> y git reset HEAD respectivamente. Esto se cambió en Git 1.8.2 Puedes leer más sobre otras acciones ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-deshacer-un-git-add/</link>
                <guid isPermaLink="false">5fe9278d8c7cd154bb980744</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Mon, 25 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1569950044272-e04b4b26300a.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Para deshacer un <code>git add</code> antes de un commit, ejecuta <code>git reset &lt;archivo&gt;</code> o <code>git reset</code> para deshacer todos los cambios.</p><p>En versiones antiguas de Git, los comandos eran <code>git reset HEAD &lt;archivo&gt;</code> y <code>git reset HEAD</code> respectivamente. Esto se cambió en Git 1.8.2</p><p>Puedes leer más sobre otras acciones de Git comúnmente usadas en estos útiles artículos:</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/git-checkout-explicado/">Git checkout</a></li><li><a href="https://www.freecodecamp.org/espanol/news/git-fetch-vs-pull-cual-es-la-diferencia-entre-los-comandos-git-fetch-y-git-pull/">Git pull vs Git fetch</a></li><li><a href="https://www.freecodecamp.org/espanol/news/gitignore-explicado-que-es-y-como-agregar-a-tu-repositorio/">Gitignore</a></li></ul><h2 id="aqu-hay-un-poco-m-s-de-informaci-n-de-fondo-sobre-git">Aquí hay un poco más de información de fondo sobre Git</h2><h3 id="comprende-las-tres-secciones-de-un-proyecto-de-git"><strong>Comprende las Tres Secciones de un Proyecto de Git</strong></h3><p>Un proyecto de Git tendrá las siguientes tres secciones principales:</p><ol><li>El directorio de Git (Git directory)</li><li>El directorio de trabajo (working directory) o árbol de trabajo (working tree)</li><li>La zona de montaje (staging area)</li></ol><p>El <strong>directorio de Git </strong>(localizado en <code>TU-RUTA-DEL-PROYECTO/.git/</code>) es donde Git almacena todo lo que necesita para rastrear el proyecto con precisión. Esto incluye metadatos y una base de datos de objetos que incluye versiones comprimidas de los archivos del proyecto.</p><p>El <strong>directorio de trabajo </strong>es donde un usuario hace cambios locales a un proyecto. El directorio de trabajo extrae los archivos del proyecto de la base de datos de objetos del directorio de Git y los coloca en la máquina local del usuario.</p><p>La <strong>zona de montaje </strong>es un archivo (también llamado "index", "stage", o "cache") que almacena la información sobre lo que irá en su próxima confirmación. Una confirmación es cuando le dices a Git que guarde estos cambios escalonados. Git toma una captura de los archivos tal y como están, y la almacena permanentemente en el directorio de Git.</p><p>Con tres secciones, hay tres estados principales en los que un archivo puede estar en cualquier momento: confirmado (committed), modificado (modified) o puesto en escena (staged). Se modifica un archivo cada vez que se hacen cambios en el directorio de trabajo. Luego, se pone en escena cuando lo mueves a la zona de montaje. Finalmente, se confirma después de realizar un commit.</p><h2 id="instalar-git"><strong>Instalar Git</strong></h2><ul><li>Ubuntu: <code>sudo apt-get install git</code></li><li>Windows: <a href="https://git-scm.com/download/win">Descarga</a></li><li>Mac: <a href="https://git-scm.com/download/mac">Descarga</a></li></ul><h2 id="configurar-el-entorno-de-git">Configurar el entorno de Git</h2><p>Git tiene una herramienta <code>git config</code> que te permite personalizar tu entorno Git. Puedes cambiar el aspecto y las funciones de Git estableciendo ciertas variables de configuración. Ejecuta estos comandos desde una interfaz de línea de comandos en tu máquina (Terminal en Mac, Command Prompt o Powershell en Windows).</p><p>Hay tres niveles de donde se almacenan estas variables de configuración:</p><ol><li>Sistema: ubicado en <code>/etc/gitconfig</code>, aplica la configuración por defecto a cada usuario de la computadora. Para hacer cambios en este archivo, usa la opción <code>--system</code> con el comando <code>git config</code>.</li><li>Usuario: ubicado en <code>~/.gitconfig</code> o <code>~/.config/git/config</code>, aplica las configuraciones a un solo usuario. Para hacer cambios en este archivo, usa la opción <code>--global</code> con el comando <code>git config</code>.</li><li>Proyecto: ubicado en <code>TU-RUTA-DEL-PROYECTO/.git/config</code>, aplica las configuraciones sólo al proyecto. Para hacer cambios en este archivo, usa al comando <code>git config</code>.</li></ol><p>Si hay configuraciones que entran en conflicto entre sí, las configuraciones de nivel de proyecto anularán las de nivel de usuario, y las de nivel de usuario anularán las de nivel de sistema.</p><p>Nota para los usuarios de Windows: Git busca el archivo de configuración a nivel de usuario (<code>.gitconfig</code>) en tu directorio <code>$HOME</code> (<code>C:\Users\$USER</code>). Git también busca <code>/etc/gitconfig</code>, aunque es relativo al root de MSys, que es donde decides instalar Git en tu sistema Windows cuando ejecutas el instalador. Si estás usando la versión 2.x o posterior de Git para Windows, también hay un archivo de configuración a nivel de sistema en <code>C:\Documents and Settings\All Users\Application Data\Git\config</code> en Windows XP, y en <code>C:\ProgramData\Git\config</code> en Windows Vista y posteriores. Este archivo de configuración sólo puede ser cambiado por <code>git config -f FILE</code> como un administrador.</p><h3 id="agregar-tu-nombre-y-correo-electr-nico">Agregar Tu Nombre y Correo Electrónico</h3><p>Git incluye el nombre de usuario y el correo electrónico como parte de la información en un commit. Querrás configurar esto en tu archivo de configuración de usuario con estos comandos:</p><pre><code class="language-shell">git config --global user.name "Mi Nombre"
git config --global user.email "micorreo@ejemplo.com"</code></pre><h3 id="cambiar-tu-editor-de-texto">Cambiar Tu Editor de Texto</h3><p>Git utiliza automáticamente tu editor de texto predeterminado, pero puedes cambiarlo. Aquí tienes un ejemplo para usar el editor Atom en su lugar (la opción <code>--wait</code> le dice al shell que espere al editor de texto para que puedas hacer tu trabajo en él antes de que el programa avance):</p><pre><code class="language-shell">git config --global core.editor "atom --wait"</code></pre><h3 id="agregar-color-a-la-salida-de-git">Agregar Color a la Salida de Git</h3><p>Puedes configurar tu shell para agregar color a la salida de Git con este comando:</p><pre><code class="language-shell">git config --global color.ui true</code></pre><p>Para ver todos tus ajustes de configuración, usa el comando <code>git config --list</code>.</p><h2 id="inicializar-git-en-un-proyecto">Inicializar Git en un Proyecto</h2><p>Una vez que Git esté instalado y configurado en tu computadora, debes inicializarlo en tu proyecto para empezar a usar sus poderes de control de versiones. En la línea de comandos, utiliza el comando <code>cd</code> para navegar hasta la carpeta de nivel superior (o raíz) de tu proyecto. A continuación, ejecuta el comando <code>git init</code>. Esto instala una carpeta del directorio de Git con todos los archivos y objetos que Git necesita para rastrear tu proyecto.</p><p>Es importante que el directorio de Git se instale en la carpeta raíz del proyecto. Git puede rastrear archivos en sub carpetas, pero no rastreará los archivos ubicados en una carpeta principal relativa al directorio de Git.</p><h2 id="obtener-ayuda-en-git">Obtener Ayuda en Git</h2><p>Si olvidas cómo funciona cualquier comando en Git, puedes acceder a la ayuda de Git desde la línea de comandos de varias maneras:</p><pre><code class="language-shell">git help COMANDO
git COMANDO --help
man git-COMANDO</code></pre><p>Esto muestra la página del manual del comando en su ventana shell. Para navegar, desplázate con las teclas de flecha arriba y abajo o utiliza los siguientes atajos de teclado:</p><ul><li>f o barra espaciadora para avanzar la página</li><li>b para volver a la página</li><li>q para salir</li></ul><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/how-to-undo-a-git-add/">How to Undo a Git Add</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Checkout Explicado: Cómo hacer Checkout, Cambiar o Intercambiar de Rama en Git ]]>
                </title>
                <description>
                    <![CDATA[ El comando git checkout cambia entre ramas o restaura los archivos del árbol de trabajo (working tree). Hay varias opciones diferentes para este comando que no se tratarán aquí, pero puedes echar un vistazo a todas ellas en la documentación de Git. Checkout un commit específico Para realizar un checkout ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/git-checkout-explicado/</link>
                <guid isPermaLink="false">5fea249d8c7cd154bb980ce2</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Sun, 24 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1567168544230-d5a9401299a4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El comando <code>git checkout</code> cambia entre ramas o restaura los archivos del árbol de trabajo (working tree). Hay varias opciones diferentes para este comando que no se tratarán aquí, pero puedes echar un vistazo a todas ellas en la documentación de Git.</p><h3 id="checkout-un-commit-espec-fico"><strong>Checkout un commit específico</strong></h3><p>Para realizar un checkout a un commit específico, ejecuta el comando:</p><pre><code class="language-shell">git checkout id-del-commit-específico</code></pre><p>podemos obtener el identificador (id) del commit específico ejecutando:</p><pre><code class="language-shell">git log</code></pre><h3 id="checkout-a-una-rama-branch-existente"><strong>Checkout a una Rama (Branch) Existente</strong></h3><p>Para realizar checkout a una rama existente, ejecuta el comando:</p><pre><code class="language-shell">git checkout NOMBRE-DE-LA-RAMA</code></pre><p>Por lo general, Git no te dejará realizar checkout a otra rama a menos que tu directorio de trabajo esté limpio, porque perderías cualquier cambio del directorio de trabajo al que no le has hecho commit. Tienes tres opciones para manejar tus cambios: 1) tirarlos a la basura, 2) <a href="https://guide.freecodecamp.org/git/git-commit/">realizarles un commit</a>, 3) <a href="https://guide.freecodecamp.org/git/git-stash/">realizarles un stash</a>.</p><h3 id="checkout-a-una-rama-nueva"><strong>Checkout a una Rama Nueva</strong></h3><p>Para crear y hacer checkout a una rama nueva con un solo comando, puedes usar:</p><pre><code class="language-shell">git checkout -b NOMBRE-DE-LA-RAMA-NUEVA</code></pre><p>Esto te cambiará automáticamente a la rama nueva.</p><h3 id="checkout-a-una-rama-nueva-or-reiniciar-una-rama-a-un-punto-de-partida"><strong>Checkout a una Rama Nueva or Reiniciar una Rama a un Punto de Partida</strong></h3><p>El siguiente comando es similar al de realizar checkout a una rama nueva, pero utiliza la bandera <code>-B</code> (fíjese en la B mayúscula) y un parámetro opciones de <code>PUNTO-DE-PARTIDA</code>:</p><pre><code class="language-shell">git checkout -B NOMBRE-DE-LA-RAMA PUNTO-DE-PARTIDA</code></pre><p>Si la rama <code>NOMBRE-DE-LA-RAMA</code> no existe, Git la creará y la iniciará en <code>PUNTO-DE-PARTIDA</code>. Si la rama <code>NOMBRE-DE-LA-RAMA</code> ya existe, entonces Git restablece la rama a <code>PUNTO-DE-PARTIDA</code>. Esto equivale a ejecutar <code>git branch</code> con <code>-f</code>.</p><h3 id="forzar-un-checkout"><strong>Forzar un Checkout</strong></h3><p>Puedes pasar la opción <code>-f</code> o <code>--force</code> con el comando <code>git checkout</code> para forzar a Git a cambiar de rama, incluso si tienes cambios fuera de la zona de montaje (en otras palabras, el índice del árbol de trabajo difiere de <code>HEAD</code>). Básicamente, se puede usar para tirar los cambios locales.</p><p>Cuando ejecutes el siguiente comando, Git ignorará las entradas no fusionadas:</p><pre><code class="language-shell">git checkout -f NOMBRE-DE-LA-RAMA

# Alternativa
git checkout --force NOMBRE-DE-LA-RAMA</code></pre><h3 id="deshacer-los-cambio-en-tu-directorio-de-trabajo"><strong>Deshacer los Cambio en tu Directorio de Trabajo</strong></h3><p>Puedes usar el comando <code>git checkout</code> para deshacer los cambios que has hecho en un archivo de tu directorio y trabajo. Esto revertirá el archivo a la versión en <code>HEAD</code>:</p><pre><code class="language-shell">git checkout -- NOMBRE-DEL-ARCHIVO</code></pre><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/git-checkout-explained/">Git Checkout Explained: How to Checkout, Change, or Switch a Branch in Git</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Fetch vs Pull: ¿Cuál es la diferencia entre los comandos Git Fetch y Git Pull? ]]>
                </title>
                <description>
                    <![CDATA[ Git pull y fetch son dos comandos que son usados regularmente por los usuarios de Git. Veamos la diferencia entre ambos comandos. Por el contexto, vale la pena recordar que probablemente estemos trabajando en un repositorio clonado. ¿Qué es un clon? Es simplemente un duplicado de otro repositorio. Básicamente es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/git-fetch-vs-pull-cual-es-la-diferencia-entre-los-comandos-git-fetch-y-git-pull/</link>
                <guid isPermaLink="false">5fe8b6318c7cd154bb97fa61</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Sat, 23 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1525975492422-4c337efc136f.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Git <code>pull</code> y <code>fetch</code> son dos comandos que son usados regularmente por los usuarios de Git. Veamos la diferencia entre ambos comandos.</p><p>Por el contexto, vale la pena recordar que probablemente estemos trabajando en un repositorio clonado. ¿Qué es un clon? Es simplemente un duplicado de otro repositorio. Básicamente es obtener tu propia copia del código fuente de otra persona.</p><p>Dicho esto, para mantener tu clon actualizado con cualquier cambio que se haya aplicado al original, necesitarás llevarlos a tu clon.</p><p>Ahí es donde entran <code>fetch</code> y <code>pull</code>.</p><p><code>git fetch</code> es el comando que le dice a tu git local que recupere la última información de los metadatos del original (aunque no hace ninguna transferencia de archivos. Es más bien como comprobar si hay algún cambio disponible).</p><p><code>git pull</code> por otro lado hace eso Y trae (copia) esos cambios del repositorio remoto.</p><p>Por ejemplo:</p><pre><code class="language-text">git pull origin ankur bugfix</code></pre><p>Lo que hay que tomar de aquí es tener en cuenta que generalmente hay al menos tres copias de un proyecto en tu estación de trabajo.</p><ul><li>Una copia es tu propio repositorio con tu propio historial de confirmación (el ya guardado, por así decirlo).</li><li>La segunda copia es tu copia de trabajo donde estás editando y construyendo (aún sin realizar commit a tu repositorio).</li><li>La tercera copia es tu copia local "en caché" de un repositorio remoto (probablemente el original de donde clonaste el tuyo).</li></ul><p>Puedes usar <code>git fetch</code> para saber los cambios hechos en el repo/rama remoto desde tu último pull. Esto es útil para permitir la comprobación antes de hacer un pull real, lo que podría cambiar los archivos en tu rama actual y en la copia de trabajo (y potencialmente perder tus cambios, etc.).</p><pre><code class="language-text">git fetch    
git diff ...origin</code></pre><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/git-fetch-vs-pull/">Git Fetch vs Pull: What's the Difference Between the Git Fetch and Git Pull Commands?</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo Deshacer Commits a Archivos Confidenciales de Git ]]>
                </title>
                <description>
                    <![CDATA[ Preparó los archivos, agrego un mensaje de commit, y push. No... ¡Espera! Ese archivo NO. Y ahora tenemos que empezar a buscar en Google. Todos los desarrolladores han realizado algún commit a archivos confidenciales o sensibles en el pasado. Entonces, ¿cómo arreglamos la situación y nos aseguramos de que no ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-deshacer-commits-a-archivos-sensibles-de-git/</link>
                <guid isPermaLink="false">5fe8ba028c7cd154bb97fb12</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Fri, 22 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/IMG_5162.00_00_17_13.Still001-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Preparó los archivos, agrego un mensaje de commit, y push. No... ¡Espera! Ese archivo NO. Y ahora tenemos que empezar a buscar en Google.</p><p>Todos los desarrolladores han realizado algún commit a archivos confidenciales o sensibles en el pasado. Entonces, ¿cómo arreglamos la situación y nos aseguramos de que no nos vuelva a suceder?</p><p>En este artículo, te explicaré qué hacer cuando se realiza un commit accidentalmente a un archivo confidencial e incluyo los comandos de Git necesarios para ajustar el historial.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/08/illustration.png" class="kg-image" alt="illustration" width="600" height="400" loading="lazy"><figcaption>Cómo deshacer commits a archivos confidenciales de git</figcaption></figure><h2 id="control-de-da-os">Control de Daños</h2><p>Así que accidentalmente realizaste un commit a un archivo confidencial. Vamos a llamarlo <em>.env</em>. Hay dos preguntas importantes que responder:</p><ul><li>¿Subiste el commit a un repositorio remoto?</li><li>¿Es público el repositorio remoto?</li></ul><h3 id="no-ha-sido-subido">No ha sido subido</h3><p>Si aún no se ha subido, la situación no es para nada crítica. Puedes <strong>volver a un commit anterior</strong>:</p><pre><code>git reset HEAD^ --soft</code></pre><p>Tus archivos se quedarán en la copia de trabajo para que puedas arreglar el archivo/información confidencial. Si quieres <strong>mantener el commit y simplemente eliminar el archivo confidencial</strong>, realiza:</p><pre><code>git rm .env --cached
git commit --amend</code></pre><p>Puedes usar <code>--amend</code> solo en el último commit. Si logras añadir un montón de commits encima de eso, usa:</p><pre><code>git rebase -i HEAD~{¿cuántos commits a volver?}
</code></pre><p>Esto te permitirá arreglar el commit defectuoso y reproducirá todos los commits restantes después de la corrección para que no se pierdan.</p><h3 id="ya-se-ha-subido">Ya se ha subido</h3><p>Si subiste, hay una importante diferencia entre los repositorios públicos y privados.</p><p>Si tu repositorio es privado y no hay bots o gente en la que no confíes con acceso a él, puedes modificar fácilmente el último commit usando los dos comandos anteriores.</p><p>Si subiste un montón de commits encima del problemático, puedes seguir usando filter-branch o el limpiador de repositorios BFG para eliminar el archivo confidencial del historial de git:</p><pre><code>git filter-branch --force --index-filter "git rm --cached --ignore-unmatch .env" --prune-empty --tag-name-filter cat -- --all
</code></pre><p>Pero ten en cuenta dos aspectos importantes de estos cambios:</p><ul><li><strong>En realidad estás cambiando el historial</strong><br> hay otras personas, otras ramas, otros forks, o solicitudes abiertas de pull requests que dependen del estado actual del repositorio, las romperás. En esos casos, trata el repositorio como si fuera pública y evita cambiar el historial.</li><li><strong>Necesitas limpiar el caché </strong><br>Siempre tienes que contactar con el apoyo de tu proveedor de almacenamiento de Git y pedirles que limpien el caché de tu repositorio. Aunque hayas arreglado el commit problemático o reescrito el historial, el viejo commit con el archivo confidencial permanece en el caché. Necesitarías saber su ID para acceder a él, pero sigue siendo accesible hasta que limpies el caché.</li></ul><h2 id="-necesito-regenerar-las-claves-si-se-suben-a-un-repositorio-p-blico">¿Necesito regenerar las claves si se suben a un repositorio público?</h2><p>En resumen, sí. Si tu repositorio es público o no piensas que es un lugar seguro por cualquier otro razón, debes considerar que la información confidencial ha sido comprometida.</p><p>Incluso si eliminas los datos de tu repositorio, no puedes hacer cualquier cosa sobre los bots y otros forks del repositorio. Entonces, ¿cuáles son los siguientes pasos?</p><ul><li><strong>Desactiva todas las claves y/o contraseñas </strong><br>Haz esto como el primer paso. Una vez que desactives las claves, la información confidencial se vuelve inútil.</li><li><strong>Ajusta gitignore </strong><br>Agrega todos los archivos confidenciales a .gitignore para asegurarte de que git no los rastreará.</li><li><strong>Elimina el archivo confidencial</strong></li><li><strong>Realiza un commit del arreglo con una explicación significativa </strong><br>No trates de ocultar el error. Otros colaboradores y tú en un mes apreciarán la explicación de lo que pasó y lo que este commit arregla.</li></ul><h2 id="mejores-pr-cticas-para-el-almacenamiento-de-datos-confidenciales-en-git">Mejores prácticas para el almacenamiento de datos confidenciales en Git</h2><p>Para evitar una situación como está en el futuro, aquí hay algunos consejos sobre el almacenamiento de datos confidenciales:</p><h3 id="mant-n-los-datos-confidenciales-en-un-archivo-env-o-un-archivo-similar-en-otras-plataformas-">Mantén los datos confidenciales en un archivo .env (o un archivo similar en otras plataformas)</h3><p>Mantén las claves del API y otros datos confidenciales en un solo archivo .env. De esa manera, no realizarás un commit accidentalmente con la nueva clave cuando el archivo .env ya está excluido de git.</p><p>Otro gran beneficio es que tienes acceso a todas las claves usando una variable de <em>proceso</em> global.</p><h3 id="usa-claves-api-si-es-posible">Usa claves API si es posible</h3><p>Las claves API son fáciles de generar y desactivar si se ven comprometidas. Si es posible, úsalas y evita el uso de credenciales/contraseñas.</p><h3 id="agrega-las-claves-api-a-tu-herramienta-de-construcci-n">Agrega las claves API a tu herramienta de construcción</h3><p>Las claves API suelen ser necesarias durante la construcción de aplicaciones. Las herramientas de construcción como Netlify permiten agregar estas claves en las áreas seguras de su administración. Estas claves se inyectan automáticamente en tu aplicación a través de la variable de <em>proceso</em> global.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/netlify.png" class="kg-image" alt="netlify" width="600" height="400" loading="lazy"></figure><h3 id="agrega-el-archivo-env-a-gitignore">Agrega el archivo .env a gitignore</h3><p>Asegúrate de que Git no rastree los archivos que contengan información confidencial.</p><h3 id="proporciona-un-archivo-env-template">Proporciona un archivo .env.template </h3><p>El archivo de plantilla (template) instruye a otros colaboradores para que añadan las claves API necesarias sin necesidad de leer largos documentos.</p><h3 id="no-cambies-el-historial-en-remoto">No cambies el historial en remoto</h3><p>Usa esto como una regla general. Si has seguido las reglas anteriores, no necesitarás cambiar el historial.</p><p>Espero que esta información te haya ayudado a mantenerte en el lado seguro. ¿Tienes una experiencia personal al deshacer commits o quizás una buena <em>lección aprendida</em>? <a href="https://twitter.com/ondrabus">Háblame en Twitter</a> :-)</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/ondrej/"><strong>Ondrej Polesny</strong></a> - <a href="https://www.freecodecamp.org/news/how-to-uncommit-sensitive-files-from-git/"><strong>How to Uncommit Sensitive Files from Git</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Una introducción completa a SSH y cómo permite compartir datos de forma segura ]]>
                </title>
                <description>
                    <![CDATA[ Este artículo tomará un enfoque de alto nivel y de arriba hacia abajo para explicar cómo funciona SSH y cómo se usa para comunicarse de manera segura con computadoras remotas. Veremos como una sesión de SSH es realmente "segura" y cómo las computadores establecen y configuran una sesión de SSH ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/una-introduccion-completa-a-ssh/</link>
                <guid isPermaLink="false">5fe7a54e8c7cd154bb97ef4c</guid>
                
                    <category>
                        <![CDATA[ Seguridad ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Tue, 19 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/1-TiltvM4ydji8sXcvbsEL_Q.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Este artículo tomará un enfoque de alto nivel y de arriba hacia abajo para explicar cómo funciona SSH y cómo se usa para comunicarse de manera segura con computadoras remotas.</p><p>Veremos como una sesión de SSH es realmente "segura" y cómo las computadores establecen y configuran una sesión de SSH en primer lugar. También veremos los beneficios de usar SSH.</p><p><em>Nota: </em>Esto está pensado como notas futuras para mí, ¡pero espero que tú también aprendas algo de ello!</p><h3 id="-qu-es-ssh">¿Qué es SSH?</h3><p>SSH es la abreviatura de 'secure shell'. Es un protocolo para compartir datos entre dos computadoras a través de Internet.</p><p>Un protocolo es esencialmente un conjunto de reglas que definen el lenguaje que las computadores pueden utilizar para comunicarse.</p><p>Típicamente, las dos computadores involucradas son tu computadora (el "cliente) y un servidor remoto (el "host).</p><h3 id="-por-qu-nos-importa">¿Por qué nos importa?</h3><h4 id="comunicaci-n-segura-entre-computadoras">Comunicación segura entre computadoras</h4><p>Siempre que dos computadoras se comunican por Internet queremos estar seguros de que nuestros mensajes no pueden ser interceptados y entendidos por nadie que escuche los mensajes.</p><p>Imagina enviar tus datos bancarios a través de Internet para comprar algo en línea. Si tus mensajes no estuvieran cifrados, entonces cualquier computadora que estuviera escuchando o cualquier computadora que recibiera los mensajes para transmitirlos podría ver tu número de cuenta y tu contraseña. ¡Eso no es bueno!</p><p>Creo que es un concepto importante de entender para cualquiera que aspire a trabajar con tecnologías web.</p><h4 id="acceso-seguro-a-computadoras-remotas">Acceso seguro a computadoras remotas</h4><p>El uso de SSH para comprobar la autenticación es una forma más segura de autenticación que el uso de una contraseña. A continuación exploraremos cómo funciona esto.</p><h3 id="-c-mo-es-ssh-seguro">¿Cómo es SSH seguro?</h3><p>SSH es una forma segura de enviar comunicaciones entre dos computadoras.</p><p>Por 'seguro', me refiero a una forma de codificar los mensajes en una computadora cliente de tal manera que la única otra computadora que puede decodificar los mensajes y entenderlos es el host. Esta codificación/decodificación se llama cifrado, así que lo que realmente queremos decir aquí es que SSH es seguro porque utiliza un canal de comunicación cifrado.</p><h3 id="-c-mo-se-establece-una-sesi-n-de-ssh">¿Cómo se establece una sesión de SSH?</h3><p>Hay varios procesos que deben ocurrir entre dos computadoras para que comience una sesión de SSH.</p><ol><li>Primero necesitamos una forma de establecer un método seguro de intercambio de mensajes entre las computadoras. Necesitamos establecer un <strong>canal cifrado</strong>.</li><li>Necesitamos una forma de comprobar que los datos recibidos por el host no han sido manipulados. Esto se llama <strong>verificación</strong> y aquí estamos verificando la integridad de los datos que son enviados por el cliente.</li><li>Verificación (de nuevo). Necesitamos una forma de comprobar que la computadora con la que nos comunicamos no es un impostor. Esta es otra forma de verificación pero aquí estamos verificando la identidad de la computadora.</li></ol><p>Después de estos tres pasos, ahora podemos comunicarnos de forma segura con una computadora remota.</p><p>Después de estos pasos, podemos compartir datos "secretos" de forma segura y también podemos comprobar si un cliente tiene permiso para acceder a un host de forma más segura que usando una contraseña. Este proceso se llama <strong>autenticación usando cifrado asimétrico</strong>.</p><p>Cada una de estas secciones a continuación entrará en más detalles sobre estos pasos.</p><h3 id="configurar-un-canal-cifrado"><strong>Configurar un canal cifrado</strong></h3><p>Una parte esencial del protocolo SSH es que es seguro (¡está incluso en el nombre!), lo que significa que toda la información que se envía usando SSH está cifrada.</p><h4 id="-c-mo-se-cifra-esta-informaci-n">¿Cómo se cifra esta información?</h4><p>Cifrar esencialmente sólo significa "mezclar las letras" usando algunas matemáticas inteligentes. Ambas computadoras necesitan tener una forma de cifrar la información para que sólo la otra computadora pueda descifrarla y entenderla.</p><h4 id="-c-mo-funciona-esto">¿Cómo funciona esto?</h4><p>Ambas computadoras tienen una versión idéntica de una <strong>clave simétrica</strong>. La clave simétrica es sólo una cadena de letras almacenadas en algún lugar de las computadoras. Las computadoras pueden usar las claves simétricas para cifrar y también descifrar los mensajes que se les envían.</p><p>El uso de este enfoque de clave simétrica se llama <strong>cifrado simétrico</strong>. La parte "simétrica" viene del hecho de que la clave simétrica en cada computadora es idéntica. Este enfoque funciona muy bien... pero sólo funciona mientras ninguna otra computadora tenga acceso a la clave simétrica.</p><h4 id="un-problema">Un problema</h4><p>¿Cómo saben ambas computadoras cuál es la clave simétrica?</p><p>Una computadora podría crearla y enviarla en un mensaje a través de Internet. Pero los mensajes no estarían cifrados todavía, así que cualquiera que intercepto los mensajes tendría instantáneamente la clave simétrica ... y podría descifrar todas las comunicaciones futuras. ¡Eso es malo!</p><p>Esto a veces se llama el problema del "intercambio de claves". Está claro que necesitamos agregar otro paso en el proceso antes de poder usar las claves simétricas.</p><h4 id="una-soluci-n">Una solución</h4><p>Una solución al problema del "intercambio de claves" mencionado anteriormente es que ambas computadoras compartan alguna información pública entre sí (es "pública", lo que significa que no les importa si alguien la intercepta) y la combinen con alguna información en su propia computadora para crear <strong>independientemente</strong> claves simétricas <strong>idénticas</strong>.</p><p>Estas claves simétricas pueden ser usadas en el cifrado simétrico de la manera descrita anteriormente.</p><h4 id="c-mo-funciona">Cómo funciona</h4><p>Ambas computadoras tienen cada una su propia clave privada y su clave pública. Juntos forman un <strong>par de claves (key-pair)</strong>. Las computadoras <strong>comparten sus claves públicas</strong> entre sí a través de Internet. Así que, en este punto del proceso cada computadora sabe</p><ul><li>su propia clave privada,</li><li>su propia clave pública,</li><li>y la clave pública de la otra computadora.</li></ul><h4 id="generando-claves-sim-tricas">Generando Claves Simétricas</h4><p>Ambas computadoras usan estas tres piezas de información para generar independientemente una clave simétricas idéntica.</p><p>Cada computadora utiliza un algoritmo matemático que utiliza las 3 entradas mencionadas anteriormente. Este algoritmo es parte del algoritmo de intercambio de claves Diffie-Hellman. El algoritmo que se ejecutará en cada computadora es algo así:</p><pre><code>Host
pub_2 = other computer's public key
pub_1 = my public key
pri_1 = my private key

f(pub_2, pub_1, pri_1) = abcdefg // Symmetric Key

Client:
f(pub_1, pub_2, pri_2) = abcdefg // Symmetric Key</code></pre><p>Lo importante es que las computadoras sólo han <strong>compartido información pública</strong> a través de Internet, <strong>¡pero aún así han sido capaces de crear claves simétricas!</strong></p><p>El enfoque de utilizar pares de claves y compartir información pública para generar claves simétricas idénticas se llama <strong>cifrado asimétrico</strong>. Se llama "asimétrico" porque ambas computadoras comienzan con sus propios pares de claves, diferentes.</p><p><strong>Hasta ahora:</strong> hemos visto cómo usar el cifrado asimétrico para generar independientemente claves simétricas idénticas en ambas computadoras de una manera segura (resolviendo el problema de intercambio de claves) y luego intercambiar información de manera segura entre las computadoras usando claves simétricas para el cifrado y descifrado.</p><h3 id="verificaci-n">Verificación</h3><p>Así que podemos comunicarnos de forma segura. Pero la siguiente parte del proceso de establecer una sesión de SSH es verificar que los datos no han sido manipulados como han sido transmitidos y que la otra computadora es realmente quien dice ser.</p><h4 id="-por-qu-necesitamos-esto">¿Por qué necesitamos esto?</h4><p>Otra computadora podría personificar otra de las computadoras e iniciar el intercambio de claves de arriba. Entonces, ¿cómo podemos averiguar con <strong>seguridad</strong> que el mensaje es realmente de la otra computadora y no de un impostor?</p><h4 id="hashing">Hashing</h4><p>Tenemos que usar una función de <strong>hash</strong>. Esta es sólo una función matemática que toma entradas y produce una cadena de un tamaño fijo.</p><p>La característica importante de esta función es que es virtualmente imposible calcular lo que las entradas fueron sólo usando salidas.</p><p>Después de que un cliente y un host hayan generado sus claves simétricas, el cliente usará una función hash para generar un HMAC. Esto sólo significa "código de autenticación de mensaje basado en hash" (hash-based message authenticacion code). El cliente enviará este HMAC al servidor para su verificación.</p><p>Los ingredientes de la función de hash son</p><ul><li>La clave simétrica en el cliente</li><li>El número de secuencia del paquete (cada mensaje que se envía está contenido en un "paquete" de información)</li><li>El contenido (¡¡¡cifrado!!!) del mensaje</li></ul><p>Un ejemplo con datos falsos:</p><pre><code>symm_key       = abcdefg
pkge_no        = 13
encr_message   = encrypted_password

Hash(symm_key, pkge_no, encr_message) = *HMAC* // Hashed value</code></pre><h3 id="-c-mo-es-que-el-host-usa-esta-informaci-n">¿Cómo es que el host usa esta información?</h3><p>Cuando el host recibe el HMAC, puede usar <strong>la misma</strong> función hash con estos tres ingredientes:</p><ul><li>su propia copia de la clave simétrica (¡idéntica!),</li><li>el número de secuencia del paquete,</li><li>y el mensaje cifrado.</li></ul><p>Si el valor calculado es el mismo que el HMAC que recibió del cliente, entonces hemos verificado que la computadora que se conecta es el mismo que tiene la clave simétrica.</p><p>Recuerde que sólo el host y el cliente saben lo que es la clave simétrica y ninguna otra computadora lo sabe.</p><p>Así que aquí no importa que el host no conozca el contenido decodificado del mensaje cifrado — ¡el host aún ha verifica la identidad de la computadora que se conecta!</p><p>La belleza de este enfoque es que no sólo hemos verificado la identidad del cliente y nos hemos asegurado de que los datos no han sido manipulados, sino que lo hemos hecho de forma segura (<strong>sin compartir ninguna información privada</strong>).</p><p><strong>Resumen:</strong> hemos utilizado una función hash en el cliente y luego en el host para verificar la integridad de los datos y comprobar la identidad del cliente.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/ej0rVm5QFV0xIuBr4f2Dm8CIAqxZTjkfl5jP" class="kg-image" alt="ej0rVm5QFV0xIuBr4f2Dm8CIAqxZTjkfl5jP" width="800" height="533" loading="lazy"></figure><h3 id="autenticaci-n">Autenticación</h3><p>La parte final de la comunicación segura con las computadoras remotas es:</p><p><em>incluso </em>si hemos generado claves simétricas con la computadora de conexión e</p><p><em>incluso </em>si estamos usando las claves simétricas para comunicarnos de forma segura e</p><p><em>incluso </em>si la computadora que se conecta es realmente el cliente que esperamos y no un impostor,</p><p>entonces hemos establecido una sesión de SSH... ¿pero la computadora que se conecta tiene permiso para acceder al contenido del host?</p><p>Esto se llama "autenticación": el acto de comprobar los permisos y derechos de acceso.</p><h4 id="hay-dos-formas-para-comprobar-la-autenticaci-n-">Hay dos formas para comprobar la autenticación:</h4><p><strong>1—Usando una contraseña</strong></p><p>El cliente puede enviar al host un mensaje (cifrado) que contenga una contraseña. El host puede descifrar el mensaje y comprobar la contraseña en una base de datos para comprobar si el cliente tiene permiso para acceder al "usuario" (área de la computadora) especificado. Listo.</p><p><strong>2 — Usando par de claves y cifrado asimétrico</strong></p><p>Antes vimos cómo el cifrado asimétrico puede utilizar dos pares de claves para generar de forma segura claves simétricas idénticas tanto en el cliente como en el host. Usando ideas similares, el cliente puede iniciar sesión sin una contraseña.</p><p>Este es un enfoque de muy alto nivel de cómo funciona el proceso:</p><p><em>Preparación:</em></p><p>En el cliente, dirígete a la terminal y usa un comando para generar una clave pública y una clave privada (bajo la superficie utiliza "RSA", un algoritmo matemático) en el cliente. Copia la clave <strong>pública</strong> (¡NO la privada!) en el portapapeles.</p><p><em>Repito: </em>Copia la clave <strong>PÚBLICA</strong> (¡<strong>NO LA CLAVE</strong> <strong>PRIVADA!</strong>) en el portapapeles.</p><p>Luego, en la terminal del cliente, usa una contraseña para ingresar remotamente al host. Pega la clave pública del cliente en la carpeta apropiada del host junto con cualquier otra clave pública.</p><p>Ahora, el host tiene</p><ul><li>Su propio par de claves pública/privada</li><li>La clave pública del cliente</li></ul><p>Mirando la sección anterior sobre el algoritmo de intercambio de claves, ¡se puede ver cómo el host tiene todos los ingredientes que necesita para generar una clave simétrica!</p><p><em>Desafiante:</em></p><p>Cuando el cliente quiere conectarse, el host puede emitir un "desafío" enviando un mensaje que ha sido cifrado (con la clave simétrica del host) y decir: "¡Sólo te autorizaré el acceso si puedes descifrar este mensaje!".</p><p>El cliente entonces tiene</p><ul><li>su propia clave pública y privada</li><li>la clave pública del host</li><li>el mensaje cifrado</li></ul><p>Así que ahora el cliente tiene todo lo necesario para generar una clave simétrica (idéntica) ... ¡y descifrar el mensaje! Puede descifrar el mensaje y enviar una confirmación de que ha "tenido éxito" en el desafío de vuelta al host.</p><p>El host está satisfecho de que el cliente que se conecta está autorizado y concede permiso para el acceso.</p><h3 id="-por-qu-molestarse-en-usar-el-segundo-enfoque">¿Por qué molestarse en usar el segundo enfoque?</h3><p>Esto se considera más seguro que el simple uso de una contraseña, ya que un bot puede utilizar un enfoque de "fuerza bruta" para seguir usando muchas combinaciones para adivinar tu contraseña, pero no tendrá el par de claves correctos para que funcione el segundo enfoque.</p><p>Más lecturas:</p><p><a href="https://www.hostinger.com/tutorials/ssh-tutorial-how-does-ssh-work" rel="noopener"><strong>SSH Tutorial for Beginners - How Does SSH Work</strong></a><br><a href="https://www.hostinger.com/tutorials/ssh-tutorial-how-does-ssh-work" rel="noopener"><em>SSH, or Secure Shell, is a remote administration protocol that allows users to control and modify their remote servers…</em>www.hostinger.com</a></p><p><a href="https://www.udemy.com/the-complete-junior-to-senior-web-developer-roadmap/">https://www.udemy.com/the-complete-junior-to-senior-web-developer-roadmap/</a></p><h3 id="conclusi-n">Conclusión</h3><p>SSH es una importante herramienta utilizada para controlar remotamente otras computadoras.</p><p>SSH es seguro porque ambas computadoras pueden cifrar y descifrar el mensaje usando idénticas claves simétricas (conocido como "cifrado simétrico").</p><p>Los principales pasos para iniciar una sesión de SSH son:</p><ol><li><strong>Configurar un canal cifrado.</strong> Usando cifrado asimétrico para resolver el problema de intercambio de claves que genera independientemente claves simétricas idénticas en ambas computadoras sin compartir ninguna información privada.</li><li><strong>Verificación. </strong>Usando hashing en ambas computadoras para verificar la identidad de la computadora conectada.</li><li><strong>Verificación (otra vez). </strong>El uso de hashing en ambas computadoras para verificar la integridad de los datos no se ha visto comprometido en la transmisión.</li></ol><p>Podemos usar SSH para enviar datos de forma segura entre las computadoras. Un caso de uso importante de esto es para la <strong>autenticación</strong>. Aunque se puede usar una contraseña, el uso de cifrado asimétrico para comprobar que el "cliente" que se conecta tiene permiso para acceder al "host" se considera más seguro.</p><p>Si estás interesado en subir el nivel de tu SSH, te recomiendo seriamente <a href="https://www.udemy.com/the-complete-junior-to-senior-web-developer-roadmap/">este</a> curso. ¡He encontrado muy útil para perfeccionar algunas de mis habilidades! (<em>descargo de responsabilidad:</em> No tengo ningún vínculo o conexión con el autor o la plataforma. ¡Tomé el curso hace un tiempo y lo encontré realmente bueno!)</p><p>¡Gracias por leer!</p><p>Traducido del artículo de <strong>Sam Ollason</strong> - <a href="https://www.freecodecamp.org/news/a-top-down-introduction-to-ssh-965f4fadd32e/"><strong>A top-down introduction to SSH and how it enables secure data-sharing</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guía para Principiantes de Git — Cómo Escribir un Buen Mensaje de Commit ]]>
                </title>
                <description>
                    <![CDATA[ ¿Eres un desarrollador que ha empezado a usar Git recientemente? Si te preguntas cómo crear un buen mensaje de commit para tu proyecto, entonces este artículo está hecho para ti. Después de unas semanas de escribir, vuelvo hoy con un seguimiento de una de mis publicaciones más buscadas en Google. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/guia-para-principiantes-de-git-como-escribir-un-buen-mensaje-de-commit/</link>
                <guid isPermaLink="false">5fe7d9e38c7cd154bb97f43b</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Mon, 18 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/how-to-write-a-good-commit-message.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>¿Eres un desarrollador que ha empezado a usar Git recientemente? Si te preguntas cómo crear un buen mensaje de commit para tu proyecto, entonces este artículo está hecho para ti.</p><p>Después de unas semanas de escribir, vuelvo hoy con un seguimiento de una de mis publicaciones más buscadas en Google.</p><p>Cuando empecé a escribir, hace un año, creé un artículo sobre <a href="https://herewecode.io/blog/a-beginners-guide-to-git-how-to-start-and-create-your-first-repository/">cómo empezar y crear tu primer repositorio con Git</a>.</p><p>Este artículo ayuda a mucha gente cada semana. Así que decidí escribir este post sobre cómo escribir un buen mensaje de commit para que puedas llevar tus habilidades en Git al siguiente nivel.</p><h2 id="-qu-es-un-buen-mensaje-de-commit">¿Qué es un buen mensaje de commit?</h2><p>Como un breve recordatorio, un mensaje de commit es el texto corto que dejaste cuando guardaste tu trabajo en Git. Este mensaje tiene como objetivo identificar tu trabajo.</p><p>La idea es que con solo leerlo, cualquiera podrá entender claramente lo que hiciste en esta parte de tu trabajo.</p><h3 id="un-buen-ejemplo-de-commit">Un buen ejemplo de commit</h3><p>A continuación, puedes encontrar los últimos commits del proyecto Angular.js en GitHub. Como puedes ver, los mensajes son claros, y podemos entender mejor qué trabajo se ha hecho en las diferentes partes.</p><p>Por ejemplo, el 24 de julio de 2019, "gkalpak" actualizó "SauceConnect" y cambió a la última versión de Safari (el navegador web).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/git-commits-history.png" class="kg-image" alt="git-commits-history" width="600" height="400" loading="lazy"><figcaption>Historial de git commits en el proyecto Angular.js <a href="https://github.com/angular/angular.js/commits/master">en GitHub</a></figcaption></figure><h3 id="-por-qu-no-todos-realizan-commits-de-la-misma-manera">¿Por qué no todos realizan commits de la misma manera?</h3><p>Desafortunadamente, no hay una forma universal de escribir commits. Cada proyecto y cada empresa definen reglas específicas para sus necesidades.</p><p>Pero no te preocupes, a menudo encontrarás formas similares de escribir un mensaje.</p><p>Para saber cuáles son, te recomiendo que leas las reglas antes de empezar en una empresa o de trabajar en un proyecto de código abierto.</p><p>Te daré más detalles sobre estas pautas más adelante en este artículo.</p><h2 id="por-qu-es-esencial-escribir-bien-tu-commit">Por qué es esencial escribir bien tu commit</h2><p>He creado una lista corta de las ventajas de usar un buen mensaje de commit.</p><h3 id="mejor-colaboraci-n">Mejor colaboración</h3><p>Si trabajas en una empresa, o en un proyecto de código abierto, es esencial seguir las reglas para una mejor cooperación. Si escribes algo comprensible, siguiendo las reglas del proyecto, otros desarrolladores podrán trabajar más eficientemente. No tendrán que hacer preguntas sobre tu trabajo.</p><blockquote>Nota: Si estás trabajando en un proyecto personal, te recomiendo encarecidamente que también sigas unas normas específicas. Esto mejorará tu productividad, y si necesitas ayuda de otro desarrollador, será más fácil para ellos empezar a trabajar en tu proyecto.</blockquote><h3 id="mejor-entendimiento">Mejor entendimiento</h3><p>Necesitas crear mensajes claros y comprensibles. Esto te ayudará a ti y a tu colaborador a trabajar juntos en un proyecto. A continuación, puedes encontrar un ejemplo de un historial de git commits con mensajes poco claros. Como verás, es difícil de entender lo que estaba pasando.</p><h3 id="bonus-una-generaci-n-de-registro-de-cambios">BONUS - Una generación de registro de cambios</h3><p>Te diré un pequeño secreto: si escribes buenos mensajes, podrás generar un registro de cambios directamente desde tus mensajes de commits.</p><p>Aquí hay algunas herramientas para hacerlo:</p><ul><li><a href="https://github.com/github-changelog-generator/github-changelog-generator">Github Changelog Generator</a></li><li><a href="https://github.com/git-chglog/git-chglog">Git Chglog</a></li><li><a href="https://github.com/CookPete/auto-changelog">Auto Changelog</a></li><li><a href="https://github.com/conventional-changelog/conventional-changelog">Conventional Changelog</a>.</li></ul><p>También escribiré un próximo artículo sobre este tema. Si quieres estar al día, <a href="https://twitter.com/gaelthomas_">puedes seguirme en Twitter</a>. Yo publico todas las actualizaciones allí.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/bad-git-commits.png" class="kg-image" alt="bad-git-commits" width="600" height="400" loading="lazy"><figcaption>Ejemplo de malos git commits de <a href="https://jasonmccreary.me/articles/when-to-make-git-commit/">Jason McCreary</a></figcaption></figure><blockquote>Nota: Si quieres tener más ejemplos de malos commits y divertirte al mismo tiempo, <a href="https://twitter.com/gitlost">una cuenta de Twitter llamada "gitlost"</a> está twiteando todos los días con los commits divertidos y sin filtros.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/git-changelog.png" class="kg-image" alt="git-changelog" width="600" height="400" loading="lazy"><figcaption>Ejemplo de un Git changelog autogenerado</figcaption></figure><p>Bien, ahora entremos en más detalles y veamos lo que realmente se necesita para escribir un buen mensaje de commit.</p><h2 id="c-mo-escribir-un-mensaje-de-commit">Cómo escribir un mensaje de commit</h2><p>Si quieres escribir un buen mensaje de commit, tienes que seguir algunas reglas. He creado una lista de verificación a continuación. Cada vez que quieras hacer un commit, tómate el tiempo de consultar esta lista.</p><ul><li><strong>Siempre revisa tu gramática.</strong> Nunca es agradable leer un mensaje lleno de errores. Para ello, te recomiendo que utilices una herramienta gramatical. Si escribes en inglés, puedes usar Grammarly, Reverso o GrammarCheck. Estar herramientas no son perfectas, pero eliminarán la mayoría de tus errores.</li><li><strong>Un commit, un cambio.</strong> Trata de realizar commits a menudo. Lo ideal es que cada cambio se haga en un commit diferente. Será más fácil para ti volver a tu trabajo anterior.</li><li><strong>Sé claro.</strong> Cuando escribas un commit, intenta ser lo más transparente posible. Te recomiendo que uses inglés (o español) sencillo y vayas directo al grano.</li><li><strong>Detalla lo que hiciste.</strong> Tómate el tiempo de releer tu código para escribir lo que hiciste. En caso de que necesites agregar muchos detalles, usa la parte de la descripción del commit.</li></ul><h3 id="el-comando-git-commit">El comando git commit</h3><p>Quiero compartirte más detalles sobre el comando 'git commit'. Si no estás usando git software, debes saber que puedes crear commits detallados escribiendo este comando.</p><pre><code>$ git commit -m "Título" -m "Descripción"
</code></pre><p>Es lo mismo que antes, pero con una segunda parte para la descripción. Así "-m 'título' " te permite escribir el título corto del commit, y "-m 'descripción' " te permite escribir la descripción si necesitas dar más detalles.</p><h3 id="usa-directrices-o-pautas-de-git">Usa directrices o pautas de git</h3><p>Si quieres tener un historial de git commits claro, debes seguir algunas pautas. En mi caso elegí <a href="http://udacity.github.io/git-styleguide/">este simple de Udacity</a>.</p><p>Hay muchas otras, como los <a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a>, y el <a href="https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit">Angular Guideline</a>. Una pauta de commits te ayudará a estructurar tus commits.</p><p>Por ejemplo, añadiendo una etiqueta para aclarar lo que hiciste: "git commit -m 'fix: borra correctamente toda la información del usuario cuando se activa el botón de borrar la cuenta'".</p><h2 id="conclusi-n">Conclusión</h2><p>¡Espero que te haya gustado esta guía sobre cómo realizar commits con Git! Si tienes alguna pregunta o comentario, no dudes en preguntar.</p><p>Si tienes algún otro consejo sobre cómo hacer buenos commits, por favor házmelo saber.</p><p>No te pierdas mi contenido siguiéndome en <a href="https://twitter.com/gaelthomas_">Twitter</a> e <a href="https://www.instagram.com/herewecode.io/">Instagram</a>.</p><p>Puedes encontrar otros artículos como este en mi sitio web: <a href="https://herewecode.io/">herewecode.io</a>.</p><h3 id="-quieres-m-s">¿Quieres más?</h3><ul><li>Cada semana recibe una cita motivacional con algunos consejos, un breve tutorial en una cuantas diapositivas, y una foto de un desarrollador en <a href="https://www.instagram.com/herewecode.io/">Instagram</a>.</li><li><a href="https://mailchi.mp/26f79f1a37d6/herewecode">Suscríbete al boletín de noticias</a> y recibe los últimos artículos, cursos, tutoriales, consejos, libros, motivación y otros contenidos exclusivos.</li></ul><p>Traducido del artículo de <strong><a href="https://www.freecodecamp.org/news/author/gaelthomas/"></a><a href="https://www.freecodecamp.org/news/a-beginners-guide-to-git-how-to-write-a-good-commit-message/">Gaël Thomas</a> </strong>- <a href="https://www.freecodecamp.org/news/a-beginners-guide-to-git-how-to-write-a-good-commit-message/"><strong>A Beginner’s Guide to Git — How to Write a Good Commit Message</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo Obtener y Configurar tus Claves SSH para Git y GitHub ]]>
                </title>
                <description>
                    <![CDATA[ Si usas GitHub sin configurar una clave SSH, realmente te estás perdiendo de algo genial. Piensa en todo el tiempo que pasaste introduciendo tu correo electrónico y tu contraseña en la consola cada vez que haces un commit podrías haberlo pasado programando. Bueno, ya no más. Aquí hay una guía ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-obtener-y-configurar-tus-claves-ssh-para-git-y-github/</link>
                <guid isPermaLink="false">5fe79cb18c7cd154bb97ee3f</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Fri, 15 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1550527882-b71dea5f8089.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Si usas GitHub sin configurar una clave SSH, realmente te estás perdiendo de algo genial. Piensa en todo el tiempo que pasaste introduciendo tu correo electrónico y tu contraseña en la consola cada vez que haces un commit podrías haberlo pasado programando.</p><p>Bueno, ya no más. Aquí hay una guía rápida para generar y configurar una clave SSH con GitHub para que nunca más tengas que autentificarte a la antigua.</p><h3 id="comprobar-si-existe-una-clave-ssh">Comprobar si existe una clave SSH</h3><p>Primero, comprueba si ya has generado las claves SSH para tu máquina. Abre una terminal e introduce el siguiente comando:</p><pre><code class="language-shell">ls -al ~/.ssh</code></pre><p>Si ya has generado las claves SSH, deberías ver una salida similar a esta:</p><pre><code class="language-sh">-rw-------  1 usuario usuario  1766 Jul  7  2018 id_rsa
-rw-r--r--  1 usuario usuario   414 Jul  7  2018 id_rsa.pub
-rw-------  1 usuario usuario 12892 Feb  5 18:39 known_hosts</code></pre><p>Si tus claves ya existen, pasa a la sección <strong>Copia tu clave pública de SSH</strong> abajo.</p><p>Si no ves ninguna salida o ese directorio no existe (obtienes un mensaje de <code>No such file or directory</code>), entonces ejecuta:</p><pre><code class="language-shell">mkdir $HOME/.ssh</code></pre><p>Luego genera un nuevo conjunto de claves con:</p><pre><code class="language-shell">ssh-keygen -t rsa -b 4096 -C tu@correo.com</code></pre><p>Ahora comprueba que tus claves existen con el comando <code>ls -al ~/.ssh</code> y asegúrate de que la salida es similar a la anterior.</p><p><strong>Nota: </strong>Las claves SSH siempre se generan como un par de claves públicas (<code>id_rsa.pub</code>) y privadas (<code>id_rsa</code>). Es extremadamente importante que <strong>nunca reveles tu clave privada</strong>, y que <strong>sólo uses tu clave pública</strong> para cosas como la autenticación de GitHub. Puedes leer más sobre cómo funcionan los pares de claves SSH / RSA <a href="https://www.freecodecamp.org/news/a-top-down-introduction-to-ssh-965f4fadd32e/">aquí</a>.</p><h3 id="agrega-tu-clave-ssh-a-ssh-agent">Agrega tu clave SSH a ssh-agent</h3><p><code>ssh-agent</code> es un programa que se inicia cuando te conectas y almacena tus claves privadas. Para que funciones correctamente, debe estar ejecutándose y tener una copia de tu clave privada.</p><p>Primero, asegúrate de que <code>ssh-agent</code> se está ejecutando con:</p><pre><code class="language-shell">eval "$(ssh-agent -s)" # para Mac y Linux</code></pre><p>o:</p><pre><code class="language-shell">eval `ssh-agent -s`
ssh-agent -s # para Windows</code></pre><p>Entonces, agrega tu clave privada a <code>ssh-agent</code> con:</p><pre><code class="language-shell">ssh-add ~/.ssh/id_rsa</code></pre><h3 id="copia-tu-clave-p-blica-de-ssh">Copia tu clave pública de SSH</h3><p>A continuación, tienes que copiar tu clave pública de SSH en el portapapeles.</p><p>Para Linux o Mac, imprime el contenido de tu clave pública en la consola con:</p><pre><code class="language-shell">cat ~/.ssh/id_rsa.pub # Linux</code></pre><p>Luego resalta y copia la salida.</p><p>O para Windows, simplemente ejecuta:</p><pre><code class="language-shell">clip &lt; ~/.ssh/id_rsa.pub # Windows</code></pre><h3 id="agrega-tu-clave-ssh-p-blica-a-github">Agrega tu clave SSH pública a GitHub</h3><p>Ve a la página de <a href="https://github.com/settings/keys">configuración</a> de tu GitHub y haz clic en el botón "New SSH key":</p><p>Luego dale a tu clave un título reconocible y pégala en tu clave pública (<code>id_rsa.pub</code>):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/02/image-15.png" class="kg-image" alt="image-15" width="600" height="400" loading="lazy"></figure><p>Finalmente, prueba la autenticación con:</p><pre><code class="language-shell">ssh -T git@github.com</code></pre><p>Si has seguido todos estos pasos correctamente, deberías ver este mensaje:</p><pre><code class="language-sh">Hi tu_usuario! You've successfully authenticated, but GitHub does not provide shell access.
</code></pre><h3 id="m-s-informaci-n-sobre-ssh-">Más información sobre SSH:</h3><ul><li><a href="https://www.freecodecamp.org/news/the-ultimate-guide-to-ssh-setting-up-ssh-keys/">Ultimate guide to SSH</a></li><li><a href="https://www.freecodecamp.org/news/a-top-down-introduction-to-ssh-965f4fadd32e/">A top-down intro to SSH</a></li></ul><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/git-ssh-how-to/"><strong>How to Get and Configure Your Git and GitHub SSH Keys</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear tu primer Pull Request en GitHub ]]>
                </title>
                <description>
                    <![CDATA[ Existen muchos tutoriales sobre este tema, pero hacen las cosas demasiado complicadas al asumir que uno tiene que contribuir con código a un proyecto. ¿Y si solo necesitan editar un archivo, tal vez el README de un proyecto para arreglar una errata? No necesitas saber cómo programar o cómo usar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-tu-primer-pull-request-en-github/</link>
                <guid isPermaLink="false">5fe4002e8c7cd154bb97d67b</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Thu, 14 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/pr.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Existen muchos tutoriales sobre este tema, pero hacen las cosas demasiado complicadas al asumir que uno tiene que contribuir con <strong>código</strong> a un proyecto.</p><p>¿Y si solo necesitan editar un archivo, tal vez el README de un proyecto para arreglar una errata?</p><p>No necesitas saber cómo programar o cómo usar Git para hacerlo. Pero una vez que empieces a hacer Pull Requests, podrás hacer muchas más cosas y colaborar en proyectos con otras personas. Y tal vez esto te empuje a contribuir también con código más adelante.</p><p>Supongo que ya tienes una cuenta de GitHub (gratuita). Si no la tienes, entonces ve a <a href="https://github.com/">github.com</a> y consigue una.</p><p>Déjame mostrarte el proceso.</p><p>Fui a esta página <a href="https://web.dev/prefers-color-scheme/">https://web.dev/prefers-color-scheme/</a> y encontré una posible errata. A esta línea le falta un punto al final.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/article-i-want-to-edit.png" class="kg-image" alt="article-i-want-to-edit" width="600" height="400" loading="lazy"></figure><blockquote><em>No soy muy riguroso con la gramática, esto es sólo para encontrar un ejemplo...</em></blockquote><p>Sé que ese sitio está alojado en GitHub, y que el artículo exacto está alojado aquí: <a href="https://github.com/GoogleChrome/web.dev/tree/master/src/site/content/en/blog/prefers-color-scheme">https://github.com/GoogleChrome/web.dev/tree/master/src/site/content/en/blog/prefers-color-scheme</a></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/github-folder-for-article.png" class="kg-image" alt="github-folder-for-article" width="600" height="400" loading="lazy"></figure><p>Abro el archivo index.md <a href="https://github.com/GoogleChrome/web.dev/blob/master/src/site/content/en/blog/prefers-color-scheme/index.md">https://github.com/GoogleChrome/web.dev/blob/master/src/site/content/en/blog/prefers-color-scheme/index.md</a> directamente en GitHub y presiono el icono del lápiz en la barra de herramientas del archivo. Al pasar el ratón por encima de él dice: "Fork this project and edit the file".</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/the-index-md-file.png" class="kg-image" alt="the-index-md-file" width="600" height="400" loading="lazy"></figure><p>Esto trae una vista de editor con esta información:</p><blockquote><em>Estás editando un archivo en un proyecto al que no tienes acceso de escritura. Enviando un cambio a este archivo lo escribirá a una nueva rama en su fork flaviocopes/wev.dev, para que puedas enviar un pull request.</em></blockquote><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/the-editor-view.png" class="kg-image" alt="the-editor-view" width="600" height="400" loading="lazy"></figure><p>Puedo ir y agregar ese punto, luego en el formulario de abajo explico los cambios que hice:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/propose-file-change.png" class="kg-image" alt="propose-file-change" width="600" height="400" loading="lazy"></figure><p>Presioné el botón "Propose File Change" y apareció una vista comparativa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/compare-view.png" class="kg-image" alt="compare-view" width="600" height="400" loading="lazy"></figure><p>Allí puedo revisar los cambios que hice, para asegurarme de que todo está bien, y finalmente puedo hacer clic en el botón "Create Pull Request". Actualmente los cambios se han hecho en el fork del proyecto, que fue hecho automáticamente por GitHub cuando hiciste clic en el icono del lápiz.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/open-pull-request.png" class="kg-image" alt="open-pull-request" width="600" height="400" loading="lazy"></figure><p>En la parte superior de esta vista pueden ver que estoy a punto de enviar un PR (Pull Request) al proyecto <code>GoogleChrome/web.dev</code> desde mi formulario <code>flaviocopes/web.dev</code>, desde mi rama <code>patch-2</code> a su rama <code>master</code>.</p><p>Al pulsar el botón "Create Pull Request" se muestra otro formulario donde puedo escribir una descripción detallada del Pull Request.</p><p>Los Pull Requests puede contener muchos cambios diferentes, así que en teoría podrías tener muchos archivos editados en el mismo PR, por eso puedes agregar un resumen.</p><p>Este repositorio tiene una plantilla para el texto del PR, para ayudar al equipo a manejarlo. Nuestro PR es muy simple, así que quito la plantilla y solo pego el contenido del mensaje de confirmación de antes.</p><p>¿Notas la pista de la derecha? Me dice que el proyecto tiene un archivo CONTRIBUTING.md, que explica cómo contribuir y las directrices. Bastante genial.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/contributing.png" class="kg-image" alt="contributing" width="600" height="400" loading="lazy"></figure><p>Parece que necesitamos firmar un CLA (Acuerdo de Licencia de Contribuyente) para completar nuestro PR. Ya firmé un CLA de Google en el pasado, así que este paso está claro para mí, pero puede que tengas que arreglarlo. La mayoría de los proyectos no lo necesitan realmente.</p><p>¡Hice clic en "Create pull request" y ahora se envía el PR!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/pull-request-sent.png" class="kg-image" alt="pull-request-sent" width="600" height="400" loading="lazy"></figure><p>Ahora depende de que los que mantienen el proyecto intervengan y lo acepten, solo tienes que esperar a que te envíen un correo electrónico diciéndote que se ha fusionado, o cualquier comentario que otras personas hayan hecho.</p><p>[... un par de horas pasaron...]</p><p>Recibí un correo electrónico de vuelta, el PR fue rechazado ¡porque ese punto este en el lugar correcto! (No sabía eso).</p><p>Pero de todos modos, aquí hay una cosa que quería añadir: no te enfades o te molestes si un PR que presentas no es aceptado. Los que mantienen el proyecto trabajan en él durante meses o años y saben mejor que tú lo que es mejor para él.</p><p>Además, especialmente con el código, los puntos de vista pueden ser muy diferentes y un PR que creas que es genial puede no ser bienvenido.</p><p>También es mejor preguntar antes de trabajar en un PR sustancial, para ver si es algo que el proyecto realmente necesita.</p><p>La corrección de bugs (errores) es un comienzo fácil.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/flavio/"><strong>Flavio Copes</strong></a> - <a href="https://www.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github/"><strong>How to make your first Pull Request on GitHub</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ npm vs npx — ¿Cuál es la Diferencia? ]]>
                </title>
                <description>
                    <![CDATA[ Si alguna vez has usado Node.js [https://nodejs.org/], entonces seguro que has usado npm. npm (node package manager) es el gestor de dependencias/paquetes que obtienes por defecto cuando instalas Node.js. Proporciona una manera para que los desarrolladores instalen paquetes tanto a nivel global como local. A veces puede que quieras echar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/npm-vs-npx-cual-es-la-diferencia/</link>
                <guid isPermaLink="false">5fe152018c7cd154bb97c60d</guid>
                
                    <category>
                        <![CDATA[ npm ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Tue, 12 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/npm-vs-npx-whats-the-difference-1024x538.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Si alguna vez has usado <a href="https://nodejs.org/">Node.js</a>, entonces seguro que has usado <em>npm</em>.</p><p><strong>npm</strong> (node package manager) es el gestor de dependencias/paquetes que obtienes por defecto cuando instalas Node.js. Proporciona una manera para que los desarrolladores instalen paquetes tanto a nivel global como local.</p><p>A veces puede que quieras echar un vistazo a un paquete específico y probar algunos comandos. Pero no puedes hacerlo sin instalar las dependencias en tu carpeta local de <code>node_modules</code>.</p><p>Ahí es donde entra <strong>npx</strong>.</p><p>En este artículo, vamos a echar un vistazo a las diferencias entre <strong>npm</strong> y <strong>npx</strong> y aprenderemos cómo obtener lo mejor de ambos.</p><p>En primer lugar, vamos a entender lo que npm es en realidad y lo que podemos hacer con él.</p><h2 id="el-gestor-de-paquetes-npm">El gestor de paquetes npm</h2><p>npm es un par de cosas. En primer lugar, es un repositorio en línea para la publicación de proyectos de código abierto Node.js.</p><p>Segundo, es una herramienta CLI que ayuda a instalar esos paquetes y a manejar sus versiones y dependencias. Hay cientos de miles de librerías y aplicaciones de Node.js en npm y muchas más se agregan cada día.</p><p>npm por sí mismo no tiene ningún paquete. Si quieres ejecutar un paquete usando npm, debes especificar ese paquete en tu archivo <code>package.json</code>.</p><p>Cuando los ejecutables se instalan a través de paquetes npm, npm crea enlaces a ellos:</p><ul><li>las instalaciones <strong>locales </strong>tienen enlaces creados en el directorio <code>./node_modules/.bin/</code></li><li>las instalaciones <strong>globales </strong>tienen enlaces creados desde el directorio global <code>bin/</code> (por ejemplo: <code>/usr/local/bin</code> en Linux o <code>%AppData%/npm</code> en Windows)</li></ul><p>Para ejecutar un paquete con npm tienes que escribir la ruta local, así:</p><pre><code class="language-bash">$ ./node_modules/.bin/tu-paquete</code></pre><p>o puedes ejecutar un paquete instalado localmente agregándolo a tu archivo <code>package.json</code> en la sección de scripts, así:</p><pre><code class="language-js">{
  "name": "tu-aplicacion",
  "version": "1.0.0",
  "scripts": {
    "tu-paquete": "tu-paquete"
  }
}</code></pre><p>Luego puedes ejecutar el script usando <code>npm run</code>:</p><pre><code class="language-bash">npm run tu-paquete</code></pre><p>Puedes ver que manejar un paquete con npm simple requiere bastante ceremonia.</p><p>Afortunadamente, aquí es donde <strong>npx</strong> es útil.</p><h2 id="el-ejecutor-de-paquetes-npx">El ejecutor de paquetes npx</h2><p>Desde la versión <a href="https://github.com/npm/npm/releases/tag/v5.2.0">5.2.0</a> de npm, npx está preinstalado con npm. Así que es más o menos estándar hoy en día.</p><p><strong>npx</strong> es también una herramienta CLI cuyo propósito es facilitar la instalación y la gestión de las dependencias alojadas en el registro npm.</p><p>Ahora es muy fácil ejecutar cualquier tipo de ejecutable basado en Node.js que normalmente se instalaría a través de npm.</p><p>Puedes ejecutar el siguiente comando para ver si ya está instalado para tu versión actual de npm:</p><pre><code class="language-bash">$ which npx</code></pre><p>Si no lo está, puede instalarlo así:</p><pre><code class="language-bash">$ npm install -g npx</code></pre><p>Una vez que te asegures de tenerlo instalado, veamos algunos de los casos de uso que hacen que npx sea extremadamente útil.</p><h3 id="ejecutar-un-paquete-instalado-localmente-f-cilmente">Ejecutar un paquete instalado localmente fácilmente</h3><p>Si deseas ejecutar un paquete instalado localmente, todo lo que tienes que hacer es escribir:</p><pre><code class="language-bash">$ npx tu-paquete</code></pre><p>npx comprobará si <code>&lt;comando&gt;</code> o <code>&lt;paquete&gt;</code> existe en <code>$PATH</code>, o en los binarios del proyecto local, y si es así lo ejecutará.</p><h3 id="ejecutar-los-paquetes-que-no-est-n-previamente-instalados">Ejecutar los paquetes que no estén previamente instalados</h3><p>Otra gran ventaja es la capacidad de ejecutar un paquete que no fue instalado previamente.</p><p>A veces sólo quieres usar algunas herramientas CLI pero no quieres instalarlas globalmente sólo para probarlas. Esto significa que puedes ahorrar algo de espacio en disco y simplemente ejecutarlos sólo cuando los necesites. Esto también significa que tus variables globales estarán menos contaminadas.</p><h3 id="ejecuta-c-digo-directamente-desde-github">Ejecuta código directamente desde GitHub</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/01/execute-gist-scripts-with-npx.jpg" class="kg-image" alt="execute-gist-script-with-npx" width="600" height="400" loading="lazy"></figure><p>Este es bastante radical.</p><p>Puedes usar npx para ejecutar cualquier gist y repositorio de GitHub. Centrémonos en ejecutar un gist de GitHub porque es más fácil crear uno.</p><p>El script más básico consiste en el archivo principal de JS y un <code>package.json</code>. Después de configurar los archivos, todo lo que tienes que hacer es ejecutar el npx con el enlace a ese gist como se muestra en la imagen de arriba.</p><p><a href="https://gist.github.com/Tynael/0861d31ea17796c9a5b4a0162eb3c1e8">Aquí</a> puedes encontrar el código que usé para este ejemplo.</p><p><strong>Asegúrate de leer atentamente cualquier script antes de ejecutarlo para evitar problemas serios que pueden ocurrir debido a código malicioso.</strong></p><h3 id="prueba-diferentes-versiones-de-los-paquetes">Prueba diferentes versiones de los paquetes</h3><p>npx hace que sea extremadamente fácil probar diferentes versiones de un paquete o módulo de Node.js. Para probar esta impresionante característica, vamos a instalar localmente el paquete <code>create-react-app</code> y probar una próxima versión.</p><p>Esto enlistará algunas etiquetas dist cerca del final de la salida. Las etiquetas dist proporcionan alias para los números de versión, lo que hace que sea mucho más fácil de escribir.</p><pre><code class="language-bash">$ npm v create-react-app</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/01/create-react-app-dist-tags.jpg" class="kg-image" alt="create-react-app-dist-tags" width="600" height="400" loading="lazy"></figure><p>Usemos npx para probar la etiqueta dist <code>next</code> de <code>create-react-app</code> que creará la aplicación dentro de un directorio sandbox.</p><pre><code class="language-bash">$ npx create-react-app@next sandbox</code></pre><p>npx instalará temporalmente la siguiente versión de <code>create-react-app</code>, y luego se ejecutará para andamiar la aplicación e instalar sus dependencias.</p><p>Una vez instalada, podemos navegar a la aplicación de esta manera:</p><pre><code class="language-bash">$ cd sandbox</code></pre><p>y luego empezar con este comando:</p><pre><code class="language-bash">$ npm start</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/01/create-react-app-npx-next-version.jpg" class="kg-image" alt="create-react-app-npx-next-version" width="600" height="400" loading="lazy"></figure><p>Se abrirá automáticamente la aplicación de React en una ventana de tu navegador predeterminado. ¡Ahora tenemos una aplicación que funciona en la próxima version del paquete <code>create-react-app</code>!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/01/react-app.jpg" class="kg-image" alt="index-page-react-app" width="600" height="400" loading="lazy"><figcaption>Así es como debería ser la página de índica de tu aplicación de React</figcaption></figure><h2 id="conclusi-n">Conclusión</h2><p>npx nos ayuda a evitar el versionado, los problemas de dependencia y la instalación de paquetes innecesarios que sólo queremos probar.</p><p>También proporciona una forma clara y fácil de ejecutar paquetes, comandos, módulos e incluso listas y repositorio de GitHub.</p><p>Si no has usado npx antes, ¡ahora es un buen momento para empezar!</p><p>Esto fue originalmente publicado en <a href="https://neutrondev.com/npm-vs-npx-whats-the-difference/">mi blog</a>.<br>Puedes contactarme y preguntarme cualquier cosa en <a href="https://twitter.com/pelu_carol">Twitter</a> y <a href="https://www.facebook.com/neutrondevcom">Facebook</a>.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/carol-theodor-pelu/"><strong>Carol-Theodor Pelu</strong></a> - <a href="https://www.freecodecamp.org/news/npm-vs-npx-whats-the-difference/"><strong>npm vs npx — What’s the Difference?</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
