{"id":881,"date":"2019-07-23T11:20:56","date_gmt":"2019-07-23T17:20:56","guid":{"rendered":"https:\/\/ugit.siua.ac.cr\/?p=881"},"modified":"2019-09-25T14:26:22","modified_gmt":"2019-09-25T20:26:22","slug":"git-ramificaciones","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=881","title":{"rendered":"GIT: Ramificaciones"},"content":{"rendered":"\n<ul class=\"wp-block-list\"><li>Cualquier sistema de control de versiones moderno tiene alg\u00fan mecanismo para soportar el uso de ramas. Cuando hablamos de ramificaciones, significa que t\u00fa has tomado la rama principal de desarrollo (master) y a partir de ah\u00ed has continuado trabajando sin seguir la rama principal de desarrollo<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es una rama?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Para\n entender que es una rama rama, debemos entender como git almacena sus \ndatos. Git almacena los datos como instant\u00e1neas (copias puntuales de los\n archivos completos)<\/li><li>Para ilustrar esto si tenemos un proyecto que cuenta con 3 archivos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git add README test.rb LICENSE\n$ git commit -m 'initial commit of my project'<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>al hacer el commit el repositorio de GIT contendr\u00e1 5 objetos:<br><ul><li>Un blob con el contenido de cada archivo, es decir 3 blob&#8217;s<\/li><li>Un \u00e1rbol con la lista de contenidos del directorio y su relaci\u00f3n a los blob&#8217;s de cada uno<\/li><li>Y un commit apuntando a la ra\u00edz de ese \u00e1rbol que contiene los metadatos (autor, mensaje,etc)<\/li><\/ul><\/li><li>De forma ilustrada<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"443\" src=\"\/wp-content\/uploads\/2019\/07\/1.jpg\" alt=\"\" class=\"wp-image-882\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/1.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/1-300x166.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/1-768x425.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora si creas otro commit dentro de este se almacena una referencia a su padre , de forma:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"800\" height=\"265\" src=\"\/wp-content\/uploads\/2019\/07\/2.jpg\" alt=\"\" class=\"wp-image-883\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/2.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/2-300x99.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/2-768x254.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Entonces: \u00bfque es una rama git? es un apuntador a un commit. Por lo que la rama defecto es \u00abmaster\u00bb y es el primer commit del proyecto, el cual va ir avanzando seg\u00fan los commit&#8217;s. Algo as\u00ed:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"800\" height=\"430\" src=\"\/wp-content\/uploads\/2019\/07\/3.jpg\" alt=\"\" class=\"wp-image-884\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/3.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/3-300x161.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/3-768x413.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Crear una Rama Nueva<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u00bfQu\u00e9 sucede cuando creamos una nuevas rama? simplemente creamos un nuevo apuntador que se puede mover libremente<\/li><li>Vamos a ingresar en nuestro proyecto \u00abprimer_proyecto_git\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/var\/www\/html\/primer_proyecto_git\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora para crear una nueva rama vamos hacer<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch testing<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Esto crear\u00e1 un nuevo apuntador apuntando a la misma confirmaci\u00f3n donde est\u00e9s actualmente.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"430\" src=\"\/wp-content\/uploads\/2019\/07\/4.jpg\" alt=\"\" class=\"wp-image-885\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/4.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/4-300x161.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/4-768x413.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Si ahora contamos con 2 ramas como sabe git en cual rama estamos pues con un apuntador especial llamado \u00abHEAD\u00bb que es un simple apuntador a la rama local y \u00bfen qu\u00e9 rama estamos? en la rama master ya que \u00abgit branch\u00bb solamente crea la rama no salta a ella.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"467\" src=\"\/wp-content\/uploads\/2019\/07\/5.jpg\" alt=\"\" class=\"wp-image-886\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/5.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/5-300x175.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/5-768x448.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>\u00bfComo podemos saber donde estamos? con \u00abgit log\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline --decorate<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>23a8cce (HEAD -> master, tag: v1.2-lw, tag: v1.2, tag: v1.1, origin\/master, testing) Primera versi\u00f3n del poryecto a ser subido a GIT\n1c2c2e3 Modificado el estilo\n7b8f18e se recupero archivo README\n94e7ed3 creacion 2 de tmp\n70f7a90 eliminado fisico de archivo tmp\nafbe8a5 Creaci\u00f3n de archivo tmp.html\n94bce8d Creaci\u00f3n de archivo .gitignore\n17b842c (tag: v1.0) Incio del proyecto: V1.001 \/ estructura inicial<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>O simplemente con<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git log<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>commit 23a8cce276dc3765cb5f79e782353068c94821b0 (HEAD -> master, tag: v1.2-lw, tag: v1.2, tag: v1.1, origin\/master, testing)\nAuthor: abelhongo1983 &lt;gustavo.matamoros.gonzalez@una.ac.cr>\nDate: Fri Mar 9 09:07:15 2018 -0600\n\n Primera versi\u00f3n del poryecto a ser subido a GIT<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Aqu\u00ed puedes ver que \u00abHEAD\u00bb, apunta a \u00abmaster\u00bb y que de este commit salen las 2 ramas \u00abmaster\u00bb y \u00abtesting\u00bb<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cambiar de Rama<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Para pasar de una rama a otra se usa el comando \u00abgit checkout\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout testing<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>tavo@SER-DESARROLLO1:\/var\/www\/html\/primer_proyecto_git$ git checkout testing\nSwitched to branch 'testing'<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Es lo que hace es mover el apuntador \u00abHEAD\u00bb a \u00abtesting\u00bb<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"460\" src=\"\/wp-content\/uploads\/2019\/07\/6.jpg\" alt=\"\" class=\"wp-image-887\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/6.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/6-300x173.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/6-768x442.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>\u00bfQu\u00e9 significa esto? bueno vamos a crear un nuevo archivo y vamos a confirmar los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>touch login.html\ngit commit -m \"creaci\u00f3n archivo login.html\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Esto crea un nuevo commit el cual solo se aplica sobre la rama \u00abtesting\u00bb, es decir \u00abmaster\u00bb se mantiene y \u00abtesting\u00bb avanza<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"334\" src=\"\/wp-content\/uploads\/2019\/07\/7.jpg\" alt=\"\" class=\"wp-image-888\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/7.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/7-300x125.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/7-768x321.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora regresamos a \u00abmaster\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Interpretado:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"334\" src=\"\/wp-content\/uploads\/2019\/07\/8.jpg\" alt=\"\" class=\"wp-image-889\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/8.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/8-300x125.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/8-768x321.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Esta acci\u00f3n va a realizar 2 acciones:\n<ul><li>Va mover el apuntador \u00abHEAD\u00bb al master<\/li><li>Y va a remplazar todos los archivos del proyecto a esta instant\u00e1nea.\n Por loq ue si hacemos el comando \u00abls\u00bb para listar los archivos podemos \nver que el archivo \u00ablogin.html\u00bb no existe<\/li><\/ul><\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tavo@SER-DESARROLLO1:\/var\/www\/html\/primer_proyecto_git$ ls\ncss index.html index.php js README<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora creamos otro archivo en la rama \u00abmaster\u00bb y confirmamos los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>touch inscripcion.html\ngit add .\ngit commit -m \"creaci\u00f3n de archivo inscripci\u00f3n.html\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Lo que sucede es:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"512\" src=\"\/wp-content\/uploads\/2019\/07\/9.jpg\" alt=\"\" class=\"wp-image-890\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/9.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/9-300x192.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/9-768x492.jpg 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/9-360x230.jpg 360w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora podemos ver es con el comando:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline --decorate --graph --all<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>* eaddb8b (HEAD -> master) creaci\u00f3n de archivo inscripci\u00f3n.html\n| * dffb3be (testing) creaci\u00f3n archivo login.html\n|\/ \n* 23a8cce (tag: v1.2-lw, tag: v1.2, tag: v1.1, origin\/master) Primera versi\u00f3n del poryecto a ser subido a GIT\n* 1c2c2e3 Modificado el estilo\n* 7b8f18e se recupero archivo README\n* 94e7ed3 creacion 2 de tmp\n* 70f7a90 eliminado fisico de archivo tmp\n* afbe8a5 Creaci\u00f3n de archivo tmp.html\n* 94bce8d Creaci\u00f3n de archivo .gitignore\n* 17b842c (tag: v1.0) Incio del proyecto: V1.001 \/ estructura inicial<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Aqu\u00ed podemos ver la bifurcaci\u00f3n del proyecto<\/li><li>Si deseamos crear una nueva rama y ingresar a ella directamente podemos usar el par\u00e1metro \u00ab-b\u00bb con \u00abcheckout\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b hotfix<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Procedimientos B\u00e1sicos para Ramificar y Fusionar<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Cuando terminamos los cambios por ejemplo en la rama \u00abtesting\u00bb y deseamos unirla con la \u00abmaster\u00bb debemos usar el comando \u00abmerge\u00bb, para esto vamos a ingresar a la rama \u00abmaster\u00bb y luego las fusionamos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout master\ngit merge testing -m \"fusion testing =>master\" <\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Con esto si hacemos el comando \u00abls\u00bb para listar los archivos podemos ver que ya contamos con los archivos \u00ablogin y inscripci\u00f3n\u00bb en la rama \u00abmaster\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>tavo@SER-DESARROLLO1:\/var\/www\/html\/primer_proyecto_git$ ls\ncss index.html index.php inscripcion.html js login.html README<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora como ya hemos terminado de utilizar la rama \u00abtesting\u00bb ya podemos eliminarla para esto<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -d testing\nEliminada la rama testing (era dffb3be)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Principales Conflictos que Pueden Surgir en las Fusiones<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>En\n el ejemplo anterior no hubo problemas de fusi\u00f3n ya que todos eran \narchivos nuevos, pero que pasar\u00eda si creamos una nueva rama \u00aberror53\u00bb y \ningresamos a ella.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b error53<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Luego modificamos el archivo \u00abindex.html\u00bb, por ejemplo modificando el t\u00edtulo<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;title>Primer Proyecto GIT&lt;\/title>\nX\n&lt;title>Primer Proyecto GIT cambio de error53&lt;\/title><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Confirmamos los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git status\ngit add .\ngit commit -m \"cambio titulo error 53\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora ingresamos a la rama \u00abmaster\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y modificamos el t\u00edtulo:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;title>Primer Proyecto GIT&lt;\/title>\nX\n&lt;title>Primer Proyecto GIT titulo de master&lt;\/title><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Confirmamos los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git status\ngit add .\ngit commit -m \"Cambio titulo de master\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora como queremos fusionar la rama \u00abmaster\u00bb con \u00aberror53\u00bb y ya estamos en \u00abmaster\u00bb no es necesario pasarnos de rama y podemos hacer la fusi\u00f3n:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git merge error53<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Solo que ahora nos va a mostrar un error:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Automezclado index.html\nCONFLICTO(contenido): conflicto de fusi\u00f3n en index.html\nAutomatic merge failed; fix conflicts and then commit the result.<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Donde nos indica que no se puedo fusionar el archivo \u00abindex.html\u00bb y si vemos el c\u00f3digo veremos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"es\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\n    &lt;title>Primer Proyecto GIT titulo de master&lt;\/title>\n=======\n    &lt;title>Primer Proyecto GIT cambio de error53&lt;\/title>\n>>>>>>> error53\n&lt;\/head>\n&lt;body><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Donde\n nos indica \u00ab&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\u00bb esto es el c\u00f3digo que \nesta en la rama \u00abHEAD\u00bb, es la rama actual donde queremos fusionar en \nnuestro caso \u00abmaster\u00bb el fin del c\u00f3digo de esta rama se representa con \n\u00ab=======\u00bb as\u00ed como tambi\u00e9n representa el inicio del c\u00f3digo de \u00aberror53\u00bb \nel cual termina en \u00ab&gt;&gt;&gt;&gt;&gt;&gt;&gt; error53\u00bb.<\/li><li>As\u00ed que aqu\u00ed nosotros debemos tomar la decisi\u00f3n de que queremos \nhacer, para nuestro ejemplo, vamos a cambiar el titulo completamente, \npero podr\u00edamos dejar el del \u00abHEAD\u00bb o \u00aberror53\u00bb, seg\u00fan sea el caso.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;title>T\u00edtulo de uni\u00f3n&lt;\/title><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Guardamos los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git status\ngit add .\ngit commit -m \"Fusi\u00f3n erro53=>master\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y ya que corregimos el \u00aberror53\u00bb podemos eliminar la rama<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -d error53<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Si quieres ver los conflictos con una herramienta de visualizaci\u00f3n puede usar \u00abgit mergetool\u00bb que lanzar\u00e1 la herramienta respectiva<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git mergetool<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Gesti\u00f3n de Ramas<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Listar ramas:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch\n* master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Note que el asterisco (*) indica en cual rama se encuentra<\/li><li>Para listar los \u00faltimos comit&#8217;s de cada rama:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -v<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>* master 6659a48 Fusi\u00f3n erro53=>master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ver la ramas que han sido fusionadas con la actual:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch --merged<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>iss53\n* master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Cualquier rama que aparezca aqu\u00ed que no lleve (*) puede ser eliminada con tranquilad<\/li><li>Para ver las ramas que no han sido fusionadas<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch --no-merged<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>testing<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Si la intentamos eliminar git nos dar\u00e1 un error, donde si deseamos eliminarla debemos hacer: \u00abgit branch -D testing\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git branch -d testing\nerror: The branch 'testing' is not fully merged.\nIf you are sure you want to delete it, run 'git branch -D testing'.<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ramas Remotas<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Hasta este momento hemos hablado de las ramas de forma local \u00bfPero que pasa cuando trabajamos con servidores remotos?<\/li><li>Recordemos que \u00abmaster\u00bb y \u00aborigin\u00bb no tienen ning\u00fan significado \nespecial para GIT, solo que cuando ejecutar git init le da el nombre a \nla rama \u00abmaster\u00bb y cuando clonas un proyecto git le da el nombre de \n\u00aborigin\u00bb a menos que los cambies con \u00abgit clone -o nuevo_nombre\u00bb.<\/li><li>Entonces si clonamos un proyecto en este punto el apuntador de rama \n\u00abmaster\u00bb tanto en el repositorio local como el remoto est\u00e1n apuntando al\n mismo commit<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"577\" src=\"\/wp-content\/uploads\/2019\/07\/10.jpg\" alt=\"\" class=\"wp-image-891\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/10.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/10-300x216.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/10-768x554.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Si  haces alg\u00fan trabajo en tu rama master local, y al mismo tiempo, alguien  m\u00e1s lleva (push) su trabajo al servidor git.ourcompany.com,  actualizando la rama master de all\u00ed, te encontrar\u00e1s con que ambos  registros avanzan de forma diferente. Adem\u00e1s, mientras no tengas  contacto con el servidor, tu apuntador a tu rama origin\/master no se  mover\u00e1.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"492\" src=\"\/wp-content\/uploads\/2019\/07\/11.jpg\" alt=\"\" class=\"wp-image-892\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/11.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/11-300x185.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/11-768x472.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Para sincronizarte, puedes utilizar el comando git fetch origin. Este comando localiza en qu\u00e9 servidor est\u00e1 el origen (en este caso git.ourcompany.com), recupera cualquier dato presente all\u00ed que t\u00fa no tengas, y actualiza tu base de datos local, moviendo tu rama origin\/master para que apunte a la posici\u00f3n m\u00e1s reciente.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"588\" src=\"\/wp-content\/uploads\/2019\/07\/12.jpg\" alt=\"\" class=\"wp-image-893\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/12.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/12-300x221.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/12-768x564.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Para\n sincronizarte, puedes utilizar el comando git fetch origin. Este \ncomando localiza en qu\u00e9 servidor est\u00e1 el origen (en este caso \ngit.ourcompany.com), recupera cualquier dato presente all\u00ed que t\u00fa no \ntengas, y actualiza tu base de datos local, moviendo tu rama \norigin\/master para que apunte a la posici\u00f3n m\u00e1s reciente.<\/li><li>Para ilustrar mejor el caso de tener m\u00faltiples servidores y c\u00f3mo van\n las ramas remotas para esos proyectos remotos, supongamos que tienes \notro servidor Git; utilizado por uno de tus equipos sprint, solamente \npara desarrollo. Este servidor se encuentra en git.team1.ourcompany.com.\n Puedes incluirlo como una nueva referencia remota a tu proyecto actual,\n mediante el comando git remote add, tal y como vimos en Fundamentos de \nGit. Puedes denominar teamone a este remoto al asignarle este nombre a \nla URL.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"577\" src=\"\/wp-content\/uploads\/2019\/07\/13.jpg\" alt=\"\" class=\"wp-image-894\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/13.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/13-300x216.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/13-768x554.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora, puedes usar el comando git fetch teamone para recuperar todo el contenido del remoto teamone que t\u00fa no tenias. Debido a que dicho servidor es un subconjunto de los datos del servidor origin que tienes actualmente, Git no recupera (fetch) ning\u00fan dato; simplemente prepara una rama remota llamada teamone\/master para apuntar a la confirmaci\u00f3n (commit) que teamone tiene en su rama master<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"577\" src=\"\/wp-content\/uploads\/2019\/07\/14.jpg\" alt=\"\" class=\"wp-image-895\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/14.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/14-300x216.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/14-768x554.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Publicar<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Cuando\n desea compartir una rama con el resto del mundo, debes subirla (push) a\n un servidor remoto donde tengas permiso de escritura, ya que no se \nsincronizan de forma autom\u00e1tica, esto para que puedas usas ramas \nprivadas y solo subir las que deseas.<\/li><li>Entonces para subir nuestro a github trabajo hacemos<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>tavo@SER-DESARROLLO1:\/var\/www\/html\/primer_proyecto_git$ git remote \norigin<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Aqu\u00ed podemos ver que tenemos un servidor remoto asociado<\/li><li>Entonces<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin master<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Username for 'https:\/\/github.com': abelhongo1983\nPassword for 'https:\/\/abelhongo1983@github.com': \nCounting objects: 15, done.\nDelta compression using up to 8 threads.\nCompressing objects: 100% (15\/15), done.\nWriting objects: 100% (15\/15), 1.50 KiB | 1.50 MiB\/s, done.\nTotal 15 (delta 10), reused 0 (delta 0)\nremote: Resolving deltas: 100% (10\/10), completed with 2 local objects.\nTo https:\/\/github.com\/abelhongo1983\/git_trabajar_remotos.git\n 23a8cce..6659a48 master -> master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Con esto ya hemos subido los archivos a github<\/li><li>Ahora vamos a crear una nueva rama local \u00aberror54\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos hacer un cambio en el archivo login agreg\u00e1ndole:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n&lt;head>\n    &lt;meta charset=\"UTF-8\">\n    &lt;title>Document&lt;\/title>\n&lt;\/head>\n&lt;body>\n\n&lt;\/body><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Guardamos los cambios<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git status\ngit add .\ngit commit -m \"Se agrego codigo a login.html\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora si consultamos las ramas:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>* erro54\n master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora podemos subir la rama al servidor remoto:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin erro54<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Username for 'https:\/\/github.com': abelhongo1983\nPassword for 'https:\/\/abelhongo1983@github.com': \nCounting objects: 3, done.\nDelta compression using up to 8 threads.\nCompressing objects: 100% (3\/3), done.\nWriting objects: 100% (3\/3), 377 bytes | 377.00 KiB\/s, done.\nTotal 3 (delta 1), reused 0 (delta 0)\nremote: Resolving deltas: 100% (1\/1), completed with 1 local object.\nTo https:\/\/github.com\/abelhongo1983\/git_trabajar_remotos.git\n * [new branch] erro54 -> erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y si lo vemos en github podemos ver que ya contamos con esa nueva rama<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"515\" height=\"587\" src=\"\/wp-content\/uploads\/2019\/07\/20-4.png\" alt=\"\" class=\"wp-image-896\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/20-4.png 515w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/20-4-263x300.png 263w\" sizes=\"(max-width: 515px) 100vw, 515px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Tambi\u00e9n se pod\u00eda hacer:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin erro54:erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Que significa:&nbsp;<strong>coge mi erro54 y hazlo el erro54 remoto<\/strong>&nbsp;esto permite crear una rama remota con un nombre distinto<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">NOTA:<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Cada\n vez que hemos subido el servidor remoto nos pregunta el usuario y \ncontrase\u00f1a de github si no quieres estar haciendo esto puedes establecer\n un \u201ccache de credenciales\u201d. La manera m\u00e1s sencilla de hacerlo es \nestableciendo en memoria por unos minutos, lo que puedes lograr \nf\u00e1cilmente al ejecutar git config &#8211;global credential.helper cache<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Continuando..<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>En este momento si alg\u00fan compa\u00f1ero del equipo hace un fetch para obtener cambios desde el servidor<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch origin<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Va indicarte que existe una nueva rama y donde esta guardada<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>De https:\/\/github.com\/abelhongo1983\/git_trabajar_remotos\n * [rama nueva] erro54 -> origin\/erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Pero NO obtienes una copia editable de la misma, es decir no tienes una nueva rama \u00aberro54\u00bb, de hecho si hacemos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Vemos que solo tenemos la master<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>* master<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Esto es porque solo tenemos un puntero no editable a \u00aborigin\/erro55\u00bb<\/li><li>Aqu\u00ed hora tenemos 2 opci\u00f3n deseamos integrar (merge) nuestro \nrepositorio local con esta rama para poderla trabajar entonces har\u00edamos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git merge origin\/erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>O s\u00ed deseamos tener la rama de forma local para poderla trabajar podemos crear la rama local bas\u00e1ndonos en la remota<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b erro54 origin\/erro54<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Branch erro55 set up to track remote branch erro55 from origin.\nSe ha cambiado a una rama nueva, \u00aberro55\u00bb<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora si el compa\u00f1ero hace un \u00abgit branch\u00bb puede ver que tiene las dos ramas de forma local<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>* erro54\n master<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Hacer Seguimiento a las Ramas<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Al\n hacer lo anterior \u00abcrear una rama local a partir de una remota\u00bb, se \ncrea autom\u00e1ticamente una \u00abrama de seguimiento\u00bb (traking branch) que es \nuna rama local que tiene relaci\u00f3n con una rama remota y si tecleas el \ncomando git pull, Git sabe de cu\u00e1l servidor recuperar (fetch) y fusionar\n (merge) datos.<\/li><li>En el ejemplo anterior cuando hicimos:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout -b erro54 origin\/erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>creamos una rama de seguimiento a \u00aborigin\/erro54\u00bb y esto es tan com\u00fan que git ofrece el comando<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout --track origin\/erro54<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Si ya tienes una rama local y quieres asignarla a una rama remota que acabas de traerte, o quieres cambiar la rama a la que le haces seguimiento, puedes usar en cualquier momento las opciones -u o &#8211;set-upstream-to del comando git branch<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -u origin\/serverfix<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">NOTA:<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Atajo al upstream<br>Cuando\n tienes asignada una rama de seguimiento, puedes hacer referencia a ella\n mediante @{upstream} o mediante el atajo @{u}. De esta manera, si est\u00e1s\n en la rama master y esta sigue a la rama origin\/master, puedes hacer \nalgo como git merge @{u} en vez de git merge origin\/master.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Continuando<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Si quieres ver las ramas de seguimiento puede usar el comando:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -vv<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>* erro55 3bdeca3 [origin\/erro55] Se agrego codigo a login.html\n master 6659a48 [origin\/master] Fusi\u00f3n erro53=>master<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Traer y Fusionar<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Cuando\n ejecutamos \u00abgit fetch\u00bb git trae todos los cambios del servidor que no \ntienes, pero no modifica tu directorio de trabajo es decir no los \nfusiona.<\/li><li>Si desea traer los cambios y fusionarlos se usa el comando:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git pull &lt;remote> &lt;branch><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>esto har\u00eda una \u00abgit fetch\u00bb seguido de un \u00abgit merge\u00bb<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Eliminar Ramas Remotas<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Para eliminar una rama remota:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin --delete erro54<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Username for 'https:\/\/github.com': abelhongo1983\nPassword for 'https:\/\/abelhongo1983@github.com': \nTo https:\/\/github.com\/abelhongo1983\/git_trabajar_remotos.git\n - [deleted] erro54<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Reorganizar el Trabajo Realizado<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>En Git tenemos dos formas de integrar cambios de una rama en otra: la fusi\u00f3n (merge) y la reorganizaci\u00f3n (rebase). En esta secci\u00f3n vas a aprender en qu\u00e9 consiste la reorganizaci\u00f3n, c\u00f3mo utilizarla, por qu\u00e9 es una herramienta sorprendente y en qu\u00e9 casos no es conveniente utilizarla.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reorganizaci\u00f3n B\u00e1sica<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Imaginemos que hemos creado dos ramas \u00abexperiment\u00bb y \u00abmaster\u00bb.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"383\" src=\"\/wp-content\/uploads\/2019\/07\/15.jpg\" alt=\"\" class=\"wp-image-897\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/15.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/15-300x144.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/15-768x368.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>La manera m\u00e1s sencilla es \u00abgit merge\u00bb que realiza una fusi\u00f3n a tres bandas entre las dos \u00faltimas instant\u00e1neas de cada rama (C3 y C4) y el ancestro com\u00fan a ambas (C2); creando una nueva instant\u00e1nea (snapshot) y la correspondiente confirmaci\u00f3n (commit).<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2019\/07\/16.jpg\" alt=\"\" class=\"wp-image-898\" width=\"791\" height=\"301\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16-300x114.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16-768x292.jpg 768w\" sizes=\"(max-width: 791px) 100vw, 791px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Sin embargo, tambi\u00e9n hay otra forma de hacerlo: puedes coger los cambios introducidos en C3 y reaplicarlos encima de C4. Esto es lo que en Git llamamos reorganizar (rebasing, en ingl\u00e9s). Con el comando git rebase, puedes coger todos los cambios confirmados en una rama, y reaplicarlos sobre otra.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout experiment\ngit rebase master<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>First, rewinding head to replay your work on top of it...\nApplying: added staged command<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Haciendo que Git vaya al ancestro com\u00fan de ambas ramas (donde est\u00e1s actualmente y de donde quieres reorganizar), saque las diferencias introducidas por cada confirmaci\u00f3n en la rama donde est\u00e1s, guarde esas diferencias en archivos temporales, reinicie (reset) la rama actual hasta llevarla a la misma confirmaci\u00f3n en la rama de donde quieres reorganizar, y, finalmente, vuelva a aplicar ordenadamente los cambios.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"304\" src=\"\/wp-content\/uploads\/2019\/07\/16-1.jpg\" alt=\"\" class=\"wp-image-899\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16-1.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16-1-300x114.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/16-1-768x292.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>En este momento, puedes volver a la rama master y hacer una fusi\u00f3n con avance r\u00e1pido (fast-forward merge).<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout master\ngit merge experiment<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>\nAs\u00ed, la instant\u00e1nea apuntada por C4&#8242; es exactamente la misma apuntada\n por C5 en el ejemplo de la fusi\u00f3n. No hay ninguna diferencia en el \nresultado final de la integraci\u00f3n, pero el haberla hecho reorganizando \nnos deja un historial m\u00e1s claro. Si examinas el historial de una rama \nreorganizada, este aparece siempre como un historial lineal: como si \ntodo el trabajo se hubiera realizado en series, aunque realmente se haya\n hecho en paralelo.\n&nbsp;\n<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Algunas Reorganizaciones Interesantes<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Tambi\u00e9n puedes aplicar una reorganizaci\u00f3n (rebase) sobre otra cosa adem\u00e1s de sobre la rama de reorganizaci\u00f3n. Por ejemplo, considera un historial como el de Un historial con una rama puntual sobre otra rama puntual. Has ramificado a una rama puntual (server) para a\u00f1adir algunas funcionalidades al proyecto, y luego has confirmado los cambios. Despu\u00e9s, vuelves a la rama original para hacer algunos cambios en la parte cliente (rama client), y confirmas tambi\u00e9n esos cambios. Por \u00faltimo, vuelves sobre la rama server y haces algunos cambios m\u00e1s.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"466\" src=\"\/wp-content\/uploads\/2019\/07\/18.jpg\" alt=\"\" class=\"wp-image-900\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/18.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/18-300x175.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/18-768x447.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Imagina que decides incorporar tus cambios del lado cliente sobre el proyecto principal para hacer un lanzamiento de versi\u00f3n; pero no quieres lanzar a\u00fan los cambios del lado servidor porque no est\u00e1n a\u00fan suficientemente probados. Puedes coger los cambios del cliente que no est\u00e1n en server (C8 y C9) y reaplicarlos sobre tu rama principal usando la opci\u00f3n &#8211;onto del comando git rebase:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase --onto master server client<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Esto viene a decir: \u201cActiva la rama client, averigua los cambios desde el ancestro com\u00fan entre las ramas client y server, y aplicalos en la rama master\u201d<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"319\" src=\"\/wp-content\/uploads\/2019\/07\/19.jpg\" alt=\"\" class=\"wp-image-901\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/19.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/19-300x120.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/19-768x306.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Y, tras esto, ya puedes avanzar la rama principal<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout master\ngit merge client<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"257\" src=\"\/wp-content\/uploads\/2019\/07\/21.jpg\" alt=\"\" class=\"wp-image-902\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/21.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/21-300x96.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/21-768x247.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora supongamos que decides traerlos (pull) tambi\u00e9n sobre tu rama server. Puedes reorganizar (rebase) la rama server sobre la rama master sin necesidad siquiera de comprobarlo previamente, usando el comando git rebase [rama-base] [rama-puntual], el cual activa la rama puntual (server en este caso) y la aplica sobre la rama base (master en este caso):<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git rebase master server<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Esto vuelca el trabajo de server sobre el de master, tal y como se muestra en Reorganizando la rama server sobre la rama master.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"131\" src=\"\/wp-content\/uploads\/2019\/07\/22.jpg\" alt=\"\" class=\"wp-image-903\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/22.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/22-300x49.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/22-768x126.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Despu\u00e9s, puedes avanzar r\u00e1pidamente la rama base (master):<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git checkout master\ngit merge server<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y por \u00faltimo puedes eliminar las ramas client y server porque ya todo su contenido ha sido integrado y no las vas a necesitar m\u00e1s<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -d client\ngit branch -d server<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"83\" src=\"\/wp-content\/uploads\/2019\/07\/23.jpg\" alt=\"\" class=\"wp-image-904\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/23.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/23-300x31.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/23-768x80.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Los Peligros de Reorganizar<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Nunca reorganices confirmaciones de cambio (commits) que hayas enviado (push) a un repositorio p\u00fablico.<\/strong> <\/li><li>Cuando reorganizas algo, est\u00e1s abandonando las confirmaciones de  cambio ya creadas y est\u00e1s creando unas nuevas; que son similares, pero  diferentes. Si envias (push) confirmaciones (commits) a alguna parte, y  otros las recogen (pull) de all\u00ed; y despu\u00e9s vas t\u00fa y las reescribes con  git rebase y las vuelves a enviar (push); tus colaboradores tendr\u00e1n que  refusionar (re-merge) su trabajo y todo se volver\u00e1 tremendamente  complicado cuando intentes recoger (pull) su trabajo de vuelta sobre el  tuyo.<\/li><li>Veamos con un ejemplo como reorganizar trabajo que has hecho p\u00fablico  puede causar problemas. Imag\u00ednate que haces un clon desde un servidor  central, y luego trabajas sobre \u00e9l.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"473\" src=\"\/wp-content\/uploads\/2019\/07\/24.jpg\" alt=\"\" class=\"wp-image-905\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/24.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/24-300x177.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/24-768x454.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora, otra persona trabaja tambi\u00e9n sobre ello, realiza una fusi\u00f3n (merge) y lleva (push) su trabajo al servidor central. T\u00fa te traes (fetch) sus trabajos y los fusionas (merge) sobre una nueva rama en tu trabajo, con lo que tu historial quedar\u00eda parecido a esto:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"507\" src=\"\/wp-content\/uploads\/2019\/07\/25.jpg\" alt=\"\" class=\"wp-image-906\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/25.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/25-300x190.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/25-768x487.jpg 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/25-600x380.jpg 600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>A continuaci\u00f3n, la persona que hab\u00eda llevado cambios al servidor central decide retroceder y reorganizar su trabajo; haciendo un git push &#8211;force para sobrescribir el registro en el servidor. Tu te traes (fetch) esos nuevos cambios desde el servidor.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"507\" src=\"\/wp-content\/uploads\/2019\/07\/26.jpg\" alt=\"\" class=\"wp-image-907\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/26.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/26-300x190.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/26-768x487.jpg 768w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/26-600x380.jpg 600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora los dos est\u00e1n en un aprieto. Si haces git pull crear\u00e1s una fusi\u00f3n confirmada, la cual incluir\u00e1 ambas l\u00edneas del historial, y tu repositorio lucir\u00e1 as\u00ed:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"421\" src=\"\/wp-content\/uploads\/2019\/07\/27.jpg\" alt=\"\" class=\"wp-image-908\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/27.jpg 800w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/27-300x158.jpg 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/27-768x404.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>Si ejecutas git log sobre un historial as\u00ed, ver\u00e1s dos confirmaciones hechas por el mismo autor y con la misma fecha y mensaje, lo cual ser\u00e1 confuso. Es m\u00e1s, si luego tu env\u00edas (push) ese registro de vuelta al servidor, vas a introducir todas esas confirmaciones reorganizadas en el servidor central. Lo que puede confundir a\u00fan m\u00e1s a la gente. Era m\u00e1s seguro asumir que el otro desarrollador no quer\u00eda que C4 y C6 estuviesen en el historial; por ello hab\u00eda reorganizado su trabajo de esa manera.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda GIT:<br \/>\nRamas<br \/>\nRamificar<br \/>\nFusionar<br \/>\nRamas remotas<br \/>\nPublicar<br \/>\nRebase<\/p>\n","protected":false},"author":2,"featured_media":2085,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[51],"tags":[52],"class_list":["post-881","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-git","tag-git"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=881"}],"version-history":[{"count":3,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/881\/revisions"}],"predecessor-version":[{"id":2086,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/881\/revisions\/2086"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/media\/2085"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}