Come confrontare un ramo git locale con il suo ramo remoto?


1052

Come posso vedere difftra un ramo locale e un ramo remoto?


5
Questa domanda è stata posta di nuovo più tardi. Ha una bella risposta: stackoverflow.com/questions/11935633/...
rustybeanstalk

3
esempio: git diff master origine / master (dove master è il ramo master locale e origin / master è il ramo master remoto).
Dung

@klyngbaek, questa risposta in particolare ;-)

Inizialmente stavo provando git diff HEAD origin/HEADche sembra indicare un ramo remoto diverso da quello che intendevo. L'uso del nome completo del ramo funziona come previsto.
Deanna,

Risposte:


594

Per aggiornare i rami di tracciamento remoto, devi git fetchprima digitare e poi:

git diff <masterbranch_path> <remotebranch_path>

Puoi git branch -aelencare tutti i rami (locali e remoti) quindi scegliere il nome del ramo dall'elenco (basta rimuoverlo remotes/dal nome del ramo remoto.

Esempio: git diff master origin/master(dove "master" è il ramo master locale e "origin / master" è un ramo remoto, ovvero origine e master).


23
Potrebbe aver bisogno di un prelievo prima ( git fetch)
Houssem Badri,

Ciò mostra solo un'anticipazione delle modifiche in bash, c'è un modo per aprire tutte le modifiche in un IDE come il codice VS?
Harsh Phoujdar

@Harsh Phoujdar Aggiungi il codice seguente nel tuo file .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 = falseAssicurati che il tuo percorso al file code.exe sia corretto.
Aman

1307
git diff <local branch> <remote>/<remote branch>

Ad esempio git diff master origin/master, oppuregit diff featureA origin/next

Ovviamente per avere detto ramo di localizzazione remota devi git fetchprima; e ne hai bisogno per avere informazioni aggiornate sulle filiali nel repository remoto.


98
per essere più precisi: git diff <ramo locale> <remote> / <ramo remoto>
nalply

38
Di solito faccio git diff <remote>/<remote branch> <local branch>per vedere cosa farà la mia spinta al repository remoto.
Michał Tatarynowicz,

76
Anche il più breve git diff originè sufficiente se si confronta con il ramo a monte.
Ludder,

12
si prega di aggiungere git fetchall'inizio, causa problemi ai principianti come me
Saif

1
Ehi, non dovrebbe essere git diff <remote>/<remote branch> <local branch>? Altrimenti, ricevo le aggiunte e le eliminazioni attivate sul mio computer (versione git 2.7.0.windows.2)
Martín Coll

183

Primo tipo

git branch -a

per ottenere l'elenco dei rami disponibili. Sull'output potresti vedere qualcosa di simile

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

Quindi mostra il diff

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
non dovrebbe essere ...piuttosto che ..?
Eliran Malka

9
Avrei sicuramente scelto questa come risposta. Seguendo le tue indicazioni, sono stato in grado di visualizzare le differenze tra un ramo locale e un ramo remoto. Grazie!
Tass,

1
Di solito faccio quello git log origin/my_branch..che prenderà HEADcome riferimento locale, che è principalmente quello che vuoi dire.
Rudie,

4
+1 per la migliore risposta a mio modesto parere. Sarebbe degno di +2 se hai menzionato "fetch" per sincronizzare l'immagine "remota" della sorgente clonata. Il passaggio della panoramica stat / color è particolarmente utile.
bvj,

3
Grazie per l'unica risposta che alla fine ha risolto le sette o otto "risposte" che hanno prodotto poco più di fatal: bad revisiono fatal: ambiguous argument. Tutto quello che volevo era vedere il diff sullo stesso file da un altro ramo, era chiedere troppo? Sì, sì lo era. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>funziona alla grande su git 1.8.3.1
Steve Bonds,

144

Se ti trovi in ​​un determinato ramo e desideri confrontarlo con un ramo a monte che stai monitorando, utilizza

git diff @{upstream}

se il tuo upstream non è impostato (comunemente il caso, grazie Arijoon nei commenti)

git diff @{push}

Per gentile concessione di questa risposta , la documentazione git per specificare le revisioni ha:

<branchname>@{upstream}, ad esempio master@{upstream}, @{u}
il suffisso @{upstream}per un nome di ramo (forma abbreviata <branchname>@{u}) si riferisce al ramo che il ramo specificato da branchnameè impostato per costruire sopra (configurato con branch.<name>.remotee branch.<name>.merge). Un branchnamevalore predefinito mancante a quello corrente.


10
Ottima risposta manca solo una piccola parte. Cambia la linea in git diff @ @{upstream}. Il extra @è HEAD, che è dove sei ora, quindi stai confrontando HEADcon l'upstream che sta monitorando il tuo ramo. Puoi usare @{push}invece di upstream per ottenere diff tra il ramo che sei pronto a spingere
Arijoon

