2011-09-20 11 views
10

Digamos que tengo la siguiente situación:Git diff en la rama de tema, excluyendo las confusiones de fusión que ocurrieron mientras tanto?

B---D---F---G topic 
/ /
--A---C---E master 

Para efectos de revisión de código, me gustaría sacar un diff de cometer un a cometer G, pero sin incluir E compromete y C, que sucedió en la rama principal , y también sin incluir el compromiso F, que es un compromiso de fusión.

En otras palabras, me gustaría para generar un diff que contiene cambios de F a G y acumular dichas cambia con los cambios de la A a D.

En otros-otras palabras, quiero que el diff crítica para contener solo mis cambios de la rama de tema, sin incluir un montón de código del maestro que sucedió mientras tanto.

¿Esto es posible? Si git no puede manejar tales "agregaciones de diferencias", estaría muy agradecido si alguien puede proporcionar algunos consejos sobre cómo algún comando externo puede hacer eso (para que yo pueda intentar escribir un script de bash que podría hacer el truco).

+0

¿Qué pasa con la verificación del archivo en A y G se comprometen por separado y hacen un vim diff ??? –

+0

Necesito el diff para todos los archivos, ni un solo archivo. Además, creo que lo que sugiere también incluirá los cambios introducidos por la fusión de compromiso. –

Respuesta

4

Si no te importa lo que está en la parte de "contexto" de los diffs, entonces git diff master..topic te dará lo que quieras. Cualquier cambio introducido en C y E se considera parte de la "base" del diff, por lo que los cambios de master estarán allí en el contexto, pero solo los cambios reales realizados en su rama de tema se marcarán con + o - como cambios . Eso es lo que la gente quiere para revisiones de código.

Si por el contrario desea actuar como la fusión nunca ocurrió, que tendrá que rebasar a cabo:

git rebase --onto A master 
+2

Gracias Karl, 'git diff master..topic' hizo el truco. Resulta que tuve que fusionar maestro en tema antes de ejecutar el script diff. –

1

¿Qué hay de:

  1. tema git checkout

  2. git checkout -b temp

  3. git volver F

  4. git diff Un

A continuación, puede eliminar felizmente la rama de temperatura.

1

La respuesta de Karl es engañosa:

git diff nunca funciona en rangos adecuados (es decir, confirmaciones múltiples), solo entre dos commits!

La sintaxis de rango tiene un significado especial para git diff.

git diff E..G es siempre igual a git diff E G (y
git diff E...G es igual a git diff E G en este caso, porque E es la fusión-base entre los dos).

git diff master...topic es lo que desea en este y en el caso general: te muestra todos los cambios de la rama tema, comparándolo con la última combinación de la base (es decir, contrastándola a dominar cuando se fusionó la última vez , ignorando todos los cambios posteriores en el maestro que de todos modos no están en su rama de tema).

Nota: (¿por coincidencia) por desgracia, el efecto de x..y en git log, etc. está mejor representado por x...y en git diff y viceversa!

+1

Sí, esta es la respuesta correcta. Del manual: "git diff A ... B" es equivalente a "git diff $ (git-merge-base A B) B". – jmiserez

Cuestiones relacionadas