CINXE.COM
Git - ¿Qué es una rama?
<!DOCTYPE html> <html lang="es"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - ¿Qué es una rama?</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Branching-Branches-in-a-Nutshell">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99d%c9%99-Branch-Nutshell%e2%80%99d%c9%99-Branch%e2%80%99lar">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9a%d0%bb%d0%be%d0%bd%d0%be%d0%b2%d0%b5-%d0%b2-Git-%d0%9d%d0%b0%d0%ba%d1%80%d0%b0%d1%82%d0%ba%d0%be-%d0%b7%d0%b0-%d1%80%d0%b0%d0%b7%d0%ba%d0%bb%d0%be%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f%d1%82%d0%b0">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Branching-Branches-auf-einen-Blick">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Ramificaciones-en-Git-%c2%bfQu%c3%a9-es-una-rama?">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-branches-avec-Git-Les-branches-en-bref">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git-%e3%81%ae%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e6%a9%9f%e8%83%bd-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e3%81%a8%e3%81%af">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git-%eb%b8%8c%eb%9e%9c%ec%b9%98-%eb%b8%8c%eb%9e%9c%ec%b9%98%eb%9e%80-%eb%ac%b4%ec%97%87%ec%9d%b8%ea%b0%80">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Branchen-in-Git-Branches-in-vogelvlucht">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%92%d0%b5%d1%82%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b2-Git-%d0%9e-%d0%b2%d0%b5%d1%82%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b8-%d0%b2-%d0%b4%d0%b2%d1%83%d1%85-%d1%81%d0%bb%d0%be%d0%b2%d0%b0%d1%85">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Veje-Git-Veje-na-kratko">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-branch-ng-Git-Mga-Branch-sa-Maikling-Salita">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%93%d0%b0%d0%bb%d1%83%d0%b6%d0%b5%d0%bd%d0%bd%d1%8f-%d0%b2-git-%d0%93%d1%96%d0%bb%d0%ba%d0%b8-%d1%83-%d0%ba%d1%96%d0%bb%d1%8c%d0%ba%d0%be%d1%85-%d1%81%d0%bb%d0%be%d0%b2%d0%b0%d1%85">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%80%e4%bb%8b">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/V%c4%9btve-v-syst%c3%a9mu-Git-V%c4%9btve-v-kostce">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b5%d1%9a%d0%b5-%d0%b2%d0%be-Git-%d0%93%d1%80%d0%b0%d0%bd%d0%b5%d1%9a%d0%b5-%d0%be%d0%b1%d1%98%d0%b0%d1%81%d0%bd%d0%b5%d1%82%d0%be">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Ga%c5%82%c4%99zie-Gita-Czym-jest-ga%c5%82%c4%85%c5%ba">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d1%80%d0%b0%d0%bd%d0%b0%d1%9a%d0%b5-%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d1%83-%d0%93%d0%b8%d1%82-%d0%a3%d0%ba%d1%80%d0%b0%d1%82%d0%ba%d0%be-%d0%be-%d0%b3%d1%80%d0%b0%d0%bd%d0%b0%d1%9a%d1%83">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-%d0%b4%d0%b0-%d1%82%d0%b0%d1%80%d0%bc%d0%be%d2%9b%d0%bb%d0%b0%d0%bd%d0%b8%d1%88-%d0%a2%d0%b0%d1%80%d0%bc%d0%be%d2%9b%d0%bb%d0%b0%d0%bd%d0%b8%d1%88-%d2%b3%d0%b0%d2%9b%d0%b8%d0%b4%d0%b0-%d0%b8%d0%ba%d0%ba%d0%b8-%d0%be%d2%93%d0%b8%d0%b7-%d1%81%d1%9e%d0%b7">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/%e4%bd%bf%e7%94%a8-Git-%e5%88%86%e6%94%af-%e7%b0%a1%e8%bf%b0%e5%88%86%e6%94%af">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Branching-Branches-in-a-Nutshell">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/%d8%b4%d8%a7%d8%ae%d9%87%e2%80%8c%d8%b3%d8%a7%d8%b2%db%8c-%d8%af%d8%b1-%da%af%db%8c%d8%aa-%d8%b4%d8%a7%d8%ae%d9%87%e2%80%8c%d9%87%d8%a7-%d8%af%d8%b1-%db%8c%da%a9-%da%a9%d9%84%d9%85%d9%87" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Branching-Branches-in-a-Nutshell">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Branching-Branches-in-a-Nutshell">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Branching-Branches-in-a-Nutshell">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Branches-no-Git-Branches-em-poucas-palavras">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Ramifica%c3%a7%c3%a3o-do-Git-Branches-in-a-Nutshell">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-f%c3%b6rgreningar-Grenar-i-ett-n%c3%b6tskal">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git-Dallar%c4%b1-Dallar">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-es">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones">Inicio - Sobre el Control de Versiones</a></h2> <ol> <li> 1.1 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones">Acerca del Control de Versiones</a> </li> <li> 1.2 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Una-breve-historia-de-Git">Una breve historia de Git</a> </li> <li> 1.3 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Fundamentos-de-Git">Fundamentos de Git</a> </li> <li> 1.4 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-La-L%c3%adnea-de-Comandos">La Línea de Comandos</a> </li> <li> 1.5 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%c3%b3n-de-Git">Instalación de Git</a> </li> <li> 1.6 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Configurando-Git-por-primera-vez">Configurando Git por primera vez</a> </li> <li> 1.7 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-%c2%bfC%c3%b3mo-obtener-ayuda%3F">¿Cómo obtener ayuda?</a> </li> <li> 1.8 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git">Fundamentos de Git</a></h2> <ol> <li> 2.1 <a href="/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git">Obteniendo un repositorio Git</a> </li> <li> 2.2 <a href="/book/es/v2/Fundamentos-de-Git-Guardando-cambios-en-el-Repositorio">Guardando cambios en el Repositorio</a> </li> <li> 2.3 <a href="/book/es/v2/Fundamentos-de-Git-Ver-el-Historial-de-Confirmaciones">Ver el Historial de Confirmaciones</a> </li> <li> 2.4 <a href="/book/es/v2/Fundamentos-de-Git-Deshacer-Cosas">Deshacer Cosas</a> </li> <li> 2.5 <a href="/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos">Trabajar con Remotos</a> </li> <li> 2.6 <a href="/book/es/v2/Fundamentos-de-Git-Etiquetado">Etiquetado</a> </li> <li> 2.7 <a href="/book/es/v2/Fundamentos-de-Git-Alias-de-Git">Alias de Git</a> </li> <li> 2.8 <a href="/book/es/v2/Fundamentos-de-Git-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/es/v2/Ramificaciones-en-Git-%c2%bfQu%c3%a9-es-una-rama%3F">Ramificaciones en Git</a></h2> <ol> <li> 3.1 <a href="/book/es/v2/Ramificaciones-en-Git-%c2%bfQu%c3%a9-es-una-rama%3F" class="active">¿Qué es una rama?</a> </li> <li> 3.2 <a href="/book/es/v2/Ramificaciones-en-Git-Procedimientos-B%c3%a1sicos-para-Ramificar-y-Fusionar">Procedimientos Básicos para Ramificar y Fusionar</a> </li> <li> 3.3 <a href="/book/es/v2/Ramificaciones-en-Git-Gesti%c3%b3n-de-Ramas">Gestión de Ramas</a> </li> <li> 3.4 <a href="/book/es/v2/Ramificaciones-en-Git-Flujos-de-Trabajo-Ramificados">Flujos de Trabajo Ramificados</a> </li> <li> 3.5 <a href="/book/es/v2/Ramificaciones-en-Git-Ramas-Remotas">Ramas Remotas</a> </li> <li> 3.6 <a href="/book/es/v2/Ramificaciones-en-Git-Reorganizar-el-Trabajo-Realizado">Reorganizar el Trabajo Realizado</a> </li> <li> 3.7 <a href="/book/es/v2/Ramificaciones-en-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/es/v2/Git-en-el-Servidor-Los-Protocolos">Git en el Servidor</a></h2> <ol> <li> 4.1 <a href="/book/es/v2/Git-en-el-Servidor-Los-Protocolos">Los Protocolos</a> </li> <li> 4.2 <a href="/book/es/v2/Git-en-el-Servidor-Configurando-Git-en-un-servidor">Configurando Git en un servidor</a> </li> <li> 4.3 <a href="/book/es/v2/Git-en-el-Servidor-Generando-tu-clave-p%c3%bablica-SSH">Generando tu clave pública SSH</a> </li> <li> 4.4 <a href="/book/es/v2/Git-en-el-Servidor-Configurando-el-servidor">Configurando el servidor</a> </li> <li> 4.5 <a href="/book/es/v2/Git-en-el-Servidor-El-demonio-Git">El demonio Git</a> </li> <li> 4.6 <a href="/book/es/v2/Git-en-el-Servidor-HTTP-Inteligente">HTTP Inteligente</a> </li> <li> 4.7 <a href="/book/es/v2/Git-en-el-Servidor-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/es/v2/Git-en-el-Servidor-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/es/v2/Git-en-el-Servidor-Git-en-un-alojamiento-externo">Git en un alojamiento externo</a> </li> <li> 4.10 <a href="/book/es/v2/Git-en-el-Servidor-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos">Git en entornos distribuidos</a></h2> <ol> <li> 5.1 <a href="/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos">Flujos de trabajo distribuidos</a> </li> <li> 5.2 <a href="/book/es/v2/Git-en-entornos-distribuidos-Contribuyendo-a-un-Proyecto">Contribuyendo a un Proyecto</a> </li> <li> 5.3 <a href="/book/es/v2/Git-en-entornos-distribuidos-Manteniendo-un-proyecto">Manteniendo un proyecto</a> </li> <li> 5.4 <a href="/book/es/v2/Git-en-entornos-distribuidos-Resumen">Resumen</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/es/v2/GitHub-Creaci%c3%b3n-y-configuraci%c3%b3n-de-la-cuenta">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/es/v2/GitHub-Creaci%c3%b3n-y-configuraci%c3%b3n-de-la-cuenta">Creación y configuración de la cuenta</a> </li> <li> 6.2 <a href="/book/es/v2/GitHub-Participando-en-Proyectos">Participando en Proyectos</a> </li> <li> 6.3 <a href="/book/es/v2/GitHub-Mantenimiento-de-un-proyecto">Mantenimiento de un proyecto</a> </li> <li> 6.4 <a href="/book/es/v2/GitHub-Gesti%c3%b3n-de-una-organizaci%c3%b3n">Gestión de una organización</a> </li> <li> 6.5 <a href="/book/es/v2/GitHub-Scripting-en-GitHub">Scripting en GitHub</a> </li> <li> 6.6 <a href="/book/es/v2/GitHub-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/es/v2/Herramientas-de-Git-Revisi%c3%b3n-por-selecci%c3%b3n">Herramientas de Git</a></h2> <ol> <li> 7.1 <a href="/book/es/v2/Herramientas-de-Git-Revisi%c3%b3n-por-selecci%c3%b3n">Revisión por selección</a> </li> <li> 7.2 <a href="/book/es/v2/Herramientas-de-Git-Organizaci%c3%b3n-interactiva">Organización interactiva</a> </li> <li> 7.3 <a href="/book/es/v2/Herramientas-de-Git-Guardado-r%c3%a1pido-y-Limpieza">Guardado rápido y Limpieza</a> </li> <li> 7.4 <a href="/book/es/v2/Herramientas-de-Git-Firmando-tu-trabajo">Firmando tu trabajo</a> </li> <li> 7.5 <a href="/book/es/v2/Herramientas-de-Git-Buscando">Buscando</a> </li> <li> 7.6 <a href="/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia">Reescribiendo la Historia</a> </li> <li> 7.7 <a href="/book/es/v2/Herramientas-de-Git-Reiniciar-Desmitificado">Reiniciar Desmitificado</a> </li> <li> 7.8 <a href="/book/es/v2/Herramientas-de-Git-Fusi%c3%b3n-Avanzada">Fusión Avanzada</a> </li> <li> 7.9 <a href="/book/es/v2/Herramientas-de-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/es/v2/Herramientas-de-Git-Haciendo-debug-con-Git">Haciendo debug con Git</a> </li> <li> 7.11 <a href="/book/es/v2/Herramientas-de-Git-Subm%c3%b3dulos">Submódulos</a> </li> <li> 7.12 <a href="/book/es/v2/Herramientas-de-Git-Agrupaciones">Agrupaciones</a> </li> <li> 7.13 <a href="/book/es/v2/Herramientas-de-Git-Replace">Replace</a> </li> <li> 7.14 <a href="/book/es/v2/Herramientas-de-Git-Almacenamiento-de-credenciales">Almacenamiento de credenciales</a> </li> <li> 7.15 <a href="/book/es/v2/Herramientas-de-Git-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Configuraci%c3%b3n-de-Git">Personalización de Git</a></h2> <ol> <li> 8.1 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Configuraci%c3%b3n-de-Git">Configuración de Git</a> </li> <li> 8.2 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Git-Attributes">Git Attributes</a> </li> <li> 8.3 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Puntos-de-enganche-en-Git">Puntos de enganche en Git</a> </li> <li> 8.4 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Un-ejemplo-de-implantaci%c3%b3n-de-una-determinada-pol%c3%adtica-en-Git">Un ejemplo de implantación de una determinada política en Git</a> </li> <li> 8.5 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente">Git y Otros Sistemas</a></h2> <ol> <li> 9.1 <a href="/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente">Git como Cliente</a> </li> <li> 9.2 <a href="/book/es/v2/Git-y-Otros-Sistemas-Migraci%c3%b3n-a-Git">Migración a Git</a> </li> <li> 9.3 <a href="/book/es/v2/Git-y-Otros-Sistemas-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%c3%ada-y-porcelana">Los entresijos internos de Git</a></h2> <ol> <li> 10.1 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%c3%ada-y-porcelana">Fontanería y porcelana</a> </li> <li> 10.2 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Los-objetos-Git">Los objetos Git</a> </li> <li> 10.3 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Referencias-Git">Referencias Git</a> </li> <li> 10.4 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Archivos-empaquetadores">Archivos empaquetadores</a> </li> <li> 10.5 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Las-especificaciones-para-hacer-referencia-a%e2%80%a6%e2%80%8b-refspec">Las especificaciones para hacer referencia a… (refspec)</a> </li> <li> 10.6 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Protocolos-de-transferencia">Protocolos de transferencia</a> </li> <li> 10.7 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Mantenimiento-y-recuperaci%c3%b3n-de-datos">Mantenimiento y recuperación de datos</a> </li> <li> 10.8 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Variables-de-entorno">Variables de entorno</a> </li> <li> 10.9 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Interfaces-gr%c3%a1ficas">Apéndice A: Git en otros entornos</a></h2> <ol> <li> A1.1 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Interfaces-gr%c3%a1ficas">Interfaces gráficas</a> </li> <li> A1.2 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Visual-Studio">Git en Visual Studio</a> </li> <li> A1.3 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Eclipse">Git en Eclipse</a> </li> <li> A1.4 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-con-Bash">Git con Bash</a> </li> <li> A1.5 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Zsh">Git en Zsh</a> </li> <li> A1.6 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Powershell">Git en Powershell</a> </li> <li> A1.7 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%c3%adnea-de-Comandos">Apéndice B: Integrando Git en tus Aplicaciones</a></h2> <ol> <li> A2.1 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%c3%adnea-de-Comandos">Git mediante Línea de Comandos</a> </li> <li> A2.2 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-JGit">JGit</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Configuraci%c3%b3n">Apéndice C: Comandos de Git</a></h2> <ol> <li> A3.1 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Configuraci%c3%b3n">Configuración</a> </li> <li> A3.2 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Obtener-y-Crear-Proyectos">Obtener y Crear Proyectos</a> </li> <li> A3.3 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Seguimiento-B%c3%a1sico">Seguimiento Básico</a> </li> <li> A3.4 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Ramificar-y-Fusionar">Ramificar y Fusionar</a> </li> <li> A3.5 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Compartir-y-Actualizar-Proyectos">Compartir y Actualizar Proyectos</a> </li> <li> A3.6 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Inspecci%c3%b3n-y-Comparaci%c3%b3n">Inspección y Comparación</a> </li> <li> A3.7 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Depuraci%c3%b3n">Depuración</a> </li> <li> A3.8 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Parcheo">Parcheo</a> </li> <li> A3.9 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Correo-Electr%c3%b3nico">Correo Electrónico</a> </li> <li> A3.10 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Sistemas-Externos">Sistemas Externos</a> </li> <li> A3.11 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Administraci%c3%b3n">Administración</a> </li> <li> A3.12 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Comandos-de-Fontaner%c3%ada">Comandos de Fontanería</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>3.1 Ramificaciones en Git - ¿Qué es una rama?</h1> <div> <p> Cualquier sistema de control de versiones moderno tiene algún mecanismo para soportar el uso de ramas. Cuando hablamos de ramificaciones, significa que tú has tomado la rama principal de desarrollo (master) y a partir de ahí has continuado trabajando sin seguir la rama principal de desarrollo. En muchos sistemas de control de versiones este proceso es costoso, pues a menudo requiere crear una nueva copia del código, lo cual puede tomar mucho tiempo cuando se trata de proyectos grandes.</p><p>Algunas personas resaltan que uno de los puntos más fuertes de Git es su sistema de ramificaciones y lo cierto es que esto le hace resaltar sobre los otros sistemas de control de versiones. ¿Por qué esto es tan importante? La forma en la que Git maneja las ramificaciones es increíblemente rápida, haciendo así de las operaciones de ramificación algo casi instantáneo, al igual que el avance o el retroceso entre distintas ramas, lo cual también es tremendamente rápido. A diferencia de otros sistemas de control de versiones, Git promueve un ciclo de desarrollo donde las ramas se crean y se unen ramas entre sí, incluso varias veces en el mismo día. Entender y manejar esta opción te proporciona una poderosa y exclusiva herramienta que puede, literalmente, cambiar la forma en la que desarrollas.</p> <h2 id="r_git_branches_overview">¿Qué es una rama?</h2> <div class="paragraph"> <p>Para entender realmente cómo ramifica Git, previamente hemos de examinar la forma en que almacena sus datos.</p> </div> <div class="paragraph"> <p>Recordando lo citado en <a href="/book/es/v2/ch00/ch01-introduction">[ch01-introduction]</a>, Git no los almacena de forma incremental (guardando solo diferencias), sino que los almacena como una serie de instantáneas (copias puntuales de los archivos completos, tal y como se encuentran en ese momento).</p> </div> <div class="paragraph"> <p>En cada confirmación de cambios (commit), Git almacena una instantánea de tu trabajo preparado. Dicha instantánea contiene además unos metadatos con el autor y el mensaje explicativo, y uno o varios apuntadores a las confirmaciones (commit) que sean padres directos de esta (un padre en los casos de confirmación normal, y múltiples padres en los casos de estar confirmando una fusión (merge) de dos o más ramas).</p> </div> <div class="paragraph"> <p>Para ilustrar esto, vamos a suponer, por ejemplo, que tienes una carpeta con tres archivos, que preparas (stage) todos ellos y los confirmas (commit). Al preparar los archivos, Git realiza una suma de control de cada uno de ellos (un resumen SHA-1, tal y como se mencionaba en <a href="/book/es/v2/ch00/ch01-introduction">[ch01-introduction]</a>), almacena una copia de cada uno en el repositorio (estas copias se denominan "blobs"), y guarda cada suma de control en el área de preparación (staging area):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git add README test.rb LICENSE $ git commit -m 'initial commit of my project'</code></pre> </div> </div> <div class="paragraph"> <p>Cuando creas una confirmación con el comando <code>git commit</code>, Git realiza sumas de control de cada subdirectorio (en el ejemplo, solamente tenemos el directorio principal del proyecto), y las guarda como objetos árbol en el repositorio Git. Después, Git crea un objeto de confirmación con los metadatos pertinentes y un apuntador al objeto árbol raíz del proyecto.</p> </div> <div class="paragraph"> <p>En este momento, el repositorio de Git contendrá cinco objetos: un "blob" para cada uno de los tres archivos, un árbol con la lista de contenidos del directorio (más sus respectivas relaciones con los "blobs"), y una confirmación de cambios (commit) apuntando a la raíz de ese árbol y conteniendo el resto de metadatos pertinentes.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/commit-and-tree.png" alt="Una confirmación y sus árboles."> </div> <div class="title">Figura 9. Una confirmación y sus árboles</div> </div> <div class="paragraph"> <p>Si haces más cambios y vuelves a confirmar, la siguiente confirmación guardará un apuntador a su confirmación precedente.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/commits-and-parents.png" alt="Confirmaciones y sus predecesoras."> </div> <div class="title">Figura 10. Confirmaciones y sus predecesoras</div> </div> <div class="paragraph"> <p>Una rama Git es simplemente un apuntador móvil apuntando a una de esas confirmaciones. La rama por defecto de Git es la rama <code>master</code>. Con la primera confirmación de cambios que realicemos, se creará esta rama principal <code>master</code> apuntando a dicha confirmación. En cada confirmación de cambios que realicemos, la rama irá avanzando automáticamente.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Nota</div> </td> <td class="content"> <div class="paragraph"> <p>La rama “master” en Git, no es una rama especial. Es como cualquier otra rama. La única razón por la cual aparece en casi todos los repositorios es porque es la que crea por defecto el comando <code>git init</code> y la gente no se molesta en cambiarle el nombre.</p> </div> </td> </tr> </table> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/branch-and-history.png" alt="Una rama y su historial de confirmaciones."> </div> <div class="title">Figura 11. Una rama y su historial de confirmaciones</div> </div> <div class="sect3"> <h3 id="r_create_new_branch">Crear una Rama Nueva</h3> <div class="paragraph"> <p> ¿Qué sucede cuando creas una nueva rama? Bueno…, simplemente se crea un nuevo apuntador para que lo puedas mover libremente. Por ejemplo, supongamos que quieres crear una rama nueva denominada "testing". Para ello, usarás el comando <code>git branch</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git branch testing</code></pre> </div> </div> <div class="paragraph"> <p>Esto creará un nuevo apuntador apuntando a la misma confirmación donde estés actualmente.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/two-branches.png" alt="Dos ramas apuntando al mismo grupo de confirmaciones."> </div> <div class="title">Figura 12. Dos ramas apuntando al mismo grupo de confirmaciones</div> </div> <div class="paragraph"> <p>Y, ¿cómo sabe Git en qué rama estás en este momento? Pues…, mediante un apuntador especial denominado HEAD. Aunque es preciso comentar que este HEAD es totalmente distinto al concepto de HEAD en otros sistemas de control de cambios como Subversion o CVS. En Git, es simplemente el apuntador a la rama local en la que tú estés en ese momento, en este caso la rama <code>master</code>; pues el comando <code>git branch</code> solamente crea una nueva rama, pero no salta a dicha rama.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/head-to-master.png" alt="Apuntador HEAD a la rama donde estás actualmente."> </div> <div class="title">Figura 13. Apuntador HEAD a la rama donde estás actualmente</div> </div> <div class="paragraph"> <p>Esto puedes verlo fácilmente al ejecutar el comando <code>git log</code> para que te muestre a dónde apunta cada rama. Esta opción se llama <code>--decorate</code>.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline --decorate f30ab (HEAD, master, testing) add feature #32 - ability to add new 34ac2 fixed bug #1328 - stack overflow under certain conditions 98ca9 initial commit of my project</code></pre> </div> </div> <div class="paragraph"> <p>Puedes ver que las ramas “master” y “testing” están junto a la confirmación <code>f30ab</code>.</p> </div> </div> <div class="sect3"> <h3 id="r_switching_branches">Cambiar de Rama</h3> <div class="paragraph"> <p> Para saltar de una rama a otra, tienes que utilizar el comando <code>git checkout</code>. Hagamos una prueba, saltando a la rama <code>testing</code> recién creada:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout testing</code></pre> </div> </div> <div class="paragraph"> <p>Esto mueve el apuntador HEAD a la rama <code>testing</code>.</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/head-to-testing.png" alt="El apuntador HEAD apunta a la rama actual."> </div> <div class="title">Figura 14. El apuntador HEAD apunta a la rama actual</div> </div> <div class="paragraph"> <p>¿Cuál es el significado de todo esto? Bueno…, lo veremos tras realizar otra confirmación de cambios:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ vim test.rb $ git commit -a -m 'made a change'</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/advance-testing.png" alt="La rama apuntada por HEAD avanza con cada confirmación de cambios."> </div> <div class="title">Figura 15. La rama apuntada por HEAD avanza con cada confirmación de cambios</div> </div> <div class="paragraph"> <p>Observamos algo interesante: la rama <code>testing</code> avanza, mientras que la rama <code>master</code> permanece en la confirmación donde estaba cuando lanzaste el comando <code>git checkout</code> para saltar. Volvamos ahora a la rama <code>master</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git checkout master</code></pre> </div> </div> <div class="imageblock"> <div class="content"> <img src="/book/es/v2/images/checkout-master.png" alt="HEAD apunta a otra rama cuando hacemos un salto."> </div> <div class="title">Figura 16. HEAD apunta a otra rama cuando hacemos un salto</div> </div> <div class="paragraph"> <p>Este comando realiza dos acciones: Mueve el apuntador HEAD de nuevo a la rama <code>master</code>, y revierte los archivos de tu directorio de trabajo; dejándolos tal y como estaban en la última instantánea confirmada en dicha rama <code>master</code>. Esto supone que los cambios que hagas desde este momento en adelante, divergirán de la antigua versión del proyecto. Básicamente, lo que se está haciendo es rebobinar el trabajo que habías hecho temporalmente en la rama <code>testing</code>; de tal forma que puedas avanzar en otra dirección diferente.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Nota</div> </td> <td class="content"> <div class="title">Saltar entre ramas cambia archivos en tu directorio de trabajo</div> <div class="paragraph"> <p>Es importante destacar que cuando saltas a una rama en Git, los archivos de tu directorio de trabajo cambian. Si saltas a una rama antigua, tu directorio de trabajo retrocederá para verse como lo hacía la última vez que confirmaste un cambio en dicha rama. Si Git no puede hacer el cambio limpiamente, no te dejará saltar.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p>Haz algunos cambios más y confírmalos:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ vim test.rb $ git commit -a -m 'made other changes'</code></pre> </div> </div> <div class="paragraph"> <p>Ahora el historial de tu proyecto diverge (ver <a href="/book/es/v2/ch00/rdivergent_history">Los registros de las ramas divergen</a>). Has creado una rama y saltado a ella, has trabajado sobre ella; has vuelto a la rama original, y has trabajado también sobre ella. Los cambios realizados en ambas sesiones de trabajo están aislados en ramas independientes: puedes saltar libremente de una a otra según estimes oportuno. Y todo ello simplemente con tres comandos: <code>git branch</code>, <code>git checkout</code> y <code>git commit</code>.</p> </div> <div id="rdivergent_history" class="imageblock"> <div class="content"> <img src="/book/es/v2/images/advance-master.png" alt="Los registros de las ramas divergen."> </div> <div class="title">Figura 17. Los registros de las ramas divergen</div> </div> <div class="paragraph"> <p>También puedes ver esto fácilmente utilizando el comando <code>git log</code>. Si ejecutas <code>git log --oneline --decorate --graph --all</code> te mostrará el historial de tus confirmaciones, indicando dónde están los apuntadores de tus ramas y como ha divergido tu historial.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --oneline --decorate --graph --all * c2b9e (HEAD, master) made other changes | * 87ab2 (testing) made a change |/ * f30ab add feature #32 - ability to add new formats to the * 34ac2 fixed bug #1328 - stack overflow under certain conditions * 98ca9 initial commit of my project</code></pre> </div> </div> <div class="paragraph"> <p>Debido a que una rama Git es realmente un simple archivo que contiene los 40 caracteres de una suma de control SHA-1, (representando la confirmación de cambios a la que apunta), no cuesta nada el crear y destruir ramas en Git. Crear una nueva rama es tan rápido y simple como escribir 41 bytes en un archivo, (40 caracteres y un retorno de carro).</p> </div> <div class="paragraph"> <p>Esto contrasta fuertemente con los métodos de ramificación usados por otros sistemas de control de versiones, en los que crear una rama nueva supone el copiar todos los archivos del proyecto a un directorio adicional nuevo. Esto puede llevar segundos o incluso minutos, dependiendo del tamaño del proyecto; mientras que en Git el proceso es siempre instantáneo. Y además, debido a que se almacenan también los nodos padre para cada confirmación, el encontrar las bases adecuadas para realizar una fusión entre ramas es un proceso automático y generalmente sencillo de realizar. Animando así a los desarrolladores a utilizar ramificaciones frecuentemente.</p> </div> <div class="paragraph"> <p>Vamos a ver el por qué merece la pena hacerlo así.</p> </div> </div> <div id="nav"><a href="/book/es/v2/Fundamentos-de-Git-Resumen">prev</a> | <a href="/book/es/v2/Ramificaciones-en-Git-Procedimientos-Básicos-para-Ramificar-y-Fusionar">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>