2012-05-25 9 views
9

Tengo varias ramas de características y una rama principal. Feature2 está hecho. Normalmente me gustaría rebase (trabajando con un repositorio de SVN remoto y me gustaría mantener el historial, así que no hay fusión regular) y ff-merge. Pero como el maestro no ha cambiado desde que me ramifiqué, me gustaría mover el cabezal maestro (al E) al G. El uso de git branch -f master G no da como resultado ningún cambio visible, asumí que esto se debe a que G está en una rama diferente.Desplazamiento del cabezal maestro a una rama

¿Es seguro usar git update-ref -f master G aquí? ¿Debo seguir con rebase/ff-merge? Algo aún mejor?

feature1  C-D 
      /
master A-B-E    
       \      
feature2  F-G 

Gracias.

+1

¿Qué pasa con una combinación de avance rápido regular de '' master 'en G'? No hay necesidad de volver a establecer la base. Mantendrás el historial y obtendrás un gráfico recto ('A-B-E-F-G'). – ellotheth

+0

aah, ¡lo obvio! el gráfico se ve exactamente como después de una rebase. Me pregunto por qué alguna vez pensé en algo más. ¿Te importa volver a publicar como respuesta? – kostja

+0

La rama feature2 ya tiene un 'gráfico recto' - simplemente cambie el nombre de feature2 a master (o mueva el master a feature2)! – GoZoner

Respuesta

5

Una fusión normal de G en maestro hará el truco, no hay necesidad de rebase:

feature1  C-D 
       /
    master A-B-E    
        \      
    feature2  F-G 

git checkout master 
git merge feature2 

    feature1    C-D 
         /
    master, feature2 A-B-E-F-G 
0

Podría ser mejor realizar una fusión de avance rápido de la función 2 en el maestro utilizando git merge --no-ff feature2 si se ha transferido a la rama maestra. Debería terminar con los siguientes

feature1  C-D 
      /
master A-B-E-----H   
       \ /     
feature2  F-G 
+0

Me gustaría evitar mezclarme regularmente con el maestro cuando sea posible para mantener la historia, lo dije en la pregunta. Y, ¿por qué crees que una fusión no-ff es más adecuada que ref mover? – kostja

11

No es necesario fusionar las ramas, basta con un reinicio. Asumiendo que el maestro está desprotegido:

git reset --hard feature2 
+2

Un restablecimiento es funcionalmente equivalente a una fusión de avance rápido en este caso. – ellotheth

+1

Funciona como se anuncia, gracias Magnus. – kostja

+0

después de cinco minutos de buscar la respuesta, pruebo esto y funciona. simple, y esperado en la reflexión. ¡Gracias! –

1

La actualización-ref es segura. Una cabeza de rama no es más que un pequeño "¡léame!" etiqueta colgada en una confirmación. Es puramente por convención que Git lo recoge y lo cuelga en un compromiso diferente para ti a veces.

Usando git branch -f maestro G no da lugar a ningún cambio visible

¿Qué dice git log --decorate --oneline --all? git show master?

+0

Malo, ingresé el SHA incorrecto para 'git branch master SHA'. Funcionó. – kostja

6

No se requiere fusión, solo cambie el nombre de las ramas. Como no le interesan las características2 ('está hecho') ni las maestras existentes (en 'E'), solo necesita lo siguiente.

git branch -d master 
git branch -m feature2 master 

Simple is better?

Recuerde que hay dos conceptos clave que participan:

  1. El Git cometer gráfico y
  2. El Git hace referencia a

Al hacer una fusión (de varios sabores y que incluye rebase) se están cambiando el gráfico de compromiso. Los cambios implican agregar nodos, agregar enlaces o quizás mover enlaces. Las referencias (incluidas las ramas y las etiquetas) solo apuntan a confirmaciones y, por lo tanto, el cambio de una referencia simplemente cambia la confirmación de apunte, no la estructura del gráfico.

Por lo tanto, en su caso, no hay cambios necesarios en la estructura, solo un cambio de las referencias.

Una versión de una línea es:

git branch -f master feature2 

que mantiene la rama característica2 alrededor de (a diferencia de la anterior dos-liner qué ejes característica2).

+1

Gracias, GoZoner. Buena alternativa en la que no he pensado. Pero supongo que me quedaré con ff-merge en mi caso. – kostja

+0

Ver detalles adicionales en la edición. – GoZoner

+0

parece funcionar localmente. ¿Pero cómo presiono los cambios en el servidor remoto? Se queja de una fusión no rápida – josinalvo

Cuestiones relacionadas