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 tenía algo que cambiar en la rama maestra que debería estar en todas las demás ramas.
- Cambié lo que necesitaba
master
y ... aquí está mi problema:
¿Cómo actualizo todas las demás sucursales con master
código de sucursal?
git
git-branch
Ionuț Staicu
fuente
fuente
Respuestas:
Tienes dos opciones:
El primero es una fusión, pero esto crea una confirmación adicional para la fusión.
Verifique cada sucursal:
Luego fusionar:
Luego presione:
Alternativamente, puedes hacer un rebase:
fuente
got push origin master
... no tiene sentido? No estás cambiando la rama maestra. Creo que es un error con 119 votos a favor: /git rebase master
es la respuesta correctaBásicamente tienes dos opciones:
Te unes. Eso es realmente bastante simple y una operación perfectamente local:
Esto deja la historia exactamente como sucedió: 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 realmente bien, está diseñado para fusiones que ocurren en todas las direcciones, al mismo tiempo Puede confiar en que podrá juntar todos los hilos correctamente. Simplemente no le importa si lab1
fusión de ramasmaster
o lasmaster
fusionesb1
, la confirmación de fusión se ve igual que git. La única diferencia es, qué rama termina apuntando a esta confirmación de fusión.Usted rebase. Las personas con un SVN o un fondo similar encuentran esto más intuitivo. Los comandos son análogos al caso de fusión:
A la gente le gusta este enfoque porque conserva un historial lineal en todas las ramas. Sin embargo, esta historia lineal es una mentira, y debe saber que lo es. Considere este gráfico de compromiso:
La fusión da como resultado la verdadera historia:
El rebase, sin embargo, te da esta historia:
El punto es que los commits
E'
,F'
yG'
nunca existieron realmente, y probablemente nunca hayan sido probados. Puede que ni siquiera compilen. En realidad, es bastante fácil crear confirmaciones sin sentido a través de un rebase, especialmente cuando los cambiosmaster
son importantes para el desarrollob1
.La consecuencia de esto puede ser, que no se puede distinguir cuál de las tres confirmaciones
E
,F
yG
en realidad introdujo una regresión, disminuyendo el valor degit bisect
.No estoy diciendo que no debas usar
git rebase
. Tiene sus usos. Pero siempre que lo use, debe ser consciente del hecho de que está mintiendo sobre la historia. Y al menos deberías compilar probar los nuevos commits.fuente
git checkout <source branch>
git pull
. Luego continuando con lo anterior:git checkout b1
...git merge
ygit rebase
. No hay forma de evitarlos.git rebase
tiene la ventaja de permitirle ocultar varias etapas de rebase (es decir, rebase la misma rama en varias confirmaciones diferentes en secuencia para reducir la cantidad de conflictos en cada etapa). Sin embargo, el mero hecho de que una nueva versión mienta sobre la historia hace que sea mucho más fácil joder bien en una nueva versión de varias etapas ... Es por eso que siempre prefiero la combinación, incluso cuando significa que necesito saturar la historia con varias confirmaciones de combinación. .git rebase master
es la forma correcta de hacer esto. Fusionar significaría que se crearía un commit para la fusión, mientras que rebase no.fuente
Si ha estado trabajando de vez en cuando en una sucursal, o han sucedido muchas cosas en otras sucursales mientras ha estado trabajando en algo, es mejor volver a armar su sucursal en maestra. Esto mantiene la historia ordenada y hace que las cosas sean mucho más fáciles de seguir.
Notas:
Hay un capítulo sobre rebase en http://git-scm.com/book/ch3-6.html , y muchos otros recursos disponibles en la web.
fuente
@cmaster hizo la mejor respuesta elaborada. En breve:
No debe reescribir el historial de la rama sino mantenerlos en estado real para futuras referencias. Mientras se fusiona para dominar, crea una confirmación adicional, pero eso es barato. Los compromisos no cuestan.
fuente
Para actualizar otras ramas como (copia de seguridad) con su copia de rama maestra. Puede seguirlo de cualquier manera (rebase o fusión) ...
Fusionar ramas (habrá una confirmación adicional automáticamente en la rama de copia de seguridad).
Nota: Rebase no es más que establecer una nueva base (una nueva copia)
(Repita para otras ramas si hay alguna como backup2 y etc.,)
(Repita para otras ramas si hay alguna como backup2 y etc.,)
fuente
Puede fusionar, o puede aplicar confirmaciones individuales a través de ramas mediante el uso de git cherry-pick .
fuente
Hay dos opciones para este problema.
1) git rebase
2) git merge
Solo difiere con los anteriores en caso de fusión, tendrá un compromiso adicional en la historia
1) rama de pago de git (b1, b2, b3)
2) git rebase origin / master (en caso de conflictos, resuelva localmente haciendo git rebase - continúe)
3) empuje git
Alternativamente, la opción git merge es una moda similar
1) git checkout "your_branch" (b1, b2, b3)
2) git merge master
3) empuje git
fuente
para actualizar su sucursal desde el maestro:
fuente