2010-11-08 19 views
32

Actualmente cuando estoy usando GIT, creo una rama para cada trabajo y hago varios commits antes de terminar. Luego me fusiono con mi rama principal y empujo hacia arriba. Es probable que tenga varias sucursales al mismo tiempo y también pase entre ellas a mitad del trabajo a medida que surgen las cosas.Merge GIT branch without commit log

Pero la mayoría de estas confirmaciones son solo puntos de guardado, es decir, no tan importantes en el gran esquema de cosas. Entonces, cuando fusiono la sucursal, me gustaría que los registros de la sucursal no se fusionen con los registros maestros.

¿Hay alguna manera de simplemente fusionar el mensaje de registro para la confirmación g a continuación (y no confirma c o e)?

a [master] 
| 
b (create branch 'job') 
|\ 
| \ 
| c 
| | 
d e 
| | 
f g (next step is to merge 'job' branch with 'master') 
+0

Me gustaría agregar a esta pregunta: ¿Hay alguna manera para que 'git log' solo muestre los mensajes que * no * provienen de confirmaciones intermedias como' c' y 'e'? – EOL

+0

@EOL: a menos que te malinterprete, eso es exactamente lo que hace la opción '--first-parent' (mencionada por knittl). Para un commit de fusión, el primer padre es de la rama fusionada, y el segundo padre es de la rama fusionada, por lo que seguir al primer padre (en general) significa seguir efectivamente el historial de solo la rama en la que se encuentra. – Cascabel

+0

@Jefromi: Gracias por señalar esto. En realidad, quise decir lo opuesto a lo que escribí: ¿cómo ocultar 'd' de' git log'? (Tengo una configuración donde la rama se fusionó en una versión simplemente de Python 2.6, por lo que la fusión en el registro de sucursales no es tan interesante.) – EOL

Respuesta

7

lo hay, pero no tiene sentido. ¿Por qué quieres hacer eso? perderás todo el historial e información de tucursal.

puede usar el mensaje de confirmación de g para su confirmación de fusión y luego examinar el historial con la opción --first-parent.

si realmente quiere perder la historia de su uso rama git merge --squash, i no lo recomiendo, aunque

edición

en caso de que no está satisfecho porque no tienen en cuenta su historial muy limpio, puede usar git's rebase feature:

puede editar retroactivamente las antiguas y crear nuevas confirmaciones de la sucursal existente (en efecto reescribiéndola). te permite volver a redactar los mensajes de confirmación, dividir confirmaciones, aplastar confirmaciones en una única confirmación, reordenar compromisos, etc.

solo debes usar el rebasamiento cuando no hayas publicado tu rama (es decir, es solo una rama privada)), porque dará dolor de cabeza a otros desarrolladores y podría causar problemas de fusión más adelante, si alguien siguió trabajando en la rama anterior (antes de volver a configurar).

+0

Hola Knittl, supongo que estoy buscando una "mejor práctica" realmente. Citar los puntos C y E podría ser un trabajo sin terminar y nunca sería un punto al que tendría que retroceder. Tal vez debería usar git stash en esos puntos en su lugar ... De cualquier forma mi problema fue que no quería que los mensajes de registro "basura" abarrotaran el registro maestro, pero acabo de encontrar este comando de registro de git que ayudará al agrupar los mensajes de registro: git log --pretty = formato: '% h:% s' --topo-order -graph – Adam

+0

@adam, siempre puede (de manera interactiva) volver a establecer la base de su bifurcación para ponerla en buen estado y luego fusionarse con maestro – knittl

+0

¿Podría ampliar su cosa "rebase su rama"? Esto suena interesante. :) – EOL

1

Como se mencionó en "Trimming GIT Checkins/Squashing GIT History", si sus confirmaciones c y e se realizaron con un comentario con el prefijo fixup!, entonces el rebase --interactive --autosquash (+ git1.7, febrero de 2010) se puede hacer exactamente lo que está después.

con la directiva fixup!, usted podría mantener que aplastar "invisible" en el mensaje de confirmación, mientras se beneficia de la reordenación automática commit con la opción --autosquash.

Para comprometerse con un prefijo fixup!, se puede definir el alias

[alias] 
    fixup = !sh -c 'git commit -m \"fixup! $(git log -1 --format='\\''%s'\\'' [email protected])\"' - 
    squash = !sh -c 'git commit -m \"squash! $(git log -1 --format='\\''%s'\\'' [email protected])\"' - 

Los fixup alias se aplicarían para los que "se compromete (que) se acaba de guardar puntos, es decir, no es tan importante en el gran esquema de cosas ".

47

Considero que fusionar --squash es extremadamente útil cuando uso un enfoque de "rama por función". Mi historial de compromisos en sucursales temporales es una basura completa, absolutamente sin sentido. Y realmente no quiero volver a ver esa historia, no solo para poder omitirla.

Cuando las confirmaciones van a revisión de código, es importante no crear compromisos adicionales.

+0

Tengo que estar de acuerdo. Si has estado realizando commits en un servidor remoto como una rama WIP, entonces no puedes volver a establecer la base y arreglar el historial. Para ramas de características pequeñas, es perfectamente legal. –

+0

Correcto y es un flujo de trabajo muy común en equipos de tamaño mediano. – oxfn

+0

Lo mejor que puedo decir es que solo expresaste tu opinión. No respondió la pregunta del OP de * "¿Hay alguna manera de simplemente fusionar el mensaje de registro para commit g a continuación (y no confirma c o e)?" * – jww