2011-11-24 17 views
5

tengo un árbol git que se parece a lo siguiente:git rebase cometer selección

enter image description here

Debido a la herramienta de revisión que usamos, nos cereza recoger los cambios en lugar de su fusión. Esto nos deja con algunos duplicados lógicos, cuya rama luego elimino. Por ejemplo, el cambio uno debajo de ssl_tests "Modificación: Cambiar el nombre ..." también se puede ver en el desarrollo.

Ahora, quizás esto es una falta de comprensión por mi parte de cherry pick, pero esos commits tienen hashes diferentes y por lo tanto son diferentes commits ¿verdad? A pesar de que son lógicamente lo mismo.

Sin embargo, cuando voy a rebase ssl_tests en dev, git se las arregla para descubrir que esos commits seleccionados son preliminares y luego solo reescribe el "New Feature: Unit tests ..." commit de ssl_tests.

Como de costumbre, con git, ¡esto es genial! Esto es exactamente lo que quiero! Mi pregunta, sin embargo, es ¿cómo se da cuenta Git de que no necesita volver a establecer la base de las otras confirmaciones si tienen hashes diferentes?

Gracias! Stephen

+0

Una buena publicación sobre fusión de magia en Git es [¿Cómo y/o por qué la fusión en Git es mejor que en SVN?] (Http://stackoverflow.com/q/2471606/11343) – CharlesB

Respuesta

5

Git está buscando algo más que solo SHA1 aquí. De hecho, está considerando los contenidos de la confirmación. Ve que los árboles resultantes de aplicar el compromiso y no aplicar el compromiso son los mismos; es decir, la confirmación estaría vacía si se aplica a la nueva base. Por lo tanto, rebase es lo suficientemente inteligente como para saber que no necesita molestarse, incluidos esos commits.