¿Cómo comparar archivos de dos ramas diferentes?

1538

Tengo un script que funciona bien en una rama y está roto en otra. Quiero ver las dos versiones una al lado de la otra y ver qué es diferente. ¿Hay alguna forma de hacer esto?

Para que quede claro, no estoy buscando una herramienta de comparación (uso Beyond Compare). Estoy buscando un comando git diff que me permita comparar la versión maestra con mi versión de rama actual para ver qué ha cambiado. No estoy en medio de una fusión ni nada. Solo quiero decir algo como

git diff mybranch/myfile.cs master/myfile.cs
Micah
fuente

Respuestas:

2208

git diff puede mostrarle la diferencia entre dos confirmaciones:

git diff mybranch master -- myfile.cs

O equivalente:

git diff mybranch..master -- myfile.cs

Usando la última sintaxis, si cualquiera de los dos lados HEADse puede omitir (por ejemplo, se master..compara mastercon HEAD).

También te puede interesar mybranch...master(de git diffdocumentos ):

Este formulario es para ver los cambios en la rama que contiene y hasta el segundo <commit>, comenzando en un antepasado común de ambos <commit>. git diff A...Bes equivalente a git diff $(git-merge-base A B) B.

En otras palabras, esto dará una diferencia de cambios en masterya que divergió de mybranch(pero sin nuevos cambios desde entonces en mybranch).


En todos los casos, el --separador antes del nombre del archivo indica el final de los indicadores de la línea de comando. Esto es opcional a menos que Git se confunda si el argumento se refiere a un commit o un archivo, pero incluirlo no es un mal hábito. Consulte https://stackoverflow.com/a/13321491/54249 para ver algunos ejemplos.


Se pueden pasar los mismos argumentos git difftoolsi tiene uno configurado.

dahlbyk
fuente
44
Y si ninguna de las dos versiones que desea comparar es el árbol de trabajo, puede usarla git diff branch1 branch2 myfile.cs. (Esto --ya no debería ser necesario, ya que solo puede tomar hasta dos argumentos de revisión.)
Cascabel el
8
He probado todas las versiones de esto y no pasa nada. Tengo mi difftool configurado (funciona para fusionar). Tengo un archivo llamado bd.ps1. Cada versión del comando que escribo no hace nada. Ni siquiera da un error. WTH!?!?!
Micah el
3
@Micah: ¿Lo estás intentando con diff simple también? ¿Está escribiendo correctamente la ruta relativa al directorio actual? (Silenciosamente no mostrará diferencias si el archivo no existe, y usted usa el --error común y fácil de hacer.)
Cascabel
55
Esto no funcionó para mí a menos que incluyera la ruta completa al archivo, como se muestra en git diff --name-status branch1..branch2(probablemente obvio, pero pensé en mencionarlo en caso de que alguien más tenga el mismo problema que yo).
hBrent
44
El orden de mybranch y master también es importante. El archivo en la primera rama se mostrará con los prefijos '-', el archivo en la segunda rama se mostrará con los prefijos '+'.
timbo
414

Puedes hacerlo: git diff branch1:path/to/file branch2:path/to/file

Si tiene difftool configurado, entonces también puede: git difftool branch1:path/to/file branch2:path/to/file

Pregunta relacionada: ¿Cómo veo la salida de git diff con el programa visual diff

Tim Henigan
fuente
44
El uso de los dos puntos no es realmente una gran manera, significa que está haciendo referencia a los archivos a través de los objetos del árbol, por lo que debe escribir la ruta completa, en lugar de en relación con su directorio actual.
Cascabel el
13
@Jefromi, esto puede haber cambiado en una versión más reciente, pero al menos ahora puede usar rutas relativas (por ejemplo branch1:./file). Esto también es útil si el archivo está en una ubicación separada entre las ramas (por ejemplo git diff branch1:old/path/to/file branch2:new/path/to/file).
redbmk
44
@redbmk Sí, ¡eso fue en algún momento entre 2010 y ahora! Aún así, si es el mismo archivo en ambas ramas, no es necesario hacerlo así, simplemente git diff branch1 branch2 path/to/file.
Cascabel
3
@jefromi genial, no estaba seguro de la línea de tiempo cuando se agregó eso. Sí, me gustaría normalmente usan la sintaxis usted ha mencionado, pero la respuesta de Tim me ayudó a entender cómo comparar archivos con diferentes trayectorias, a pesar de que en realidad no es lo que la pregunta estaba pidiendo
redbmk
1
Si bien me encanta esta idea, no puedo hacer que esta sintaxis funcione o encontrar alguna mención de ella en los documentos de git diff. ¿Qué me estoy perdiendo? ¡Gracias!
yoyo
160

