Git diff tra il ramo corrente e il master ma senza includere i commit master non uniti


171

Voglio un diff di tutte le modifiche in un ramo che non è ancora unito al master.

Provai:

git diff master
git diff branch..master
git diff branch...master

Tuttavia, in ognuno di questi casi il diff contiene contenuti nel master che non sono stati ancora uniti nel mio ramo.

C'è un modo per fare una differenza tra il mio ramo e il master che esclude le modifiche nel master che non sono ancora state unite nel mio ramo?


9
Se si ribalta intorno alla seconda versione, si ottiene ciò che si vuole: git diff master..branch. Puoi accorciarlo git diff master..se sei sul ramo. La r1..r2sintassi è breve per ^r1 r2cui significa "mostrami tutto ciò che discende r2e da cui non è raggiungibile r1". git help gitrevisionscontiene informazioni sulle varie sintassi che è possibile utilizzare.
John Szakmeister,

1
Ho ampliato la mia risposta dopo aver letto di più sulla ...sintassi di git diff. Il tuo commento è sbagliato, @jszakmeister, perché gli intervalli di revisione descritti in gitrevisionsnon hanno nulla a che fare con git diff. Diff confronta due punti nella storia, non può funzionare con un intervallo.
Palec,

Hai ragione. Dimentico sempre che git difffunziona diversamente dagli altri comandi ... un fatto che trovo frustrante. :-(
John Szakmeister,

assicurati di aggiornare la copia locale di master prima del confronto
joe

Risposte:


232
git diff `git merge-base master branch`..branch

Unisci base è il punto da cui è branchdivergente master.

Git diff supporta una sintassi speciale per questo:

git diff master...branch

Non devi scambiare i lati perché in questo modo otterrai l'altro ramo. Volete sapere cosa è cambiato da branchquando è divergente master, non viceversa.

Liberamente correlato:


Si noti che ..e ...sintassi non ha la stessa semantica come in altri strumenti Git. Si differenzia dal significato specificato in man gitrevisions.

Citando man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Questo per visualizzare i cambiamenti tra due arbitrari <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Questo è sinonimo del modulo precedente. Se <commit>da un lato viene omesso, avrà lo stesso effetto dell'utilizzo HEADinvece.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    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" equivale a " git diff $(git-merge-base A B) B". È possibile omettere uno dei <commit>, che ha lo stesso effetto usando HEADinvece.

Nel caso in cui si stia facendo qualcosa di esotico, si dovrebbe notare che tutto quanto <commit>nella descrizione sopra, tranne nelle ultime due forme che usano le notazioni "..", può essere qualsiasi <tree>.

Per un elenco più completo delle modalità di ortografia <commit>, vedere la sezione "SPECIFICAZIONE DELLE REVISIONI" in gitrevisions[7]. Tuttavia, "diff" riguarda il confronto tra due endpoint, non intervalli, e le notazioni di intervallo (" <commit>..<commit>" e " <commit>...<commit>") non significano un intervallo come definito nella sezione "SPECIFICARE GAMMA" in gitrevisions[7].


Per me $ git diff master...branchprodotto fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- è un comando dipendente dalla versione?
Joel Peltonen,

In realtà, ho appena capito che "ramo" deve essere il nome del tuo ramo, ho pensato che fosse un riferimento all'attuale ramo
Joel Peltonen,

4
Hai ragione, la mia risposta si basa sul ramo chiamato branch. Ho scelto di attenermi al nome scelto dall'OP nella domanda. Se si desidera utilizzare il ramo corrente, sostituirlo branchcon HEAD.
Palec,

14
Si noti che è possibile utilizzare git diff master...per evitare di specificare il ramo (verrà preso quello corrente).
VasiliNovikov,

1
Il comando originale funziona dopo aver verificato devel, @ChrisGuest? Probabilmente, Git ha creato il ramo per te durante il checkout, come una copia locale di un ramo remoto (in genere origin/devel). Se così fosse, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenavrebbe funzionato anche prima del checkout.
Palec,

44

Ecco cosa ha funzionato per me:

git diff origin/master...

Ciò mostra solo le modifiche tra il mio ramo locale attualmente selezionato e il ramo principale remoto e ignora tutte le modifiche nel mio ramo locale che derivano da commit di unione.


Per riferimento, se sono necessari i riferimenti di commit di commit che contengono queste modifiche, utilizzare git cherry origin/master.
jaytibann,

Se questo mostra un mucchio di immondizia che non ti aspettavi, masterpotrebbe aver riformato una serie di commit da sotto di te.
Michael - Dov'è Clay Shirky il

21

Come notato anche da John Szakmeister e VasiliNovikov, il comando più breve per ottenere la differenza completa dalla prospettiva del maestro sul tuo ramo è:

git diff master...

Questo utilizza la tua copia locale del master.

Per confrontare un file specifico utilizzare:

git diff master... filepath

Esempio di output:

Esempio di utilizzo

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.