Mostra quali file sono stati modificati tra due revisioni


2105

Voglio unire due rami che sono stati separati per un po 'e volevo sapere quali file sono stati modificati.

Mi sono imbattuto in questo link: http://linux.yyz.us/git-howto.html che è stato abbastanza utile.

Gli strumenti per confrontare i rami che ho incontrato sono:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Mi chiedevo se c'è qualcosa come "git status master..branch" per vedere solo quei file che sono diversi tra i due rami.

Senza creare un nuovo strumento, penso che questo sia il più vicino che puoi arrivare a farlo ora (che ovviamente mostrerà le ripetizioni se un file è stato modificato più di una volta):

  • git diff master..branch | grep "^diff"

Mi chiedevo se ci fosse qualcosa che mi mancava ...


12
Quanti altri trovano fuorviante il titolo di questa domanda? In realtà si tratta di trovare le differenze di file tra due rami. Quello che sono venuto qui a cercare era come vedere le differenze tra i file tra due revisioni sullo stesso ramo. O sono l'unico?
Sandeepan Nath,

4
@SandeepanNath: con git non c'è differenza. Ti riferisci SEMPRE a singoli commit.
Samuel O'Malley,

@ SamuelO'Malley Sono nuovo a git e considerando la strategia di ramificazione apparentemente comune in cui tutti i rami vengono infine uniti al ramo principale e alla fine viene implementato il maestro. Ora, considerando l'evento di un'implementazione, in cui la produzione è già alla guida, ma dietro la punta (con una revisione se l'ultima implementazione si è verificata dopo l'ultima unione principale), vorrei vedere le differenze tra queste due revisioni, per scopri cosa sarebbe stato lanciato. Non vorrei guardare il ramo che è stato unito l'ultima volta. Correggimi se sbaglio.
Sandeepan Nath,

2
@SandeepanNath: invece di utilizzare i nomi dei rami, puoi prendere le risposte di seguito e specificare semplicemente gli ID di commit. Oppure fai riferimento ai commit con i loro nomi di tag se crei tag durante il lancio.
Samuel O'Malley,

1
@SandeepanNath Non è possibile confrontare 2 rami, è necessario specificare la revisione. Quindi confrontare 2 rami sta confrontando 2 revisioni.
Bastien Vandamme,

Risposte:


2575

Per confrontare il ramo corrente con il masterramo:

$ git diff --name-status master

Per confrontare due rami qualsiasi:

$ git diff --name-status firstbranch..yourBranchName

Continua a leggere git diffnella documentazione ufficiale .


2
Che cosa significano ciascuno degli indici sul lato sinistro (vedo molti M e D)?
gogogadgetinternet,

15
@ user446936 - puoi vedere cosa significano le lettere nella pagina man dello stato di git @ kernel.org/pub/software/scm/git/docs/git-status.html - in particolare, M == modificato, D == eliminato
James Manning,

12
git diff --name-status your_branch...mastergenera le modifiche che si sono verificate sul master da quando your_branch è stato creato da esso
Radu,

1
L'operatore punto doppio è superfluo, qui, perché le differenze sono a coppie.
jub0bs,

2
Ottengo una revisione sconosciuta o un percorso non nell'albero di lavoro.
SuperUberDuper,

408

Provare

$ git diff --stat --color master..branchName

Questo ti darà maggiori informazioni su ogni modifica, pur usando lo stesso numero di righe.

Puoi anche capovolgere i rami per ottenere un'immagine ancora più chiara della differenza se dovessi unire l'altro:

$ git diff --stat --color branchName..master

77
Se hai attivato (altamente consigliato, imho) git color ( config --global color.ui true), puoi saltare --color. (Ho lks - sindrome della tastiera pigra.)
Art Swri

25
Sono con te sul colore! A proposito, intendevo dire git config --global color.ui true: per essere completo.
Art Swri

2
Non funziona, genera errori:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Ripristina Monica il

