2012-02-15 12 views
6

que restablecen una rama bastante antiguo tema en maestro. Debido a que hubo bastantes conflictos durante la rebase, me gustaría comparar la antigua rama de tema con la rebaseada, para asegurarme de que no eliminé accidentalmente o arruiné ninguno de los cambios en el tema. Lo más cerca que he estado de esto es difiriendo los resultados de git diff master...topic y git diff master...topic-rebased. Este tipo de trabajo funciona, pero hay mucho ruido en la diferencia final de los cambios en el código de contexto, los números de línea, los hashes de confirmación, etc., además de que no es una solución muy sólida. ¿Hay alguna forma más fácil de hacer esto?Compare git branch con la rama porcentualizada

+0

Dependiendo de la complejidad versos importancia, podría intentar rebase de nuevo y comparar ese resultado a 'tema-rebased' ... (Esto está trabajando en el supuesto de que usted será más cuidadosa en diferentes lugares de la segunda vez .) De lo contrario, la opción -U en 'git diff' puede reducir el contexto y podría tratar de agrupar los encabezados de trozos que contienen números de línea y valores hash de blob. – antak

+0

Una alternativa interesante es que rebase (por ejemplo 'master..topic-rebased') de nuevo en combinación * *-base (o donde quiera' topic' viene) y comparar (diff) esta a 'topic'. Esto actuaría como una prueba matemática y cualquier deltas que veas aquí deberían ser los de importancia. El rebase aquí podría hacerse con 'cherry-pick' o' rebase upstream topic ~ 0 --onto new_base'.No conozco su nivel de conocimiento, pero en este caso "volver a basarlo" no debería involucrar a sus sucursales actuales debido a que espero que se haga en un estado separado o en una sucursal desechable. – antak

+0

rebase de nuevo no funcionará ya que los otros conflictos resultarán. –

Respuesta

4

Probablemente querrá diff los cambios efectivos (parches) producidos por cada uno:

diff <(git log master..topic -p) <(git log master..old-place-of-topic -p) 

Esto eliminaría efectivamente los cambios introducidos en el maestro.

+0

Corrígeme si me equivoco, pero esto también mostraría todos los cambios de 'git merge-base master topic' a' git merge-base master topic-rebased', que no quiero. Solo quiero ver cambios específicos a la rama de tema. Además, no es necesario volver a generar el registro, todavía tengo disponible el tema y el tema. – Ryan

+0

editado. Ahora entiendo lo que buscas. –

+0

Agradezco la respuesta, pero esto tiene exactamente el mismo resultado y problemas (suponiendo que haya querido decir 'maestro ... viejo-lugar-de-tema') como lo que hago actualmente (mencionado en la pregunta). – Ryan

0

Si no se preocupan por la historia de confirmación desde su sucursal tema que puedes hacer de nuevo el rebase y añadir la bandera --squash. Esto le dará una confirmación única en la parte superior de su rama principal donde puede ir a través de los archivos modificados archivo por archivo. También agregaría la bandera --no-commit a la rebase para poder revisar los cambios antes de confirmar la git rebase.

git checkout master 
git rebase --squash --no-commit topic 
//review changes with your favourite git tool 
git commit 

Si no desea volver a hacer el rebase una herramientas externas de diferencias como KDiff3 podrían ayudarle.

+1

No desea volver a establecer el maestro en el tema. –

+0

Eso es verdad. Tuve que volver a leer mi respuesta, pero no puedo ver dónde escribí que el maestro debería volver a basarse en el tema. – MikaelHalen

+0

No quiero revisar los cambios que ha hecho el tema, quiero revisar los cambios que hice (como resultado de conflictos) durante la rebase. – Ryan

4

Estaba luchando con este mismo problema y se me ocurrieron ideas similares a las de Ryan y Adam Dymitruk y las encontré poco satisfactorias: comparar la diferencia final es complicado y tampoco muestra dónde se introdujo el "error" si lo encuentras.

Mi flujo de trabajo de rebase de corriente incluye la comparación de cada porcentualizada cometen con un original, por lo que puede detectar y corregir errores potenciales como aparecen y no tener que volver a hacer el rebase. Estoy usando el siguiente par de alias 'git para facilitar esto:

rc = !git diff -w $(cat .git/rebase-merge/stopped-sha) > .git/rebase-merge/current-diff 
rd = !git diff -w $(cat .git/rebase-merge/stopped-sha) | diff --suppress-common-lines .git/rebase-merge/current-diff - | cut -b 1-2 --complement | less 

git rc almacena el diff entre HEAD la última revisión de la rama que se está porcentualizada. Después de reproducir la siguiente confirmación, git rd compara esta diferencia almacenada con la diferencia entre el nuevo HEAD y la próxima confirmación en la rama que se vuelve a establecer. Por lo tanto, esto muestra que solo se presenta la diferencia ("error") al reproducir este último compromiso.

Después de inspeccionar el diff, llame git rc para actualizar el diff almacenado y continuar el rebase.

En lugar de llamar manualmente a git rc y git rd, puede incluso agregarlos a su git-rebase-todo para que se llamen automáticamente después de que se vuelva a ejecutar cada confirmación.