La guía definitiva para Git Merge y Git Rebase

Bienvenido a nuestra guía definitiva de los comandos git mergey git rebase. Este tutorial le enseñará todo lo que necesita saber sobre la combinación de múltiples ramas con Git.

Git Merge

El git mergecomando fusionará cualquier cambio que se haya realizado en la base del código en una rama separada de su rama actual como una nueva confirmación.

La sintaxis del comando es la siguiente:

git merge BRANCH-NAME

Por ejemplo, si actualmente está trabajando en una rama con nombre devy le gustaría fusionar cualquier cambio nuevo que se realizó en una rama con nombre new-features, debería emitir el siguiente comando:

git merge new-features

Nota: Si hay cambios no confirmados en su rama actual, Git no le permitirá fusionarse hasta que se hayan confirmado todos los cambios en su rama actual. Para manejar esos cambios, puede:

Crea una nueva rama y confirma los cambios

git checkout -b new-branch-name git add . git commit -m ""

Esconderlos

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Abandona todos los cambios

git reset --hard # removes all pending changes

Git Rebase

Rebasar una rama en Git es una forma de 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 divergió de la rama maestra en el punto A:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Cuando rebase, puede moverlo así:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

Para rebase, asegúrese de tener todas las confirmaciones que desee en la rebase en su rama principal. Echa un vistazo a la rama que quieres rebasar y escribe git rebase master(donde master es la rama en la que quieres rebasar).

También es posible rebasar en una rama diferente, de modo que, por ejemplo, una rama que se basó en otra rama (llamémosla característica) se rebase en la maestra:

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

Después git rebase master brancho git rebase mastercuando haya verificado la sucursal, obtendrá:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git rebase interactivo en la consola

Para usar git rebaseen la consola con una lista de confirmaciones, puede elegir, editar o soltar la rebase:

  • Ingrese git rebase -i HEAD~5y el último número es cualquier número de confirmaciones de las más recientes hacia atrás que desea revisar.
  • En vim, presione esc, luego ipara comenzar a editar la prueba.
  • En el lado izquierdo, puede sobrescribir pickcon uno de los siguientes comandos. Si desea aplastar una confirmación en una anterior y descartar el mensaje de confirmación, ingrese fen el lugar pickde la confirmación.
  • Guarde y salga de su editor de texto.
  • Cuando se detenga el rebase, haga los ajustes necesarios y luego git rebase --continueúselo hasta que el rebase sea exitoso.
  • Si se reorganiza correctamente, debe forzar la inserción de sus cambios git push -fpara agregar la versión reorganizada a su repositorio remoto.
  • Si hay un conflicto de fusión, hay varias formas de solucionarlo, incluido el seguimiento de las sugerencias de esta guía. Una forma es abrir los archivos en un editor de texto y eliminar las partes del código que no desea. Luego use git add seguido de git rebase --continue. Puede omitir la confirmación en conflicto ingresando git rebase --skip, detener la rebase ejecutando git rebase --aborten su consola.
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # 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

Fusionar conflictos

Un conflicto de fusión es cuando realiza confirmaciones en ramas separadas que alteran la misma línea de formas conflictivas. Si esto sucede, Git no sabrá qué versión del archivo mantener en un mensaje de error similar al siguiente:

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Si observa el resumé.txtarchivo en su editor de código, puede ver dónde tuvo lugar el conflicto:

<<<<<<>>>>>> updated_address

Git agregó algunas líneas adicionales al archivo:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Piense en   =======como la línea divisoria del conflicto. Todo entre <<<<<<< HEADy =======es el contenido de la rama actual a la que apunta la referencia HEAD. Por otra parte, todo lo que entre   =======y >>>>>>> updated_addresses el contenido en la rama que se pueden fusionar, updated_address.

Git Merge vs Git Rebase

Ambos git mergey git rebaseson comandos muy útiles, y uno no es mejor que el otro. Sin embargo, existen algunas diferencias muy importantes entre los dos comandos que usted y su equipo deben tener en cuenta.

Siempre que git mergese ejecuta, se crea una confirmación de fusión adicional. Siempre que esté trabajando en su repositorio local, tener demasiadas confirmaciones de fusión puede hacer que el historial de confirmaciones parezca confuso. Una forma de evitar el compromiso de fusión es usar git rebaseen su lugar.

git rebase is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase in a local repository.

That's all you need to know to merge and rebase with the best of 'em.