2008-10-01 16 views
42

De acuerdo con the manual, git dcommit "creará una revisión en SVN para cada confirmación en git." ¿Pero hay una manera de evitar las revisiones múltiples de Subversion? Es decir, ¿Git fusionó todos los cambios antes de realizar el svn commit?¿Es posible hacer que git svn dcommit resulte en una única confirmación svn?

+0

Tengo el mismo problema. Imagina que clonas un svn repo a git como tu maestro, haces 3 commits con diferentes mensajes y luego usas git svn dcommit. ¿Es posible "fusionar" estos 3 commits en uno solo? Cómo puedes hacerlo ? Puede darnos un ejemplo ? ¡Gracias! – sergiofbsilva

+0

Posible duplicado de [Combine las confirmaciones locales de Git en una confirmación para git-svn] (http://stackoverflow.com/questions/1408381/combine-local-git-commits-into-one-commit-for-git-svn) – centic

Respuesta

34

Si trabaja en una sucursal en git, puede git-merge --squash, que lo hace dentro de git. A continuación, puede presionar ese compromiso aplastado a SVN.

Por supuesto, muchos compromisos pequeños son buenos, entonces ¿por qué querría aplastarlos?

+0

Gracias!(Normalmente me gustaría un montón de compromisos pequeños, pero esto se refiere a un proyecto de cliente en el que mi socio y yo necesitamos impulsar cambios entre sí con frecuencia, y con frecuencia incluso cambios que romperían el tronco). – plindberg

+0

¿Por qué no trabajan ambos en la misma rama (svn), entonces? –

+2

Uso muchos pequeños commits para facilitar el seguimiento de los cambios; Cuando me comprometo con el servidor svn, generamos un correo electrónico para cada confirmación de SVN. Prefiero hacer el trabajo extra de volver a combinar con squash para las confirmaciones de "unidades lógicas" y ahorrarles a todos unos pocos correos electrónicos. – cbowns

27

El comando git rebase -i puede hacer esto, y más. Este comando es extremadamente poderoso, por lo que es bueno hacer amistad con él.

La sintaxis es: git rebase -i <commit ID>. Esto muestra su editor de texto, con opciones (e instrucciones) para modificar todas las confirmaciones hasta (sin incluir) la identificación dada.

Por ejemplo, para modificar las 5 confirmaciones anteriores, usted puede hacer esto:

git rebase -i HEAD~5

O si su rama SVN se llama "svn/trunk", a continuación, esta sintaxis es bueno también:

git rebase -i svn/trunk

Aparecerá una ventana del editor de texto. Para aplastar todo, cambie la primera palabra de cada línea después de la primera, de "elegir" a "aplastar" (si esto suena confuso, tendrá más sentido cuando lo vea). Luego guarde y cierre el editor. A continuación, tendrá la oportunidad de editar el mensaje de confirmación para la confirmación aplastada.

Entre otras cosas que puede hacer con git rebase -i, están reordenando las confirmaciones, aplastando las confirmaciones de diferentes maneras y eliminando las confirmaciones.

Utilizo este comando constantemente; es una característica clave de Git.

7

Ryan Tomayko escribió un poco sobre git rebase -i, que dijo:

... [es] un poco como git commit --amend saltó sobre el ácido y la celebración de una motosierra - completamente loco y bastante peligroso, pero capaz de exponiendo estados de mente completamente nuevos. Aquí puede editar, aplastar, reordenar, separar y anotar las confirmaciones existentes de una forma más fácil e intuitiva de lo que debería ser.

que tienen una tendencia a cometer a menudo en git, pero no necesariamente quieren dcommit cada se comprometen a SVN, y aplastando todo mi trabajo hace tan poco sentido. Ahora estoy intentando reordenar y agrupar algunos en unidades de compromiso más lógicas.