22 votos

Git merge squash repetidamente

Estoy tratando de tener dos ramas con archivos binarios en git - uno "desarrollo" y "estable". La rama de desarrollo puede tener varios cambios de estos archivos antes de que me quieren "liberar" a la rama estable (y la rama estable, ha cambiado el nombre de los archivos, en caso de que proceda).

Yo podría hacer una normal de mezcla, esto funciona bien, pero conserva mucho de la historia - al tirar de la "estable" de la rama, todos los intermedios se compromete desde el "desarrollo" de la rama se tira así (porque son padre comete). Pero estamos hablando de archivos binarios que no tienen ningún sensato de la fusión de la estrategia (excepto las de ellos/nosotros), por lo que la verdadera historia de los archivos en la rama de desarrollo es inútil. Cuando me tire de la "estable" de la rama, me sale esto:

 X-------------------G estable
 / /
 a---b---c---d---e---f---g desarrollo

Debido a que G tiene un padre en la rama de desarrollo, tengo toda la historia de la rama de desarrollo (objetos de datos de c, d, e, f y g), en mi repositorio, que yo no estoy interesado en (X es el mismo que b, con algún cambio de nombre de archivos que se aplican).

Por lo que he intentado git merge --squash cambios de la rama de desarrollo para la rama estable. El primer ejemplo de combinación y cometer ido bien, los resultados fueron como se esperaba (buen cambio de registro en el mensaje de confirmación, sin relación con la rama de desarrollo):

 X-------------------G estable
 / 
 a---b---c---d---e---f---g desarrollo

Después de que me tire de esta aplastado rama estable, tengo este en mi repositorio, que es lo que quiero:

a---b---X---G

Pero la segunda mezcla de error (porque git no había forma de saber cuánto he fusionado y que ya se haya confundido).

  • Es posible de alguna manera el registro de la combinación, sin producir una combinación de correspondencia "comprometerse" con los dos padres?
  • O, es posible decirle a git para combinar sólo un cierto "rango" de las revisiones, como en el SVN?
  • O, es posible realizar una combinación sin tener que descargar todos los árbitros de la otra rama cuando se tira?
  • O debería proporcionar una costumbre de combinación de controlador para los archivos en cuestión, que simplemente cambia el nombre de "su" versión a "nuestros", con el objeto de resolver los conflictos? Todavía estoy asustada de que --squash siempre intenta combinar toda la historia, hasta el padre en común, la resolución sólo la mitad de mi problema.

Actualización: reajuste

Si entiendo reajuste correctamente, voy a terminar con esto:

 X estable
/
 a---b---c---d---e---f---g desarrollo

Que me pone todos los datos, yo no estoy interesado en (c, d, e, f) y como un bono, voy a perder la información que b era una versión estable de la rama.

El desarrollo de cada uno de revisión añade alrededor de 5MB para el repositorio de tamaño (y reembalaje de toda la repo se reduce sólo alrededor del 10%), la "estable" de la rama sale casi gratis (los datos que ya existe). Quiero tirar una sola nueva revisión de la rama estable para extraer sólo la nueva 5MB, pero en lugar de la actualización de X a G descargas de 25MB, porque soy de los que de alguna manera no es capaz de decir que no me importa acerca de los contenidos de c, d, e y f.

21voto

pvillela Puntos 366

Comenzando con

      X stable
     /                   
a---b---c---d---e---f---g development

Usted puede utilizar los siguientes pasos para copiar el último commit de su rama de desarrollo de su rama estable:

git checkout development@{0}  # get working tree from "development", detach HEAD
git reset --soft stable  # reposition detached HEAD on "stable"
git commit  # enter the appropriate commit message
git branch temp  # create a temporary branch "temp" at HEAD
git checkout temp  # get on the new temporary branch
git branch -M stable  # rename "temp" to "stable"

así que al final termina con:

      X-------------------G stable
     /                   
a---b---c---d---e---f---g development

Si usted continuar el trabajo sobre el "desarrollo", por ejemplo,

      X-------------------G stable
     /                   
a---b---c---d---e---f---g---h---i---j development

puede repetir los mismos comandos de git como el anterior y el resultado final será con:

      X-------------------G-----------J stable
     /                   
a---b---c---d---e---f---g---h---i---j development

5voto

Este no es el lugar adecuado para usar merge --calabaza. Un buen lugar para usar está en un desechable tema de poder, que va a combinar en su rama principal y, a continuación, deshacerse de. Todo el desarrollo se hace en el tema de la rama se muestra como un commit de la rama principal. En su situación, usted debe combinar a partir de la rama de desarrollo normalmente y, a continuación, utilizar git rebase --interactivo para aplastar a los envíos que usted desea.

Es posible de alguna manera el registro de la combinación, sin producir una combinación de correspondencia "comprometerse" con los dos padres?

Si entiendo correctamente la pregunta, no. Por supuesto que no.

Es posible decirle a git para combinar sólo un cierto "rango" de las revisiones, como en el SVN?

Sí. git merge [cometer hash]

O, es posible realizar una combinación sin tener que descargar todos los árbitros de la otra rama cuando se tira?

Véase la respuesta a la pregunta anterior.

O debería proporcionar una costumbre de combinación de controlador para los archivos en cuestión, que simplemente cambia el nombre de "su" versión a "nuestros", con el objeto de resolver los conflictos? Todavía estoy asustada de que --calabaza siempre intenta combinar toda la historia, hasta el padre en común, la resolución sólo la mitad de mi problema.

No! Simplemente no usar git merge --calabaza. Este no es el lugar adecuado para usarlo!

2voto

knittl Puntos 64110

usted podría utilizar git rebase -i (modo interactivo) para sqash todos sus cambios, al cambiar las líneas a m o meld

usted tendrá que tener una única confirmación que se puede combinar. si desea que cada paso suyo reservado, usted tiene que crear otra rama en el hacking de la rama antes de hacer el reajuste, esto se puede hacer con git branch small-dirty-changes-i-don't-want-anybody-to-see

todo esto tiene que ser hecho antes de intentar fusionar; paso a paso:

# on branch "hacking": hack commit hack commit hack commit

# create a reference to your history
$ git branch dirty-history

# sqash your commits by setting all lines to "meld"
$ git rebase -i

# checkout master or the branch you want to merge to
$ git checkout master

# merge your squashed commit
$ git merge hacking
# or: $ git pull hacking

-1voto

Simon Richter Puntos 288

Soy nuevo en el git, pero parece que --de la calabaza es lo que usted quiere, usted simplemente necesita para manejar la rama de manera diferente.

$ git merge --squash development
$ git branch -d development
$ git checkout -b development
# continue work on development branch

Esto esencialmente truncar la historia de la rama de desarrollo, y la siguiente combinación sólo sería lo que quería. Mirando en la página man parece git branch -f development podría hacer lo mismo que eliminar y volver a crear la rama.

Como ya he dicho, soy bastante nuevo para git, así que me encantaría algunos comentarios sobre esta idea.

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