Limpio, limpio, compactado, git PR y merge commit, en un commit

La mayoría de las veces en los repositorys, vemos un PR, luego un commit de fusión de ese PR, que solo dice "Solicitud de extracción fusionada #XXX from …".

Pero recientemente, vi una versión compactada de eso, donde los avatares del solicitante de extracción y el committer se superponen, y solo aparece una confirmación limpia en la historia:

enter image description here

¿Cómo puede hacerse esto?

Lo que he intentado y no funciona:

  • borrar la twig después de que se acepte el PR ( PR # 755 )
  • borrar el repository después de que se acepte el PR (PR # 78)

ACTUALIZAR

Un ejemplo de cómo se ve cuando uno de mis RP se fusionó de esa manera:

enter image description here

Resultados en:

enter image description here

Actualización de abril de 2016

GitHub ha introducido una opción para aplastar los commits cuando se fusiona , por lo que puedes hacerlo directamente desde su UI web:

Squash y fusión

Vieja solución

Acabo de encontrar este flujo de trabajo del equipo Meteor (casualmente, gracias @Emily ):

Cuando mira una request de extracción en la interfaz web de GitHub, hay un button de "fusión" muy atractivo. NUNCA USE EL BOTÓN DE FUSIÓN. Es una molestia atractiva . Lleva a la historia de git que es mucho más complicada de lo necesario: si el PR se archivó hace un mes, el padre del compromiso será una revisión muy antigua que conduce a mucho más líneas de las necesarias en una vista gráfica del historial de git. Además, si está utilizando el button de fusión, eso significa que nunca revisó el código y lo intentó usted mismo. La siguiente es una mejor forma de enviar requestes de extracción.

Primero, en su repository, busque la sección [remote "origin"] del file .git/config y agregue esta línea:

 fetch = +refs/pull/*/head:refs/remotes/origin/pr/* 

Asegúrese de agregarlo ANTES de la línea de búsqueda existente. ¡Ahora, cada vez que traigas fetichismo, obtendrás todas las Solicitudes de extracción en el repository actualizado! Este es un cambio por única vez que le dará acceso directo a relaciones públicas para siempre.

Entonces puedes simplemente git checkout pr/XXX y trabajar con los cambios directamente. Un git push origin después de "cherry-picking" creará el PR compacto:

 git checkout pr/32 # ... test changes ... git checkout master git cherry-pick pr/32 git push 

enter image description here

El único inconveniente es que GitHub no eliminará automáticamente las twigs de relaciones públicas cuando están cerradas, pero eso es solo un clic de distancia y, a cambio, obtienes una historia mucho mejor.

Si el PR es de múltiples confirmaciones, lo mejor que puede hacer es verificarlo, volver a establecer la base en su twig de desarrollo , hacer los cambios que necesite y fusionarlo de nuevo en la twig de desarrollo con una fusión explícita. Esto es similar a lo que hace el button de fusión de GitHub, excepto que el button de fusión no hace el MUY IMPORTANTE paso de rebase, por lo que deja feos espaguetis en el historial de commit de git del proyecto. Para hacer esto, ejecuta:

 git checkout pr/32; git rebase devel; git checkout devel; git merge --ff-only pr/32 

Luego testing y empuja.

Si desea combinar algunas de las confirmaciones en una única confirmación, puede usar una database interactiva ejecutando git rebase -i devel lugar. Algunos tutoriales: http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog

Lamentablemente, GitHub no es lo suficientemente inteligente como para detectar que has fusionado un RP a mano, por lo que deberás comentarlo manualmente y cerrar el problema con un enlace a la confirmación correspondiente. De forma alternativa, asegúrese de que el post de la combinación de fusión contenga el Fixed #123 .


ACTUALIZACIÓN: Kahmali Rose realizó otra actualización que permite a GitHub detectar que el PR se fusionó, casi como si se hubiera hecho clic en el malvado button Merge: asegúrese de volver a establecer la base y fusionar en lugar de seleccionar .

Si el PR es solo una confirmación, puede seleccionarla en la twig principal (o en cualquier twig en la que combine las relaciones públicas). Así por ejemplo:

 $ git checkout -b branch-for-pr master $ git pull <fork url> <pr branch name> $ git checkout master $ git cherry-pick branch-for-pr 

Alternativamente, puede volver a establecer la base de la twig PR sobre el maestro para permitir una fusión de avance rápido (que omitirá la confirmación de fusión):

 $ git checkout -b branch-for-pr master $ git pull <fork url> <pr branch name> $ git rebase master $ git checkout master $ git merge --ff-only branch-for-pr