Come confrontare i file da due rami diversi?


1538

Ho una sceneggiatura che funziona bene in un ramo ed è spezzata in un altro. Voglio guardare le due versioni fianco a fianco e vedere cosa c'è di diverso. Ci sono modi per farlo?

Per essere chiari non sto cercando uno strumento di confronto (io uso Beyond Compare). Sto cercando un comando git diff che mi permetta di confrontare la versione principale con la mia versione corrente del ramo per vedere cosa è cambiato. Non sono nel mezzo di un'unione o altro. Voglio solo dire qualcosa del genere

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

Risposte:


2208

git diff può mostrarti la differenza tra due commit:

git diff mybranch master -- myfile.cs

O, equivalentemente:

git diff mybranch..master -- myfile.cs

Utilizzando quest'ultima sintassi, se uno dei lati è HEAD, può essere omesso (ad es. master..Rispetto mastera HEAD).

Potresti anche essere interessato a mybranch...master(dai git diffdocumenti ):

Questo modulo è per visualizzare le modifiche sul ramo contenente e fino al secondo <commit>, a partire da un antenato comune di entrambi <commit>. git diff A...Bè equivalente a git diff $(git-merge-base A B) B.

In altre parole, questo darà una differenza di cambiamenti da masterquando è divergente mybranch(ma senza nuove modifiche da allora in mybranch).


In tutti i casi, il --separatore prima del nome del file indica la fine dei flag della riga di comando. Questo è facoltativo a meno che Git non venga confuso se l'argomento si riferisce a un commit o a un file, ma includerlo non è una cattiva abitudine da prendere. Vedi https://stackoverflow.com/a/13321491/54249 per alcuni esempi.


Gli stessi argomenti possono essere passati git difftoolse ne hai uno configurato.


44
E se nessuna delle due versioni che si desidera confrontare è l'albero di lavoro, è possibile utilizzare git diff branch1 branch2 myfile.cs. (Non --dovrebbe più essere necessario, in quanto può richiedere solo fino a due argomenti di revisione.)
Cascabel,

