Bienvenido a nuestra guía definitiva de los comandos git merge
y 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 merge
comando 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 dev
y 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 branch
o git rebase master
cuando 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 rebase
en la consola con una lista de confirmaciones, puede elegir, editar o soltar la rebase:
- Ingrese
git rebase -i HEAD~5
y 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
, luegoi
para comenzar a editar la prueba. - En el lado izquierdo, puede sobrescribir
pick
con uno de los siguientes comandos. Si desea aplastar una confirmación en una anterior y descartar el mensaje de confirmación, ingresef
en el lugarpick
de 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 -f
para 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 degit rebase --continue
. Puede omitir la confirmación en conflicto ingresandogit rebase --skip
, detener la rebase ejecutandogit rebase --abort
en 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é.txt
archivo 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 <<<<<<< HEAD
y =======
es el contenido de la rama actual a la que apunta la referencia HEAD. Por otra parte, todo lo que entre =======
y >>>>>>> updated_address
es el contenido en la rama que se pueden fusionar, updated_address
.
Git Merge vs Git Rebase
Ambos git merge
y git rebase
son 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 merge
se 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 rebase
en 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.