La razón principal de lo que puedo ver es la siguiente:
- La interfaz de usuario de GitHub para fusionar solicitudes de extracción actualmente (octubre de 2015) no le permite editar la primera línea del mensaje de confirmación, lo que obliga a que sea
Merge pull request #123 from joebloggs/fix-snafoo
- La interfaz de usuario de GitHub para explorar el historial de confirmación actualmente no le permite ver el historial de la rama desde el
--first-parent
punto de vista
- La interfaz de usuario de GitHub para ver la culpa en un archivo actualmente no le permite ver la culpa del archivo con el
--first-parent
punto de vista (tenga en cuenta que esto solo se solucionó en Git 2.6.2, por lo que podríamos perdonar a GitHub por no tener eso disponible)
Entonces, cuando combina las tres situaciones anteriores, obtiene una situación en la que las confirmaciones sin aplastar que se fusionan se ven feas desde la interfaz de usuario de GitHub.
Tu historial con commits aplastados se parecerá
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language
Mientras que sin compromisos aplastados, la historia se verá algo así como
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Cuando tiene muchas confirmaciones en un seguimiento de relaciones públicas en el que se produjo un cambio, puede convertirse en una pesadilla si se limita a usar la interfaz de usuario de GitHub .
Por ejemplo, encuentra que un puntero nulo se desreferencia en algún lugar de un archivo ... por lo que dice "¿quién hizo esto y cuándo? ¿Qué versiones de lanzamiento se ven afectadas?". Luego paseas a la vista de culpa en la interfaz de usuario de GitHub y ves que la línea se cambió en789fdfffdf
... "oh, pero espere un segundo, esa línea solo tenía su sangría cambiada para encajar con el resto del código", así que ahora necesita navegar al estado del árbol para ese archivo en el compromiso principal y volver a visitar la página de la culpa ... eventualmente encuentras el commit ... es un commit de hace 6 meses ... "oh **** esto podría estar afectando a los usuarios durante 6 meses" dices ... ah, pero espera, ese commit en realidad estaba en una solicitud de extracción y solo se fusionó ayer y nadie ha cortado un lanzamiento todavía ... "Maldita sea por fusionar confirmaciones sin aplastar el historial" es el grito que generalmente se puede escuchar después de aproximadamente 2 o 3 expediciones de arqueología de código a través de IU de GitHub
Ahora consideremos cómo funciona esto si usa la línea de comandos de Git (y la súper increíble 2.6.2 que tiene la solución git blame --first-parent
)
- Si estaba utilizando la línea de comando Git, podría controlar el mensaje de confirmación de fusión por completo y, por lo tanto, la confirmación de fusión podría tener una buena línea de resumen.
Entonces nuestra historia de compromiso se vería así
$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Pero también podemos hacer
$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language
(En otras palabras: la CLI de Git le permite tener su pastel y comérselo también)
Ahora, cuando nos topamos con el problema del puntero nulo ... bueno, simplemente usamos git blame --first-parent -w dodgy-file.c
e inmediatamente se nos da la confirmación exacta donde se introdujo la desreferencia del puntero nulo a la rama maestra, ignorando los simples cambios de espacios en blanco.
Por supuesto, si está haciendo fusiones usando la interfaz de usuario de GitHub, entonces git log --first-parent
es realmente horrible gracias a que GitHub obliga a la primera línea del mensaje de confirmación de fusión:
1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
Entonces, para resumir una larga historia:
La interfaz de usuario de GitHub (octubre de 2015) tiene una serie de deficiencias con respecto a cómo combina las solicitudes de extracción, cómo presenta el historial de confirmación y cómo atribuye la información de culpa. La mejor forma actual de piratear estos defectos en la interfaz de usuario de GitHub es solicitar a las personas que eliminen sus compromisos antes de fusionarse.
La CLI de Git no tiene estos problemas y puede elegir fácilmente qué vista desea ver para que ambos puedan descubrir la razón por la cual se realizó un cambio en particular de esa manera (mirando el historial de las confirmaciones no aplastadas) y ver los commits efectivamente aplastados.
Publicar guión
La razón final a menudo citada para las confirmaciones de aplastamiento es hacer que el backport sea más fácil ... si solo tiene una confirmación para el puerto de respaldo (es decir, la confirmación aplastada), entonces es fácil elegir ...
Bueno, si está mirando el historial de git git log --first-parent
, puede elegir los commits de fusión. La mayoría de las personas se confunden al elegir las -m N
opciones de fusión de fusión porque tiene que especificar la opción, pero si obtuvo la confirmación, git log --first-parent
entonces sabe que es el primer padre que desea seguir, por lo que serágit cherry-pick -m 1 ...