8
Ho provato ogni versione di questo e non succede nulla. Ho configurato il mio difftool (funziona per l'unione). Ho un file chiamato bd.ps1. Ogni versione del comando che scrivo non fa nulla. Non dà nemmeno un errore. WTH!?!?!
Michea il

3
@ Michea: Lo stai provando anche con un semplice diff? Stai digitando correttamente il percorso relativo alla directory corrente? (Non mostrerà silenziosamente alcuna differenza se il file non esiste e si usa l' --errore. Comune e facile da fare.)
Cascabel,

5
Questo non ha funzionato per me a meno che non abbia incluso il percorso completo del file, come mostrato da git diff --name-status branch1..branch2(probabilmente ovvio, ma ho pensato di menzionarlo nel caso in cui qualcun altro abbia lo stesso problema che ho fatto).
hBrent,

4
Anche l'ordine di Mybranch e Master è importante. Il file nel primo ramo verrà mostrato con i prefissi '-', il file nel secondo ramo verrà mostrato con i prefissi '+'.
Timbo,

414

Puoi farlo: git diff branch1:path/to/file branch2:path/to/file

Se hai configurato difftool, puoi anche: git difftool branch1:path/to/file branch2:path/to/file

Domanda correlata: Come posso visualizzare l'output di git diff con il programma visual diff


4
L'uso dei due punti non è davvero un ottimo modo: significa che stai facendo riferimento ai file attraverso gli oggetti dell'albero, quindi devi digitare il percorso completo, anziché relativo alla directory corrente.
Cascabel,

13
@Jefromi, questo potrebbe essere cambiato in una versione più recente, ma almeno ora puoi usare i percorsi relativi (es branch1:./file.). Ciò è utile anche se il file si trova in una posizione separata tra i rami (ad es git diff branch1:old/path/to/file branch2:new/path/to/file.).
Redbmk,

4
@redbmk Sì, era tra il 2010 e ora! Tuttavia, se è lo stesso file su entrambi i rami, non è necessario farlo in questo modo, giusto git diff branch1 branch2 path/to/file.
Cascabel,

3
@jefromi cool, non ero sicuro della linea temporale accesa quando è stato aggiunto. Sì, normalmente userei la sintassi che hai menzionato, ma la risposta di Tim mi ha aiutato a capire come confrontare i file con percorsi diversi, anche se non è proprio quello che la domanda si
poneva

1
Mentre amo questa idea, non riesco a far funzionare questa sintassi o non trovo alcuna menzione nei documenti git diff. Cosa mi sto perdendo? Grazie!
yoyo

160

Sintassi più moderna:

git diff ..master path/to/file

Il prefisso a doppio punto significa "dalla directory di lavoro corrente a". Puoi anche dire:

  • master.., cioè il contrario di cui sopra. Questo è lo stesso di master.
  • mybranch..master, facendo esplicito riferimento a uno stato diverso dall'albero di lavoro corrente.
  • v2.0.1..master, ovvero facendo riferimento a un tag.
  • [refspec]..[refspec], praticamente qualsiasi cosa identificabile come stato del codice da git.

33

Esistono molti modi per confrontare i file da due diversi rami:

  • Opzione 1: se si desidera confrontare il file da un ramo specifico con un altro ramo specifico:

    git diff branch1name branch2name path/to/file
    

    Esempio:

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

    In questo esempio si sta confrontando il file nel ramo “mybranch” con il file nel ramo “mysecondbranch”.

  • Opzione 2: modo semplice:

     git diff branch1:file branch2:file
    

    Esempio:

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

    Questo esempio è simile all'opzione 1.

  • Opzione 3: se si desidera confrontare la directory di lavoro corrente con un ramo:

    git diff ..someBranch path/to/file
    

    Esempio:

    git diff ..master myfile.cs
    

    In questo esempio stai confrontando il file dal tuo ramo attuale con il file nel ramo principale.


12

Lo faccio semplicemente git diff branch1 branch2 path/to/file

Questo controlla le differenze tra i file. I cambiamenti in branch1sarebbero in rosso. I cambiamenti in branch2sarebbero in verde.

Si presume che branch1sia il passato ed branch2è il futuro. Puoi invertire questo invertendo l'ordine dei rami nel diff:git diff branch2 branch1


Quale versione di git diff può farlo? Non sembra essere supportato nella versione in esecuzione (2..9.2.windows.1).
Vince Bowdren,

9

Se vuoi fare un diff rispetto al ramo corrente puoi ommiterlo e usare:

git diff $BRANCH -- path/to/file

in questo modo differirà dal ramo corrente al ramo di riferimento ( $BRANCH).


5

Concordo con la risposta suggerita da @dahlbyk. Se vuoi che il diff sia scritto in un file diff per le revisioni del codice usa il seguente comando.

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

2

Nel mio caso, utilizzo il comando seguente:

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

Questo comando può aiutarti a confrontare lo stesso file in due rami diversi


1

Il modo migliore per farlo è utilizzare git diffnel modo seguente: git diff <source_branch> <target_branch> -- file_path

Controllerà la differenza tra i file in quei rami. Dai un'occhiata a questo articolo per ulteriori informazioni sui comandi git e su come funzionano.


1

Usa hash di commit come questo:

git diff <hash1> <hash2> <filename>

dove hash1 può essere qualsiasi commit da qualsiasi ramo, lo stesso per hash2 .


1

Esistono due scenari per confrontare i file:

Scenario 1: confrontare i file su filiali remote (entrambi i rami dovrebbero esistere sul repository remoto)

Scenario 2: confrontare i file locali (nella copia dell'area di lavoro locale) con i file nel repository remoto.

La logica è semplice Se si forniscono due nomi di diramazione a diff, si confronteranno sempre i rami remoti e se si fornisce solo un nome di diramazione, confronterà sempre la propria copia di lavoro locale con il repository remoto (quello fornito). È possibile utilizzare la gamma per fornire repository remoti.

ad es. Acquista un ramo

git checkout branch1
git diff branch2 [filename]

in questo caso, se si fornisce il nome file, confronterà la copia locale del nome file con il ramo remoto denominato " branch2 ".

git diff branch1 branch2 [filename]

in questo caso, confronterà il nome del file dai rami remoti denominati " branch1 " vs " branch2 "

git diff ..branch2 [filename]

anche in questo caso, confronterà il nome del file dai rami remoti denominati " branch1 " vs " branch2 ". Quindi, è come sopra. Tuttavia, se hai appena creato un ramo da un altro ramo, dì "master" e il tuo ramo attuale non esiste sul repository remoto, confronterà " master " remoto con " branch2 " remoto .

Spero sia utile.


0

Per confrontare due file in git bash devi usare il comando:

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

Questo comando mostrerà la differenza tra i due file nella bash stessa.

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.