git: diff entre archivo en repositorio local y origen

190

Quiero encontrar las diferencias entre un archivo que tengo en mi repositorio local y lo que hay en el archivo origin master.

Sé que hay git diff, sin embargo, solo quiero aislarlo en este archivo en particular.

Por simplicidad, digamos que el archivo se llama file1.txty tiene una ruta de archivo local = [local_path]y en el origen tiene filepath = [remote-path].

¿Cuál sería el comando git que necesito escribir?

EDITAR: Gracias a todos por su aporte, ha sido muy perspicaz. Para aquellos que usan Eclipse (que soy y debería haber dicho antes), descubrí que puede hacer clic con el botón derecho -> Comparar con -> Rama, etiqueta o referencia -> seleccionar la versión adecuada y listo.

BuscandoAlfa
fuente
¿Es [ruta remota] diferente de [ruta local]?
Code-Apprentice el
Acabo de notar tu edición. Siéntase libre de publicarlo como respuesta.
Code-Apprentice
¿Qué llamas "maestro de origen"?
el método eclipse egit es bueno
user1169587

Respuestas:

251

Si [remote-path]y [local-path]son lo mismo, puedes hacer

$ git fetch origin master
$ git diff origin/master -- [local-path]

Nota 1: El segundo comando anterior se comparará con la rama de seguimiento remoto almacenada localmente. Se requiere el comando fetch para actualizar la rama de seguimiento remoto para que esté sincronizada con el contenido del servidor remoto. Alternativamente, solo puedes hacer

$ git diff master:<path-or-file-name>

Nota 2: master se puede reemplazar en los ejemplos anteriores con cualquier nombre de sucursal

Aprendiz de código
fuente
15
E incluso puede omitir la ruta local si ese es el directorio actual.
Tony Wall
19
Para aquellos extremadamente novatos como yo, aquí hay un ejemplo:git diff master:README.md -- README.md
fabriciorissetto
24
En realidad, aquí hay un mejor ejemplo:git diff origin/master -- README.md
JDiMatteo
No podría hacerlo en su git fetch masterlugar git fetch .(origen / maestro tampoco funcionó) Pero el resto funcionó bien.
robar el
1
@rob Eres el primero en señalar mi error. Debería ser git fetch **origin**.
Code-Apprentice
114

Para ver las diferencias que van del archivo remoto al archivo local:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Para ver las diferencias en la otra dirección:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

Básicamente, puede diferenciar dos archivos en cualquier lugar utilizando esta notación:

git diff ref1:path/to/file1 ref2:path/to/file2

Como de costumbre, ref1y ref2podrían ser nombres de sucursal, nombre remoto / nombre de sucursal, confirmar SHA, etc.

janos
fuente
17

Para comparar el repositorio local con el remoto, simplemente use la siguiente sintaxis:

git diff @{upstream}
Ratna Halder
fuente
2

Para eso escribí un script bash:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

En la secuencia de comandos anterior, busco la rama principal remota (no es necesariamente su rama maestra CUALQUIER rama) FETCH_HEAD, luego hago una lista de mi archivo modificado solo y comparo los archivos modificados git difftool.

Hay muchos difftoolcompatibles con git, configuré Meld Diff Viewerpara una buena comparación de GUI.
De la secuencia de comandos anterior, tengo conocimiento previo de los cambios realizados por otros equipos en el mismo archivo, antes de seguir las etapas de git untrack-->staged-->commitque me ayudan a evitar una resolución innecesaria, fusionar conflictos con el equipo remoto o hacer una nueva sucursal local y comparar y fusionar en la sucursal principal.

adg
fuente
1

Intenté un par de soluciones, pero creo que es fácil de esta manera (estás en la carpeta local):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Luego comparaste git local y el último número de confirmación de git remoto ...

animati
fuente
0

A continuación se muestra la respuesta completa a la pregunta original que hablaba sobre una posible ruta diferente en local y remoto

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Suponiendo que la ruta local es docs / file1.txt y la ruta remota es docs2 / file1.txt, use git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Esto está adaptado de la página de ayuda de GitHub aquí y la respuesta de Code-Apprentice arriba

ng10
fuente