¿Cómo comparar una sucursal local de git con su sucursal remota?

1053

¿Cómo puedo ver diffentre una sucursal local y una sucursal remota?

mrblah
fuente
55
Estas preguntas se hicieron nuevamente más tarde. Tiene una buena respuesta: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
ejemplo: git diff master origin / master (donde master es una rama master local y origin / master es una rama master remota).
Estiércol
@klyngbaek, esta respuesta en particular ;-)
Originalmente estaba intentando lo git diff HEAD origin/HEADque parece apuntar a una rama remota diferente de la que pretendía. Usar el nombre completo de la sucursal funciona como se esperaba.
Deanna

Respuestas:

595

Para actualizar las ramas de seguimiento remoto, git fetchprimero debe escribir y luego:

git diff <masterbranch_path> <remotebranch_path>

Puede git branch -aenumerar todas las sucursales (locales y remotas) y luego elegir el nombre de la sucursal de la lista (simplemente eliminar remotes/del nombre de la sucursal remota.

Ejemplo: git diff master origin/master(donde "maestro" es la rama maestra local y "origen / maestro" es una rama remota, a saber, origen y maestro).

meder omuraliev
fuente
23
Es posible que necesite una búsqueda antes ( git fetch)
Houssem Badri
Eso solo muestra un vistazo a los cambios en bash, ¿hay alguna forma de abrir todos los cambios en un IDE como el código VS?
Harsh Phoujdar
@ Harsh Phoujdar Agregue el siguiente código en su archivo .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseAsegúrese de que su ruta al archivo code.exe sea correcta.
Aman
1307
git diff <local branch> <remote>/<remote branch>

Por ejemplo git diff master origin/master, ogit diff featureA origin/next

Por supuesto, para tener dicha rama de seguimiento remoto,git fetch primero debe hacerlo ; y necesita que tenga información actualizada sobre las sucursales en el repositorio remoto.

Jakub Narębski
fuente
98
para ser más exactos: git diff <sucursal local> <remote> / <sucursal remota>
finalmente el
38
Por lo general, hago git diff <remote>/<remote branch> <local branch>para ver qué hará mi empuje al repositorio remoto.
Michał Tatarynowicz
76
Incluso más corto git diff origines suficiente si solo se compara con su rama ascendente.
Ludder
12
agregue git fetchal principio, causa problemas a los novatos como yo
Saif
1
Oye, ¿no debería ser git diff <remote>/<remote branch> <local branch>? De lo contrario, obtengo las adiciones y eliminaciones activadas en mi computadora (git versión 2.7.0.windows.2)
Martín Coll
183

Primer tipo

git branch -a

para obtener la lista de sucursales disponibles. En la salida puede ver algo como

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Luego muestra la diferencia

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
fuente
1
¿No debería ser ...más que ..?
Eliran Malka
99
Definitivamente habría elegido esto como la respuesta. Siguiendo sus instrucciones, pude ver las diferencias entre una sucursal local y una sucursal remota. ¡Gracias!
Tass
1
Normalmente hago git log origin/my_branch..lo que tomaré HEADcomo referencia local, que es principalmente lo que quieres decir.
Rudie
44
+1 para la mejor respuesta en mi humilde opinión. Sería digno de +2 si menciona "buscar" para sincronizar la imagen "remota" de la fuente clonada. El paso de resumen de estadísticas / color es particularmente útil.
bvj
3
Gracias por la única respuesta que finalmente funcionó de las siete u ocho "respuestas" que resultaron en poco más que fatal: bad revisiono fatal: ambiguous argument. Todo lo que quería era ver la diferencia en el mismo archivo desde otra rama, ¿era demasiado pedir? Si, si lo fue. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>funciona muy bien en git 1.8.3.1
Steve Bonds
144

Si se encuentra en una rama determinada y desea compararla con una rama aguas arriba que está rastreando, use

git diff @{upstream}

si su upstream no está configurado (comúnmente el caso, gracias Arijoon en los comentarios)

git diff @{push}

Cortesía de esta respuesta , la documentación de git para especificar revisiones tiene:

<branchname>@{upstream}, por ejemplo master@{upstream}, @{u}
El sufijo @{upstream}de un nombre de rama (forma abreviada <branchname>@{u}) se refiere a la rama que la rama especificada por branchnameestá configurada para construir encima (configurada con branch.<name>.remotey branch.<name>.merge). Un valor branchnamepredeterminado que falta es el actual.

Andrew Grimm
fuente
10
Muy buena respuesta solo falta una pequeña parte. Cambia la línea a git diff @ @{upstream}. El extra @es HEAD, que es donde estás ahora, por lo que estás comparando HEADcon el flujo ascendente que tu rama está rastreando. Puede usar en @{push}lugar de aguas arriba para obtener diferencias entre la rama a la que está configurado para empujar
Arijoon el
3
mejor respuesta, no requiere buscar el control remoto. necesita más votos a favor!
jcomeau_ictx
3
En los crustáceos llegué resultado: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Tuve que usar git diff @\{upstream\}en su lugar. 😥
Landon Kuhn
git fetchPrimero debe hacerlo , de lo contrario esto no hace nada, no muestra salida; probado eliminando un archivo en el origen del repositorio y ejecutó este comando localmente. ... funciona solo después de la búsqueda.
Además, como la respuesta dada incluye cualquier cambio local. a veces esto es deseado, otras veces, no.
Deanna
44

Entiendo mucho mejor la salida de:

git diff <remote-tracking branch> <local branch>

eso me muestra lo que se eliminará y lo que se agregará si presiono la rama local. Por supuesto, es lo mismo, solo lo inverso, pero para mí es más legible y me siento más cómodo mirando lo que va a suceder.

manfer
fuente
Obtengo exactamente el mismo resultado con: git diff <rama local> <rama de seguimiento remoto> o git diff <rama de seguimiento remoto> <rama local>
usuario2928048
32

La manera fácil:

git fetch
git log -p HEAD..FETCH_HEAD

Esto primero buscará los cambios desde su control remoto predeterminado (origen). Esto se creará automáticamente cuando clones un repositorio. También puede ser explícita: git fetch origin master.

Luego, git log se usa para comparar su rama actual con la que acaba de obtener. (La -popción (generar parche) es lo que muestra las diferencias ).

Brent Fausto
fuente
14

Así es como lo hago.

#To update your local.
git fetch --all

esto buscará todo desde el control remoto, por lo que cuando verifique la diferencia, comparará la diferencia con la rama remota.

#to list all branches
git branch -a

El comando anterior mostrará todas las ramas.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Ahora, puede verificar la diferencia de la siguiente manera.

git diff origin/<branch_name>

esto comparará su sucursal local con la sucursal remota

Sahith Vibudhi
fuente
2
git fetch: todos buscarán todo, desde TODOS los controles remotos. git fetch debería ser suficiente si usa el origen remoto predeterminado.
Christophe Keller
Es sorprendente que después de 8 años, recibamos una respuesta completa que explica adecuadamente los pasos. Podemos hacer una ayuda para obtener los comandos. SO se trata de entenderlos.
gdbj
11

Deje que su rama de trabajo es el desarrollo y quieren diferenciar entre la rama de desarrollo local y remota rama de desarrollo, ese caso, la sintaxis debe ser como git diff remotes/origin/development..development
o

git fetch origin git diff origin/development

Ratna Halder
fuente
11

tl; dr :git diff <local branch> <remote branch>

Cuando uso git en el caparazón, me gusta orientarme primero mirando alrededor. Aquí hay un comando para mostrar todas las ramas

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Aquí tengo dos ramas locales ( my-branchy master) y 4 a distancia ( some-branch, some-other-branch, master, ymy-branch ).

Además, el asterisco al lado de my-branchindica el hecho de que actualmente estoy en esa rama (también lo sabrías al usar el comando git statusque generaría:) On branch my-branch..

Nota: las ramas remotas en el shell git bash se muestran en rojo mientras que las locales se muestran en verde.

Si solo desea mostrar sucursales remotas :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Para mostrar solo las sucursales locales, puede tener la tentación de usar, git branch -lpero ese es un comando completamente diferente. Para mostrar sucursales locales, use git branchsin opciones

$ git branch
* my-branch 
  master

Para completar una revisión de las opciones de bifurcación básicas, existe lo --listcontrario de lo que podría esperar para permitir el filtrado . Úselo con un patrón como este:

$ git branch --list 'my*'
* my-branch

También puede combinarse --listcon las opciones -ay -rasegurarse de adaptar su patrón en consecuencia ( recuerde: las ramas remotas comienzan con "controles remotos" ). Ejemplo:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Documentos: https://git-scm.com/docs/git-branch

Ahora puede comparar dos ramas de todas las disponibles (también puede comparar dos locales o dos controles remotos).

Aquí estoy comparando lo local con lo remoto my-branch, están sincronizados para que no obtenga ninguna salida:

$ git diff my-branch remotes/origin/my-branch

Nota: debe dar los nombres completos de las ramas sin comillas.

También puedo comparar lo local my-branchcon lo remoto master. Aquí obtengo algo de salida porque el control remoto my-branchno se ha fusionado en la rama maestra.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
usuario2314737
fuente
11

Si desea ver la diferencia como solo cambiaron los nombres de los archivos, use: de lo contrario

git diff --name-status <remote-branch> <local-branch>,

esto mostrará todas las diferencias entre las dos ramas:

git diff <remote-branch> <local-branch>

Sarvesh Kesharwani
fuente
9

Aquí hay una respuesta abreviada si está comparando su rama actual y algo que desea git pull.

git fetch
git diff FETCH_HEAD

El primer comando determinará qué rama remota corresponde a su rama actual. Un artefacto de ese cálculo en la FETCH_HEADreferencia. Luego, el segundo comando usa esa comparación de referencia frente a la que tiene su rama actual.

William Entriken
fuente
6

Sé que ya hay varias respuestas a esta pregunta, pero recibí un error extraño al intentar la mayoría de ellas.

En mi caso, tengo un segundo control remoto llamado herokuque no es el originy porque no estaba sincronizado, recibí este error al intentar ejecutar git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

o esto al intentar el otro enfoque git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

La solución mencionaba explícitamente el nombre remoto git fetchantes de ejecutar git diff, en mi caso:

$ git fetch heroku
$ git diff master heroku/master

Espero que ayude a otros con este mismo problema.

fagiani
fuente
4
git difftool <commit> .

Esto comparará la confirmación que desea con sus archivos locales. No olvides el punto al final (para local).

Por ejemplo, para comparar sus archivos locales con alguna confirmación:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(y no necesita git fetch, a menos que sea necesario comparar con nuevos commits)

Izik
fuente
Creo que es interesante porque es una comparación que puedo hacer antes de comprometerme y presionar. Lamentablemente en Windows vimdiff para mostrar es feo; ¿Hay alguna forma de usar algo mejor, como notepad ++?
Stefano Scarpanti
3

Ejemplo

git diff 'master' 'testlocalBranch'

Si está utilizando un editor como Webstorm, puede hacer clic con el botón derecho en el archivo, seleccionar comparar con la rama y escribir / seleccionar su rama.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Kurkula
fuente
2
¿Qué agrega esto a la respuesta aceptada de 7.5 años con más de 170 votos a favor?
Mark Rotteveel
Esto es para mrblah el usuario o para usuarios similares que agregaron comentarios para la respuesta aceptada. La sintaxis es diferente de un ejemplo y el ejemplo ayuda más desde el punto de vista del principiante.
Kurkula
2
En ese caso, debería estar en comentario de esa respuesta.
rachit
1

En VS 2019, solo haga FETCH No extraiga el código.

Esto es lo que hice. Se agrega a continuación en el archivo .gitconfig para que pueda usar Beyond Compare

File location: C:\Users\[username]\.gitconfig

Agregado a continuación

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Abra el símbolo del sistema y vaya al directorio de trabajo. Di a continuación para comparar la sucursal de DEV local con la sucursal de DEV remota

git difftool dev origin/dev --dir-diff

Esto abrirá Beyond Compare y abrirá directorios que tienen archivos diferentes. Si no hay cambios, Beyond Compare no se iniciará.

Ziggler
fuente
0

Me pregunto si hay algún cambio en mi rama maestra ...

  1. En primer lugar, debe cambiar su rama (si ya está debajo de esta rama, ¡no necesita hacerlo!)

git checkout master

  1. Puede ver qué archivo ha sido modificado bajo su rama maestra por este comando

estado git

  1. Lista las ramas

git branch -a


  • controles remotos maestros / origen / maestro
  1. Encuentra las diferencias

origen / maestro git diff

Ali Atakan
fuente
0

Preparar

git config alias.udiff 'diff @{u}'

Diferenciando HEAD con HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Diferenciando con una rama remota arbitraria

Esto responde la pregunta en su encabezado ("su control remoto"); si quiere diferenciar "un control remoto" (que no está configurado como el flujo ascendente para la rama), debe apuntarlo directamente. Puede ver todas las ramas remotas con lo siguiente:

git branch -r

Puede ver todos los controles remotos configurados con lo siguiente:

git remote show

Puede ver la configuración de sucursal / seguimiento para un único control remoto (por ejemplo, origen) de la siguiente manera:

git remote show origin

Una vez que determine la rama de origen apropiada, simplemente haga una diferencia normal :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
fuente
0

Esto es bastante simple Puedes usar:git diff remote/my_topic_branch my_topic_branch

¿Dónde my_topic_branchestá tu rama temática?

Elisha Senoo
fuente
0

Digamos que ya ha configurado su origincomo repositorio remoto. Entonces,

git diff <local branch> <origin>/<remote branch name>

Tirtha
fuente
0

tratar:

git diff origin HEAD

Suponiendo que desea diferenciar sus sucursales locales actuales HEADcontra el origen. Y suponiendo que esté en la sucursal local. :)

Sourabh Pandit
fuente
-3

Si usa TortoiseGit (proporciona GUI para Git), puede hacer clic derecho en su carpeta de repositorio de Git y luego hacer clic Git Sync.

Puede seleccionar sus sucursales para comparar si no está seleccionado. Entonces puedes ver las diferencias confirmar. También puede hacer clic con el botón derecho en cualquier confirmación Compare with previous revisionpara ver las diferencias una al lado de la otra.tortuga git sync para comparar sucursal remota y local

Halil İbrahim Oymacı
fuente