Sintaxis más moderna:

git diff ..master path/to/file

El prefijo de doble punto significa "del directorio de trabajo actual a". También puede decir:

  • master.., es decir, el reverso de lo anterior. Esto es lo mismo que master.
  • mybranch..master, haciendo referencia explícita a un estado que no sea el árbol de trabajo actual.
  • v2.0.1..master, es decir, hacer referencia a una etiqueta.
  • [refspec]..[refspec], básicamente cualquier cosa identificable como un estado de código para git.
Joe Atzberger
fuente
33

Hay muchas formas de comparar archivos de dos ramas diferentes:

  • Opción 1: si desea comparar el archivo de una rama específica a otra rama específica:

    git diff branch1name branch2name path/to/file
    

    Ejemplo:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    En este ejemplo, está comparando el archivo en la rama "mybranch" con el archivo en la rama "mysecondbranch".

  • Opción 2: forma simple:

     git diff branch1:file branch2:file
    

    Ejemplo:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Este ejemplo es similar a la opción 1.

  • Opción 3: si desea comparar su directorio de trabajo actual con alguna rama:

    git diff ..someBranch path/to/file
    

    Ejemplo:

    git diff ..master myfile.cs
    

    En este ejemplo, está comparando el archivo de su rama real con el archivo de la rama maestra.

Javier C.
fuente
12

Yo simplemente hago git diff branch1 branch2 path/to/file

Esto comprueba las diferencias entre los archivos. Los cambios en branch1estarían en rojo. Los cambios branch2serían en verde.

Se supone que branch1es el pasado y branch2el futuro. Puede revertir esto invirtiendo el orden de las ramas en el diff:git diff branch2 branch1

iGbanam
fuente
¿Qué versión de git diff puede hacer esto? No parece ser compatible con la versión que estoy ejecutando (2..9.2.windows.1).
Vince Bowdren
9

Si desea hacer una diferencia con la rama actual, puede omitirla y usar:

git diff $BRANCH -- path/to/file

de esta manera diferirá de la rama actual a la rama referenciada ( $BRANCH).

Paulo Fidalgo
fuente
5

De acuerdo con la respuesta sugerida por @dahlbyk. Si desea que el diff se escriba en un archivo diff para revisiones de código, use el siguiente comando.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
fuente
2

En mi caso, uso el siguiente comando:

git diff <branch name> -- <path + file name>

Este comando puede ayudarlo a comparar el mismo archivo en dos ramas diferentes

SKT
fuente
1

La mejor manera de hacerlo es mediante el uso git diffde la siguiente manera: git diff <source_branch> <target_branch> -- file_path

Verificará la diferencia entre los archivos en esas ramas. Eche un vistazo a este artículo para obtener más información sobre los comandos git y cómo funcionan.

Nesha Zoric
fuente
1

Use commit hashes como este:

git diff <hash1> <hash2> <filename>

donde hash1 puede ser cualquier commit de cualquier rama, lo mismo para hash2 .

prometeu
fuente
1

Hay dos escenarios para comparar archivos:

Escenario 1: Comparar archivos en sucursales remotas (ambas ramas deben existir en el repositorio remoto)

Escenario 2: compare los archivos locales (en la copia del área de trabajo local) con los archivos del repositorio remoto.

La lógica es simple. Si proporciona dos nombres de rama para diferenciar, siempre comparará las ramas remotas, y si proporciona solo un nombre de rama, siempre comparará su copia de trabajo local con el repositorio remoto (el que proporcionó). Puede usar el rango para proporcionar repositorios remotos.

Por ejemplo, pagar una sucursal

git checkout branch1
git diff branch2 [filename]

en este caso, si proporciona el nombre del archivo, comparará su copia local del nombre del archivo con la rama remota llamada " rama2 ".

git diff branch1 branch2 [filename]

en este caso, comparará el nombre de archivo de las ramas remotas llamadas " branch1 " versus " branch2 "

git diff ..branch2 [filename]

en este caso también, comparará el nombre de archivo de las ramas remotas llamadas " branch1 " versus " branch2 ". Entonces, es lo mismo que arriba. Sin embargo, si acaba de crear una rama de otra rama, diga "maestro" y su rama actual no existe en el repositorio remoto, comparará " maestro " remoto con " rama2 " remota .

Espero que sea útil.

Dharmender Rawat
fuente
0

Para comparar dos archivos en git bash, debe usar el comando:

git diff <Branch name>..master -- Filename.extension   

Este comando mostrará la diferencia entre los dos archivos en la propia bash.

Rishav_SO
fuente