7
@ TomášZato scusa ma devi scambiare "branchName" con il nome del tuo ramo.
Gerry,

161

Tieni anche presente che git ha una ramificazione economica e semplice. Se penso che un'unione possa essere problematica, creo un ramo per l'unione. Quindi, se masterha le modifiche che voglio unire ed baè il mio ramo che ha bisogno del codice dal master, potrei fare quanto segue:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Il risultato finale è che ho avuto modo di provare l'unione su un ramo buttato via prima di avvitarmi con il mio ramo. Se mi aggroviglio, posso semplicemente eliminare il ba-mergeramo e ricominciare.


4
Eccezionale. Non ho mai pensato di ramificarmi in quel modo. Penso che questo dovrebbe essere considerato come parte delle "migliori pratiche" durante la fusione.
egelev,

Quando unisci nuovamente la ba-marge in ba, non c'è il potenziale per risolvere nuovamente i conflitti?
Josef.B,

2
@EricAnderson Giusto, è un grafico. SVN si attacca come una gomma sotto un banco di scuola. grazie.
Josef.B,

1
Perché è necessario eseguire l'ultimo passaggio 'git merge master' se ba-merge aveva già master
qwebek

Potresti lasciarlo fuori. L'unico motivo per cui sarebbe utile è se arrivassero nuovi contenuti mastermentre stavi lavorando per rivedere il codice e risolvere i conflitti.
Eric Anderson,

58

Se qualcuno sta cercando di generare un file diff da due rami:

git diff master..otherbranch > myDiffFile.diff

2
Questo è tornato utile soprattutto con rami di grandi dimensioni che contengono molte differenze.
vandsh

Questo è utile quando la differenza è davvero grande. Di default non mostrava tutte le differenze nella console (mi chiedevo perché), passare la diff in un file è la strada da percorrere in questo caso.
rotimi-best

42

Esiste anche un metodo basato sulla GUI.

Puoi usare gitk .

  1. Correre:

    $ gitk --all
    
  2. Fare clic con il tasto destro su un commit di un ramo e selezionare Contrassegna questo commit nel menu a comparsa.

  3. Fare clic con il tasto destro del mouse su un commit di un altro ramo e selezionare Diff this -> contrassegnato commit o Diff contrassegnato commit -> questo .

Quindi ci sarà un elenco di file modificato nel pannello in basso a destra e dettagli diff nel pannello in basso a sinistra.


3
@Orwellophile Ho caricato un video per mostrare come farlo. Spero che ti possa aiutare.
Yantao Xie,

Wow, solo per me, mi sento speciale. L'ho aggiunto ai preferiti in delicious.com per riferimento futuro e google-foo extra.
Orwellophile,

Risposta gravemente sottovalutata. Grazie!
Koshinae,

36

Un'altra opzione, usando la combinazione in questo caso:

git difftool -d master otherbranch

Ciò consente non solo di vedere le differenze tra i file, ma fornisce anche un modo semplice per puntare e fare clic su un file specifico.


6
Potrebbe voler impostare meld come predefinito difftool: git config --global diff.tool meld
bwv549

1
Questo è il mio preferito perché utilizzerà qualsiasi difftool configurato.
Josiah