3
migliore risposta, non richiede il recupero del telecomando. ha bisogno di più voti!
jcomeau_ictx,

3
In crostacei ho ottenuto risultato: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Dovevo usare git diff @\{upstream\}invece. 😥
Landon Kuhn,

Devi git fetchprima, altrimenti questo non fa nulla, non mostra alcun output; testato eliminando un file nell'origine repository ed eseguito questo comando localmente. .. funziona solo dopo il recupero.

Inoltre, poiché la risposta fornita include eventuali modifiche locali. a volte questo è desiderato, altre volte no.
Deanna,

44

Capisco molto meglio l'output di:

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

ciò mi mostra cosa verrà eliminato e cosa verrà aggiunto se spingo il ramo locale. Ovviamente è lo stesso, proprio il contrario, ma per me è più leggibile e mi sento più a mio agio guardando cosa sta per succedere.


Ottengo esattamente lo stesso risultato con: git diff <ramo locale> <ramo di tracciamento remoto> o git diff <ramo di tracciamento remoto> <ramo locale>
user2928048

32

Il modo semplice:

git fetch
git log -p HEAD..FETCH_HEAD

Questo prima recupererà le modifiche dal tuo telecomando predefinito (origine). Questo verrà creato automaticamente quando clonerai un repository. Si può anche essere espliciti: git fetch origin master.

