Actualizar ramas de Git desde master


Soy nuevo en Git, y ahora estoy en esta situación:

  • Tengo cuatro ramas (master, b1, b2, y b3).
  • Después de trabajar en b1-b3, me di cuenta de que tengo algo que cambiar en branch master que debería estar en todas las demás ramas.
  • Cambié lo que necesitaba en master y... aquí está mi problema:

¿Cómo actualizo todas las demás ramas con el código de rama master?

Author: Peter Mortensen, 2010-10-07

7 answers

Tienes dos opciones:

El primero es una fusión, pero esto crea una confirmación adicional para la fusión.

Checkout cada rama:

git checkout b1

Luego fusionar:

git merge origin/master

Luego presione:

git push origin b1

Alternativamente, puedes hacer un rebase:

git fetch
git rebase origin/master
 425
Author: Chris Kooken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 16:13:16

Básicamente tienes dos opciones:

  1. Se fusionan. Eso es en realidad bastante simple, y una operación perfectamente local:

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    Esto deja la historia exactamente como sucedió: Te bifurcaste de master, hiciste cambios en todas las ramas, y finalmente incorporaste los cambios de master en las tres ramas.

    git puede manejar esta situación muy bien, está diseñado para fusiona sucediendo en todas las direcciones, al mismo tiempo. Puedes confiar en que sea capaz de juntar todos los hilos correctamente. Simplemente no le importa si branch b1 fusiona master, o master fusiona b1, la confirmación de fusión se ve igual a git. La única diferencia es, qué rama termina apuntando a esta confirmación de fusión.

  2. Usted rebase. Las personas con un SVN, o fondo similar encuentran esto más intuitivo. Los comandos son analógicos al caso merge:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    A la gente le gusta este enfoque porque conserva una historia lineal en todas las ramas. Sin embargo, esta historia lineal es una mentira, y usted debe ser consciente de que lo es. Considere este gráfico de confirmación:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    La fusión resulta en el verdadero historial:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    La rebase, sin embargo, le da esta historia:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    El punto es, que las confirmaciones E', F', y G' nunca existieron verdaderamente, y probablemente nunca han sido probados. Ni siquiera pueden compilar. En realidad, es bastante fácil crear confirmaciones sin sentido a través de un rebase, especialmente cuando los cambios en master son importante para el desarrollo en b1.

    La consecuencia de esto puede ser, que no se puede distinguir cuál de los tres commits E, F, y G realmente introdujo una regresión, disminuyendo el valor de git bisect.

    No estoy diciendo que no debas usar git rebase. Tiene sus usos. Pero cada vez que lo use, debe ser consciente del hecho de que está mintiendo sobre la historia. Y al menos deberías compilar y probar las nuevas confirmaciones.

 381
Author: cmaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-13 17:44:08

git rebase master es la forma correcta de hacer esto. La fusión significaría que se crearía un commit para la fusión, mientras que el rebasing no.

 225
Author: Michael J. Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-19 16:49:29

Si ha estado trabajando en una rama de forma intermitente, o ha ocurrido mucho en otras ramas mientras ha estado trabajando en algo, es mejor cambiar la base de su rama a master. Esto mantiene la historia ordenada y hace que las cosas sean mucho más fáciles de seguir.

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

Notas:

  • No rebases ramas en las que hayas colaborado con otros.
  • Usted debe rebase en la rama a la que se fusionará que no siempre puede ser maestro.

Hay un capítulo sobre cambio de base en http://git-scm.com/book/ch3-6.html , y un montón de otros recursos por ahí en la web.

 43
Author: Simon Bingham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-23 18:04:49

@cmaster hizo la respuesta mejor elaborada. En resumen:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

No debe reescribir el historial de la rama en lugar de mantenerlos en estado real para futuras referencias. Mientras se fusiona con master, crea un commit extra, pero eso es barato. Las confirmaciones no cuestan.

 11
Author: bluemoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 04:13:04

Puedes fusionar, o puedes aplicar confirmaciones individuales a través de ramas usando git cherry-pick.

 8
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 21:27:18

Para actualizar otras ramas como (copia de seguridad) con su copia de rama maestra. Puede seguir cualquier camino (rebase o merge)...

  1. Hacer rebase (no habrá ningún commit extra hecho a la rama de backup).
  2. Merge branches (habrá un commit adicional automáticamente a la rama de respaldo).

    Nota: Rebase no es más que establecer una nueva base (una nueva copia)

git checkout backup
git merge master
git push

(Repetir para otras ramas si alguna como backup2 y etc..,)

git checkout backup
git rebase master
git push

(Repetir para otras ramas si las hay como backup2 & etc..,)

 5
Author: Sundar Gsv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 13:54:56