2012-02-23 10 views
10

En mi flujo de trabajo git del día a día, tienen muchas ramas puntuales, así:Git: el mantenimiento de muchas ramas puntuales sobre una base de frecuencia de movimiento

 
       o--o--o (t2) 
      /
     o--o (t1) 
     /
o--o--o (master) 
     \ 
     o--o--o (t3) 

Cuando me tire desde aguas arriba,

 
       o--o--o (t2) 
      /
     o--o (t1) 
     /
o--o--o--n--n--n (master) 
     \ 
     o--o--o (t3) 

quiero rebase todos mis ramas puntuales en la parte superior del nuevo maestro:

 
         o'--o'--o' (t2) 
        /
        o'--o' (t1) 
       /
o--o--o--n--n--n (master) 
       \ 
        o'--o'--o' (t3) 

Actualmente lo hago a mano, usando git rebase --onto. En este escenario, todo el proceso de actualización sería:

$ git checkout master 
$ git pull 
$ git rebase master t1 
$ git rebase --onto t1 t2~3 t2 
$ git rebase master t3 

Esto se vuelve aún más peludo al saltar entre diferentes ramas puntuales y compromete la adición.

Dependencias entre las ramas de tema en mi caso son puramente arbórea: ninguna rama depende de más de una sola rama. (Tengo que ejecutar parches dependientes en un orden particular, entonces elijo ese orden a priori.)

¿Hay alguna herramienta que me pueda ayudar a gestionar este flujo de trabajo? He visto TopGit, pero parece estar muy relacionado con el flujo de trabajo basado en correo electrónico tg patch, que no es relevante para mí.

+0

¿Por qué se rebase '' master 't2' en lugar de sólo rebase que en 't1', como se muestra en el gráfico? Del mismo modo, con 't3', el indicador' --onto' no es apropiado. –

+0

Consulte también la pregunta [rama git rebase con todas las subdivisiones] (http://stackoverflow.com/q/2730866/112968) – knittl

+0

Kevin: whoops, yes - typo :) – nornagon

Respuesta

4

Más o menos la misma pregunta se hizo en la lista de correo de git: Rebasing Multiple branches at once... La respuesta ligada ha adjuntado un script en Perl que genera las órdenes que se necesitan .

Si desea que esta secuencia de comandos sea rápida y evite que se mueva de puntillas, también considere usar git-new-workdir para configurar una copia de trabajo solo para el reajuste automático.

Si se encuentra resolviendo los mismos conflictos una y otra vez, considere habilitar git rerere.

Una vez dicho todo esto, aquí es una receta alternativa:

# Construct a placeholder commit that has all topics as parent. 
HEADS="$(git for-each-ref refs/heads/\*)" && 
MAGIC_COMMIT=$(echo "Magic Octopus"$'\n\n'"$HEADS" | 
    git commit-tree \ 
    $(git merge-base $(echo "$HEADS" | sed 's/ .*//'))^{tree} \ 
    $(echo "$HEADS" | sed 's/ .*//;s/^/-p /')) && 
git update-ref refs/hidden/all $MAGIC_COMMIT 

# Rebase the whole lot at once. 
git rebase --preserve-merges master refs/hidden/all 

# Resolve conflicts and all that jazz. 

# Update topic refs from the rebased placeholder. 
PARENT= 
echo "$HEADS" | 
while read HASH TYPE REF 
do 
    let ++PARENT 
    git update-ref -m 'Mass rebase' "$REF" refs/hidden/all^$PARENT "$HASH" 
done 
+1

¡Increíble, gracias! : D Utilicé una versión ligeramente modificada de esta técnica para crear una secuencia de comandos que rebase solo un subárbol: https://github.com/nornagon/git-rebase-all – nornagon

+0

Motivo del voto negativo? –

-2

No rebase. Comience sus funciones desde un punto en común. Las fusiones son mucho menos trabajo al final.

Esto es lo que hacemos:

http://dymitruk.com/blog/2012/02/05/branch-per-feature/

+0

Eso está bien, pero me estoy integrando con el flujo de trabajo de Chromium, que es lineal. Estas ramas temáticas son solo locales, pequeñas (generalmente de 1 a 5 compromisos cada una) y de corta duración. – nornagon

+0

Wow, este fue un buen artículo para leer. +1 Consejos sensatos sobre el rebase también, aunque habrá motivos para hacerlo en circunstancias específicas. – jupp0r

+0

@nornagon en el flujo de trabajo que he descrito, se aplica a las características pequeñas. No hay diferencia.La fusión es mejor, en general, ya que tendrá en cuenta los cambios de código y de dónde provienen, incluido el movimiento de archivos. –

Cuestiones relacionadas