Quindi git log viene utilizzato per confrontare il ramo corrente con quello appena recuperato. (L' -popzione (genera patch) è ciò che mostra le differenze .)


14

Questo è come lo faccio.

#To update your local.
git fetch --all

questo recupererà tutto dal telecomando, quindi quando controlli la differenza, confronterà la differenza con il ramo remoto.

#to list all branches
git branch -a

il comando sopra mostrerà tutti i rami.

#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

Ora puoi controllare la differenza come segue.

git diff origin/<branch_name>

questo confronterà la tua filiale locale con la filiale remota


2
git fetch - tutto prenderà tutto da TUTTI i telecomandi. git fetch dovrebbe essere sufficiente se si utilizza il telecomando di origine predefinito.
Christophe Keller,

Incredibile che dopo 8 anni, otteniamo una risposta completa che spieghi correttamente i passaggi. Possiamo fare un aiuto per ottenere i comandi. SO significa capirli.
gdbj,

11

Lascia che il tuo ramo operativo sia sviluppo e desideri distinguere tra ramo di sviluppo locale e ramo di sviluppo remoto, in tal caso, la sintassi dovrebbe essere come git diff remotes/origin/development..development
o

git fetch origin git diff origin/development


11

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

Quando uso git sulla shell, mi piace prima orientarmi guardandomi intorno. Ecco un comando per mostrare tutti i rami

$ 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

Qui ho due sezioni locali ( my-branche master) e 4 (remote some-branch, some-other-branch, master, e my-branch).

Inoltre, l'asterisco accanto a my-branchsegnala il fatto che sono attualmente in quel ramo (lo sapresti anche usando il comando git statusche produrrebbe:) On branch my-branch..

Nota: i rami remoti nella shell git bash sono mostrati in rosso mentre quelli locali sono mostrati in verde.

Se vuoi solo mostrare filiali remote :

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

Per mostrare solo i rami locali potresti essere tentato di usare git branch -lma questo è un comando completamente diverso. Per mostrare le filiali locali utilizzare git branchsenza opzioni

$ git branch
* my-branch 
  master

Per completare una revisione delle opzioni di base del ramo c'è il --listcontrario di quello che ci si potrebbe aspettare è lì per consentire il filtraggio . Usalo con un modello come questo:

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

Puoi anche combinare --listcon le opzioni -ae -rassicurarti di adattare di conseguenza il tuo modello ( ricorda: i rami remoti iniziano con "telecomandi" ). Esempio:

# 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

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

Ora puoi confrontare due rami qualsiasi tra tutti quelli disponibili (puoi anche confrontare due locali o due telecomandi).

Qui sto confrontando il locale con il telecomando my-branch, sono sincronizzati, quindi non ottengo alcun output:

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

Nota: devi dare i nomi completi dei rami senza virgolette.

Posso anche confrontare il locale my-branchcon il telecomando master. Qui ottengo un output perché il telecomando my-branchnon è stato unito al ramo principale.

$ 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
[ . . . ]

11

Se volete vedere la differenza come solo i nomi dei file modificati, allora l'uso:

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

altrimenti questo avrebbe mostrato tutte le differenze tra i due rami:

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


9

Ecco una risposta abbreviata se stai confrontando il tuo ramo attuale e qualcosa che desideri git pull.

git fetch
git diff FETCH_HEAD

Il primo comando scoprirà quale ramo remoto corrisponde al ramo corrente. Un artefatto di quel calcolo nel FETCH_HEADriferimento. Quindi il secondo comando usa quel confronto di riferimento rispetto a quello che ha il tuo ramo attuale.


6

So che ci sono già diverse risposte a questa domanda, ma stavo ricevendo uno strano errore quando provavo la maggior parte di esse.

Nel mio caso ho un secondo telecomando chiamato herokuche non è il origine poiché non era sincronizzato ho ricevuto questo errore quando ho provato a eseguire il git diff master heroku/master:

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

o questo quando provi l'altro approccio git diff master..heroku/master:

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

La soluzione menzionava esplicitamente il nome remoto git fetchprima di eseguire git diff, nel mio caso:

$ git fetch heroku
$ git diff master heroku/master

Spero che aiuti gli altri con questo stesso problema.


4
git difftool <commit> .

Questo confronterà il commit che desideri con i tuoi file locali. Non dimenticare il punto alla fine (per locale).

Ad esempio, per confrontare i file locali con alcuni commit:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(e non hai bisogno di git fetch, a meno che non sia necessario il confronto con i nuovi commit)


Penso che sia interessante perché è un confronto che posso fare prima di impegnarmi e spingere. Sfortunatamente in Windows Vimdiff per mostrare è brutto; c'è un modo per usare qualcosa di meglio, come notepad ++?
Stefano Scarpanti,

3

Esempio

git diff 'master' 'testlocalBranch'

Se si utilizza l'editor come webstorm, è possibile fare clic con il pulsante destro del mouse sul file selezionare confronta con ramo e digitare / selezionare il ramo.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


2
Cosa aggiunge questo rispetto alla risposta accettata di 7,5 anni con 170+ voti positivi?
Mark Rotteveel,

Questo è per mrblah l'utente o per utenti simili che hanno aggiunto commenti per la risposta accettata. La sintassi è diversa da un esempio e l'esempio aiuta di più dal punto di vista del principiante.
Kurkula,

2
In tal caso, dovrebbe essere in commento a quella risposta.
rachit

1

In VS 2019, esegui FETCH Non estrarre il codice.

Questo è quello che ho fatto. Aggiunto di seguito nel file .gitconfig in modo da poter usare Beyond Compare

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

Aggiunto di seguito

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

Apri il prompt dei comandi e vai alla directory di lavoro. Ho fornito di seguito per confrontare il ramo DEV locale con il ramo DEV remoto

git difftool dev origin/dev --dir-diff

Questo aprirà Beyond Compare e aprirà le directory che hanno file diversi. Se nessuna modifica Beyond Compare non verrà avviata.


0

Mi chiedo se c'è qualche cambiamento nel mio ramo principale ...

  1. Innanzitutto, devi cambiare il tuo ramo (se sei già sotto questo ramo, non devi farlo!)

git checkout master

  1. Puoi vedere quale file è stato modificato sotto il tuo ramo principale con questo comando

stato git

  1. Elenca i rami

ramo git -a

  • maestri
    telecomandi / origin / master
  1. Trova le differenze

git diff origin / master


0

Impostare

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

Diffondere 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

Diffondere con un ramo remoto arbitrario

Questo risponde alla domanda nella tua rubrica ("il suo telecomando"); se si desidera diff su "un telecomando" (che non è configurato come upstream per il ramo), è necessario indirizzarlo direttamente. Puoi vedere tutti i rami remoti con il seguente:

git branch -r

Puoi vedere tutti i telecomandi configurati con i seguenti:

git remote show

È possibile visualizzare la configurazione di diramazione / tracciamento per un singolo telecomando (ad es. Origine) come segue:

git remote show origin

Una volta determinato il ramo di origine appropriato, fai una normale differenza :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

Questo è abbastanza semplice Puoi usare:git diff remote/my_topic_branch my_topic_branch

Dov'è il my_topic_branchtuo argomento.


0

Supponiamo che tu abbia già impostato il tuo originrepository remoto. Poi,

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


0

provare:

git diff origin HEAD

Supponendo di voler diffondere le filiali locali correnti HEADrispetto all'origine. E supponendo che tu sia nella filiale locale. :)


-3

Se si utilizza TortoiseGit (fornisce la GUI per Git), è possibile fare clic con il tasto destro del mouse sulla cartella repository Git, quindi fare clic suGit Sync .

È possibile selezionare i rami da confrontare se non selezionati. Di quanto è possibile visualizzare le differenze commit. È inoltre possibile fare clic con il pulsante destro del mouse su qualsiasi commit Compare with previous revisionper visualizzare le differenze fianco a fianco.tortoise git sync per confrontare le filiali remote e locali

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.