2010-11-09 17 views
5

Tengo dos ramas: maestra y experimento. Ambos evolucionaron por separado y son muy diferentes ahora. Ahora estoy listo para hacer que el experimento ramifique mi rama principal.Cómo reemplazar la rama principal con la rama de experimento

Si intento

git checkout master 
git merge experiment 

me sale toneladas y toneladas de error.

¿Cuál es la forma más fácil de obtener la rama de experimento para convertirse en maestro sin perder todo el historial de la rama de experimento.

que ya han creado una copia de seguridad de la rama principal como la versión 1.0 como esto

git checkout master 
git checkout -b release_1 
+1

¿Qué tipo de errores obtienes? ¿Y desea * fusionar * los cambios en el maestro, o simplemente reemplazar el maestro con la rama de experimento? – poke

+0

Supongo que los errores son realmente "conflictos" –

+0

mala elección de las palabras. Debería haber dicho conflictos. Pero hay tantos y realmente no quiero resolverlos. –

Respuesta

21

Asumiendo que estos son privadas ramas (es decir, nadie más está trabajando en ellos), puede simplemente configurar master a experiment de esta manera:

git checkout master 
git reset --hard experiment 

Si se trata de sucursales públicas, es probable que desee fusionar y resolver conflictos, como Jefromi explains.

+0

¿Esto no solo "copia" el contenido de la rama del experimento al actual? De esa forma perderás el historial de la sucursal. – poke

+0

@poke: reset no copia nada. Esto simplemente establece 'maestro' exactamente donde está 'experimento'. –

+0

@Mauricio: Sí, pero descarta el maestro original (y con eso todas las confirmaciones nuevas que no están en la rama de experimento) y convierte al maestro en una "copia" de la rama de experimento, apuntando a la misma CABEZA. – poke

2

Puede cambiar el nombre de la sucursal (de experimento): git branch -M master

12

Aquí hay algunas posibilidades, dependiendo de exactamente lo que quiere decir con "reemplazar". Es casi seguro que tomó el enfoque correcto para empezar: la fusión generalmente es el camino a seguir. Los "errores" que viste fueron conflictos de fusión, presumiblemente. Si usted sabe con certeza que, cada vez que hay un conflicto, que desea utilizar la versión de su rama experimental, que podría hacer:

# resolve conflicts by taking the version from experimental 
# non-conflicting content is merged normally 
git checkout master 
git merge -Xtheirs experimental 

Si desea utilizar la versión en experimental para todo, no sólo donde hay conflictos, hay muchas maneras (en realidad no hay una estrategia de fusión para esto). El más simple:

# do the merge the other way around 
git checkout experimental 
git merge -s ours master 
git checkout master 
git merge experimental 

# do the merge the right way 
git checkout master 
git merge --no-commit experimental # merge, but stop before committing 
git checkout experimental .   # check out content, but don't switch branch 
git commit       # commit the merge 

Las formas que otros han sugerido (reset --hard, branch -M) van a trabajar, más o menos, pero ya que no crea una combinación de cometer, su rama principal se mueve en una forma no avance rápido, potencialmente causando dolores de cabeza a otros que necesitan sacar de este repositorio. En general, diría que esa es la respuesta correcta solo si estas ramas no están publicadas.

+0

Creo que hay un malentendido aquí. El OP no desea fusionarse, quiere reemplazar la rama. –

+1

@Mauricio: No, el OP quiere reemplazar el * contenido * de la sucursal, evitando resolver los conflictos. Puedes tenerlo en ambos sentidos, y si te fusionas, significa que otros podrán extraer la actualización limpiamente. (Esto, para mí, es un caso muy probable de necesitar hacer X, y preguntar cómo hacer Y para lograrlo, cuando en realidad se puede hacer Y ', lo que hará que todos estén más felices.) – Cascabel

+0

@Jefromi: en realidad, parece que asumió que es una rama * public *, mientras que asumí que es una rama * privada *. –

Cuestiones relacionadas