Non supportato su OSX. :-(
Mike S.

@MikeS. controlla questa risposta stackoverflow.com/a/12815806/151918 contiene istruzioni per OSX. Funziona almeno per me, spero che sia d'aiuto.
rsilva4,

Bello. Ma a cosa serve -d?
Scotty.NET,

29

Nota che git rende semplice provare l'unione e tornare indietro da qualsiasi problema se non ti piace il risultato. Potrebbe essere più semplice che cercare in anticipo potenziali problemi.


10
David, è un buon punto, anche se sarebbe bello sapere cosa sta succedendo prima ...
johannix,

18

E se stai cercando modifiche solo tra determinati file, quindi:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 è facoltativo e il tuo ramo corrente (il ramo in cui ti trovi) sarà considerato di default se branch1 non è fornito. per esempio:

git diff master -- controller/index.js

15

Quando si lavora in modo collaborativo o su più funzionalità contemporaneamente, è normale che l'upstream o anche il master contengano lavori che non sono inclusi nel proprio ramo e verranno visualizzati in modo errato nelle differenze di base.

Se il tuo Upstream potrebbe essersi spostato, dovresti farlo:

git fetch
git diff origin/master...

Il solo utilizzo di git diff master può includere o non includere modifiche rilevanti.



8

Ci sono due rami, diciamo

  • A (Branch su cui stai lavorando)
  • B (Un altro ramo con cui si desidera confrontare)

Essere nel ramo A è possibile digitare

git diff --color B

allora questo ti darà un output di

inserisci qui la descrizione dell'immagine

Il punto importante su questo è

  1. Il testo in verde è presente all'interno del ramo A

  2. Il testo in rosso è presente nel ramo B


8

Ci sono molte risposte qui, ma volevo aggiungere qualcosa che uso comunemente. SE ti trovi in ​​uno dei rami che desideri confrontare, in genere eseguo una delle seguenti operazioni. Per il bene di questa risposta diremo che siamo nel nostro ramo secondario. A seconda della vista che ti serve in quel momento dipenderà da quale scegli, ma la maggior parte delle volte sto usando la seconda opzione delle due. La prima opzione può essere utile se stai cercando di ripristinare una copia originale - in entrambi i casi, entrambi eseguono il lavoro!

Questo confronterà il master con il ramo in cui ci troviamo (che è secondario) e il codice originale sarà le righe aggiunte e il nuovo codice sarà considerato le righe rimosse

git diff ..master

O

Questo confronterà anche il master con il ramo in cui ci troviamo (che è secondario) e il codice originale sarà le vecchie righe e il nuovo codice sarà le nuove righe

git diff master..

1

Se si utilizza Github / Github Enterprise, è possibile utilizzare l'interfaccia utente Web premendo l'URL /comparedel percorso del repository, ad esempio https://github.com/http4s/http4s/compare . È possibile selezionare il ramo / commit / tag che si desidera confrontare: Schermata di confronto di Github

E il diff sarà presentato nell'interfaccia github all'URL /compare/{x1}...{x2}dove sono x2e x1sono il ramo / commit / tag che si desidera confrontare, ad esempio: https://github.com/http4s/http4s/compare/release-0.18.x ...maestro

Puoi vedere di più nel Github Doc .


0

Per le persone che cercano una soluzione GUI, Git Cola ha un bellissimo "Branch Diff Viewer ( Diff -> Branches .. ).


-1
git diff revision_n revision_m

se revision_ne revision_msono i commit successivi, viene emesso come git show revision_m



-2

Se ti piace la GUI e stai utilizzando Windows, ecco un modo semplice.

  1. Scarica WinMerge
  2. Dai un'occhiata ai due rami in cartelle diverse
  3. Confrontare una cartella per cartella usando WinMerge. Puoi anche apportare facilmente modifiche se uno dei rami è quello su cui stai lavorando.

Non è il modo più semplice, in realtà non è necessario scaricare repository per diff tra i rami.
stefgosselin,

In realtà non è il modo più semplice, ma è il modo in cui la GUI, che spesso è molto più facile soprattutto per vedere le differenze in tutti i file
Marius Matioc,

-3

Puoi anche facilmente confrontare i rami per i file modificati usando ad esempio TortoiseGit . Basta fare clic su Sfoglia riferimenti e selezionare i rami che si desidera confrontare.

Ad esempio, se si confronta il proprio ramo con il master, si otterrà come risultato un elenco di file che verranno modificati nel master se si decide di unire il proprio ramo al master .

Ricorda che otterrai risultati diversi se confronti master con il tuo ramo e il tuo ramo con il maestro .


1
la domanda sembra riguardare l'utilità git nativa
Vladimir Hraban,
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.