Come vedo le differenze di commit tra i rami in git?


341

Sono su branch-X e ho aggiunto un altro paio di commit su di esso. Voglio vedere tutte le differenze tra MASTER e il ramo in cui mi trovo in termini di impegni. Potrei semplicemente fare un

git checkout master
git log

e poi a

git checkout branch-X
git log

e visualmente diff questi, ma spero in un metodo più facile, meno soggetto a errori.


Risposte:


324

Puoi ottenere un output visivo davvero piacevole di come i tuoi rami differiscono da questo

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X

13
Ciò non ti mostrerà le differenze tra i rami, ma è ciò che viene chiesto.
Pablo Fernandez Heelhook,

48
git log --oneline --graph --all --decorate --abbrev-committi darà un risultato simile in un comando più breve / più leggibile
Pablo Fernandez heelhook,

4
Mi piace questo:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery il

6
Estremamente complicato.
Shawn Erquhart,

12
git log --oneline --graph --all --decorateè abbastanza, --abbrev-commitnon è necessario, --onelineè l'abbreviazione di--pretty=oneline --abbrev-commit
avmohan

722

Puoi farlo facilmente con

git log master..branch-X

Questo ti mostrerà come ha commesso il ramo X, ma il maestro no.


9
C'è un'opzione se entrambi i rami contengono commit che l'altro no? In questo momento, devi capovolgere gli argomenti ed eseguirlo in entrambi i modi per vedere i commit che l'altro ramo non contiene.
Elliott Slaughter,

38
Se sei già passato a branch-Xpuoi usaregit log master..
Dave

8
@ElliottSlaughter: se vuoi trovare commit che sono in master o branch-X ma non in entrambi, puoi usare git log master...branch-X(tre punti anziché due). Vedi man gitrevisionsper maggiori informazioni.
Xavier T.

3
È solo metà della risposta. Qualsiasi commit in master che causa la divergenza dei rami non verrà visualizzato
jterm

9
Se i commit sono stati scelti da branch-X per master, questo non li filtrerà. Saranno ancora nella lista dei commit "Nel ramo X ma non nel master" anche se in realtà sono in entrambi ..
Tuffwer

88

Penso che sia una questione di scelta e contesto. Preferisco usare

git log origin/master..origin/develop --oneline --no-merges

Mostrerà i commit in sviluppo che non sono nel ramo principale.

Se vuoi vedere quali file sono effettivamente modificati usa

git diff --stat origin/master..origin/develop --no-merges

Se non specifichi argomenti, verrà visualizzato il diff completo. Se vuoi vedere visual diff, installa meldsu linux o WinMergesu windows. Assicurati che siano i difftools predefiniti. Quindi usa qualcosa di simile

git difftool -y origin/master..origin/develop --no-merges

Nel caso in cui desideri confrontarlo con il ramo corrente. È più conveniente usare HEAD invece del nome del ramo come use:

git fetch
git log origin/master..HEAD --oneline --no-merges

Ti mostrerà tutti gli commit, che stanno per essere uniti


1
Se si confronta un ramo di rilascio che potrebbe avere unioni. Potresti rimuovere i commit di unione (che non aggiungono alcun valore) con l'aiuto del parametro --no-mergescome:git log origin/master..HEAD --oneline --no-merges
claudiu.f.marginean

15

Se sei su Linux, gitgè il modo di farlo per farlo molto rapidamente e graficamente.

Se insisti sulla riga di comando puoi usare:

git log --oneline --decorate

Per rendere git logpiù piacevole per impostazione predefinita, in genere imposto queste preferenze globali:

git config --global log.decorate true
git config --global log.abbrevCommit true

14

Suggerirei quanto segue per vedere la differenza "in commit". Per differenza simmetrica, ripetere il comando con args invertiti:

git cherry -v master [your branch, or HEAD as default]

È diverso da git master..branch-X?
Ilmirons,

2
Certo, "git cherry" è intelligente: si traduce da "commit" in "patch / diff" e può evitare di segnalare una "patch" che si trova su entrambi i rami ma applicata in ordine diverso.
mmaruska,

8

se vuoi usare gitk:

gitk master..branch-X

ha una bella GUi vecchia scuola


4

Non è la risposta perfetta ma funziona meglio per le persone che usano Github:

inserisci qui la descrizione dell'immagine

Vai al tuo repository: Insights -> Network


Inoltre, la creazione di una richiesta pull mostrerà anche le differenze di diramazione.
pkamb,

OMG Voglio abbracciarti.
Esseara,

@esseara Anche io sono un grande abbraccio :))
Prego

2

Se si desidera confrontare in base ai messaggi di commit, è possibile effettuare le seguenti operazioni:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)

1
Invece di usare --onelinee tubare per cutte puoi usaregit log --format='%s'
ottico

0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Contribuendo a questo perché consente ai registri aeb di essere diffusi visivamente, fianco a fianco, se si dispone di uno strumento di differenza visiva. Sostituisci comando diff alla fine con comando per avviare lo strumento diff visivo.


0

Ho usato alcune delle risposte e ho trovato quella adatta al mio caso (assicurati che tutte le attività si trovino nel ramo di rilascio).

Anche altri metodi funzionano, ma ho scoperto che potrebbero aggiungere righe che non mi servono, come unire commit che non aggiungono alcun valore.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

oppure puoi confrontare la tua corrente con quella principale

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch è lì per assicurarti di utilizzare le informazioni aggiornate.

In questo modo ogni commit sarà su una riga e potrai copiarlo / incollarlo in un editor di testo e iniziare a confrontare le attività con i commit che verranno uniti.

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.