Te unes. Eso es realmente 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ó: 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 la b1
fusión de ramas master
o las master
fusiones b1
, 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:
git checkout b1
git rebase master
# repeat for b2 and b3
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:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
La fusión da como resultado la verdadera historia:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
El rebase, sin embargo, te da esta historia:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
El punto es que los commits E'
, F'
y G'
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 cambios master
son importantes para el desarrollo b1
.
La consecuencia de esto puede ser, que no se puede distinguir cuál de las tres confirmaciones E
, F
y G
en realidad introdujo una regresión, disminuyendo el valor de git 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.