tag git github pull-request git-diff

git - tag - Compare versiones antiguas y nuevas de la solicitud de tracción forzada



git tag (2)

la versión antigua del PR

Puede hacerlo directamente en GitHub: vea " Encontrar un comentarista de una fuerza de empuje en GitHub "

Al hacer clic en el enlace "forzado" aparecerá una comparación de dos puntos entre las dos confirmaciones.

Respuesta original: 2016

Eso solo estaría disponible en el reflog del repositorio remoto, que incluiría el HEAD anterior de la rama empujada por la fuerza.
Dado que el repositorio remoto es un GitHub, aún puede inferir la confirmación anterior observando los eventos de inserción: consulte " ¿Github recuerda haber cometido ID? ".

El sombrero también mostrará los cambios que se han introducido en la rama base (generalmente maestro)

Más exactamente, siempre tendrás las diferencias contra un ancestro común (que incluirá confirmaciones de la base como master )

Consulte ¿Cuáles son las diferencias entre el punto doble " .. " y el punto triple " ... " en los rangos de confirmación de Git diff?

Entonces, en su caso, su rama forzada se ve así en el repositorio remoto:

x--x--x (old branch in reflog) / m--M0--M--M (master) / X--X--X (new branch forced push)

A diff old_HEAD..newHEAD incluiría las pocas M confirmaciones de la rama base, ya que forman parte de la ruta del ancestro común ( M0 ).

Por lo tanto, puede comparar una rama forzada (siempre que esté supervisando eventos de inserción y conozca la CABEZA anterior de esa rama).
Pero no se pueden comparar fácilmente dos ramas sin su ruta ancestral común.

Con frecuencia, mis colegas realizarán algunos cambios en una solicitud de extracción abierta, volverán a ajustar su rama local contra la rama base, a menudo aplastando sus cambios en confirmaciones previas también, y forzarán la presión.

¿Cómo puedo ver qué ha cambiado entre la versión anterior del PR y la nueva versión del PR?

Supongo que podría hacer un git pull y git checkout $BRANCH_NAME cuando se git checkout $BRANCH_NAME la PR, luego git fetch y luego git diff $BRANCH_NAME..origin/$BRANCH_NAME después de la actualización de la PR, pero eso también mostrará cambios que han sido introducido en la rama base (normalmente maestro) y introducido en el PR a través de una rebase. ¿Es posible eliminar ese ruido y simplemente mostrar lo que ha cambiado en la RP?


Verifique this respuesta a otra pregunta que quiera hacer algo muy similar a lo que está tratando de lograr.

Describe tu situación así:

newcommit -> the new pull request commit oldcommit -> the old pull request commit upstream -> the base branch commit the new pull request is based on

Ahora hacer esto:

git commit-tree newcommit^{tree} -p oldcommit -p upstream -m "message" git show <commit id returned by previous command>

La idea es que commit-tree oldcommit una fusión entre oldcommit y upstream produce newcommit tree y, por lo tanto, contiene exactamente el código de newcommit . No modifica su rama actual en absoluto, crea un nuevo compromiso sin cabeza y le da su ID. Esto significa que git show cada modificación como una resolución de conflicto, que es la diferencia exacta entre la nueva PR y la antigua.

Para poder hacer eso, necesita tener el PR anterior en su repositorio de git en algún lugar (si se ha realizado un impulso forzado, el historial de git se ha reescrito y no se puede recuperar a menos que lo tenga en su PC o tenga acceso a El servidor de reencuentro). Verifique la respuesta de VonC para más detalles sobre esto.

Asumiendo:

  • rama base: master
  • tienes localmente la antigua rama de relaciones públicas: $BRANCH_NAME
  • El nuevo PR en una sucursal remota: origin/$BRANCH_NAME

Puedes hacer así:

# fetch locally upstream changes (origin/$BRANCH_NAME) git fetch # produce the fake merge commit git commit-tree origin/$BRANCH_NAME^{tree} / -p $BRANCH_NAME / -p `git merge-base master origin/$BRANCH_NAME` / -m "message" # see "fake" conflict resolution = difference between the two PR git show <commit id returned by previous command>

git merge-base se usa para encontrar el ancestro común entre dos ramas, en este caso para encontrar el commit en el que se basa el nuevo PR en la base, si lo prefiere, puede escribir el ID de commit directamente.