29 votos

git rebase interactivo: la calabaza de mezcla se compromete juntos

Yo quería tener una solución simple para squash dos se funden comete juntos durante un interactiva de reajuste.

Mi repositorio parece:

   X --- Y --------- M1 -------- M2 (my-feature)
  /                 /           /
 /                 /           /
a --- b --- c --- d --- e --- f (stable)

Es decir, tengo un my-feature rama que se ha fusionado dos veces recientemente, sin un real comete en el medio. Yo no sólo quiero rebase el my-feature rama desde que se haya publicado una rama de su propia, sólo quiero calabaza juntos los dos últimos mezcla se compromete en uno (no han publicado los compromete aún)

He intentado:

git rebase -p -i M1^

Pero yo tengo:

Refusing to squash a merge: M2

Lo que finalmente me hizo es:

git checkout my-feature
git reset --soft HEAD^  # remove the last commit (M2) but keep the changes in the index
git commit -m toto      # redo the commit M2, this time it is not a merge commit
git rebase -p -i M1^    # do the rebase and squash the last commit
git diff M2 HEAD        # test the commits are the same

Ahora, la nueva combinación de cometer no es considerada como una combinación de cometer más (que sólo se mantiene en el primer lugar de los padres). Así:

git reset --soft HEAD^               # get ready to modify the commit
git stash                            # put away the index
git merge -s ours --no-commit stable # regenerate merge information (the second parent)
git stash apply                      # get the index back with the real merge in it
git commit -a                        # commit your merge
git diff M2 HEAD                     # test that you have the same commit again

Pero esto puede complicarse si tengo muchos se compromete, ¿tiene una solución mejor ? Gracias.

Mildred

28voto

Matt Puntos 101

Este es un viejo tema, pero me corrió a través de ella mientras buscaba información similar.

Un truco similar a la descrita en el Subárbol pulpo de mezcla es una muy buena solución para este tipo de problema:

git checkout my-feature
git reset --soft Y
git rev-parse f > .git/MERGE_HEAD
git commit

El que toma el índice, tal como existe en la punta de mi, y utilizarlo para crear un nuevo commit fuera de Y, con 'f' como un segundo padre. El resultado es el mismo, como si nunca hubiera realizado M1, pero ahora se ha ido directamente a la realización de M2.

5voto

bobDevil Puntos 5986

si usted no ha publicado los últimos dos se funden compromete, usted podría hacer un reset, y una simple combinación.

git reset --hard Y
git merge stable

2voto

Vine a este tema querer aplastar a una sola combinación de cometer; así que mi respuesta no es muy útil a la pregunta original.

               X
                \   
                 \  
a --- b --- c --- M1 (subtree merge)

Lo que yo quería era rebase el M1 de mezcla y de squash todo como una única confirmación en la parte superior de b.

a --- b --- S (include the changes from c, X and M1)

He probado todo tipo de combinaciones diferentes, pero esto es lo que ha funcionado:

git checkout -b rebase b (checkout a working branch at point b)
git merge --squash M1

Esta se aplicarán los cambios en el índice, donde pueden ser cometidos git commit

0voto

Michael Wild Puntos 6612

Ninguno de los métodos mencionados a mí me funciona con un reciente versión git. En mi caso, los siguientes hizo el truco:

git reset --soft Y
git reset --hard $(git commit-tree $(git write-tree) -p HEAD -p stable < commit_msg)

Tendrás que escribir el mensaje de confirmación para el archivo commit_msg en primer lugar, sin embargo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X