Come ottenere le modifiche su un ramo in Git


266

Qual è il modo migliore per ottenere un registro dei commit su un ramo dal momento in cui è stato ramificato dal ramo corrente? La mia soluzione finora è:

git log $(git merge-base HEAD branch)..branch

La documentazione per git-diff indica che git diff A...Bè equivalente a git diff $(git-merge-base A B) B. D'altra parte, la documentazione per git-rev-parse indica che r1...r2è definito come r1 r2 --not $(git merge-base --all r1 r2).

Perché sono diversi? Nota che git diff HEAD...branchmi dà le differenze che voglio, ma il comando git log corrispondente mi dà più di quello che voglio.

Nelle immagini, supponiamo che:

         x --- --- y z --- ramo
        /
--- --- un b --- --- c d --- e --- TESTA

Vorrei ottenere un registro contenente commit x, y, z.

  • git diff HEAD...branch dà questi impegni
  • tuttavia, git log HEAD...branchdà x, y, z, c, d, e.

Stai usando "git log" in modo errato per i tuoi scopi da quello che posso vedere. Ho aggiunto la mia risposta qui sotto.
PlagueHammer,

Risposte:


187

Nel contesto di un elenco di revisione, A...Bè come lo git-rev-parsedefinisce. git-log prende un elenco di revisione. git-diffnon prende un elenco di revisioni - richiede una o due revisioni e ha definito la A...Bsintassi per indicare come è definita nella git-diffmanpage. Se git-diffnon definito in modo esplicito A...B, tale sintassi non sarebbe valida. Notare che la git-rev-parsemanpage descrive A...Bnella sezione "Specificare gli intervalli" e che tutto in quella sezione è valido solo in situazioni in cui è valido un intervallo di revisione (cioè quando si desidera un elenco di revisione).

Per ottenere un registro contenente solo x, ye z, provare git log HEAD..branch(due punti, non tre). Questo è identico a git log branch --not HEAD, e significa che tutti gli commit su branch che non sono su HEAD.


31
Wow, è confuso. Si scopre che l'uso di "git diff HEAD..branch" mostra tutti i commit (x, y, z, c, d, e), ma "git log HEAD..branch" fa esattamente quello che voglio e mostra solo x, y , z! Questo è esattamente l'opposto dell'uso di "...".
Greg Hewgill,

22
git diff HEAD..branchè identico a git diff HEAD branch. La cosa fondamentale da ricordare qui è che il registro accetta un elenco / intervallo di revisioni, mentre diff non lo fa. Ecco perché trattano i loro argomenti in modo diverso.
Lily Ballard,

4
Sembra che git diff HEAD...branch(tre punti) corrisponda all'output digit log HEAD..branch
jchook il

72
git cherry branch [newbranch]

fa esattamente quello che stai chiedendo, quando sei nel masterramo.

Mi piace anche molto:

git diff --name-status branch [newbranch]

Il che non è esattamente quello che stai chiedendo, ma è comunque molto utile nello stesso contesto.


8
'git cherry' genera un elenco di ID commit. Posso convertirli in un unico diff combinando tutte le modifiche in ogni commit?
Jonathan Hartley,

1
git cherryè davvero molto utile. Grazie :)
jkp,

2
@JonathanHartley Prendere la prima e l' ultima , come degli ID di commit e gettato a gif-diff: git diff x..zo per il mio esempio è git diff 13bc4d..8eda3a.
towi,

3
È difficile capire quale codice deve essere sostituito nel tuo comando come in quale ramo o newbranch è una parola chiave e quale dovrebbe essere sostituito con il nome del ramo personalizzato
pal4life

37

Quello che vuoi vedere è l'elenco dei commit in uscita. Puoi farlo usando

git log master..branchName 

o

git log master..branchName --oneline

Dove presumo che "branchName" sia stato creato come ramo di tracciamento di "master".

Allo stesso modo, per vedere le modifiche in arrivo puoi usare:

git log branchName..master

1
@ABB, se branchName viene omesso, il valore predefinito è "head", che è effettivamente branchName nell'esempio sopra.
PlagueHammer,

25

Questo è simile alla risposta che ho pubblicato su: Anteprima di un push Git

Rilascia queste funzioni nel tuo profilo Bash:

  • gbout - git branch in uscita
  • gbin - ramo git in arrivo

Puoi usarlo come:

  • Se sul master: gbin branch1 <- questo ti mostrerà cosa c'è in branch1 e non in master
  • Se sul master: gbout branch1 <- questo ti mostrerà cosa c'è nel master che non è nel ramo 1

Questo funzionerà con qualsiasi ramo.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Simile a diverse risposte come quelle di Alex V e NDavis, ma nessuna di queste è la stessa.

Quando già nel ramo in questione

usando:

git diff master...

Che combina diverse funzionalità:

  • è super corto
  • mostra le modifiche effettive

Aggiornare:

Questo dovrebbe probabilmente essere git diff master, ma anche questo mostra il diff, non i commit come la domanda specificata.


2
Se da git co master; git pullquando hai creato il ramo, git diff masternon sarà molto utile ottenere le differenze introdotte SOLO da commit nel ramo specificato.
Guiva

1
O per specificare rami esplicitamente: git diff <branch1>...<branch2>mostrerà le modifiche introdotte da branch2.
Alex

10

Lancia un -p lì dentro per vedere alcuni CAMBIAMENTI DI FILE

git log -p master..branch

Crea alcuni alias:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Vedi i commit unici di una filiale:

gbl

6

Per visualizzare il registro del ramo corrente dalla diramazione del master:

git log master...

Se sei attualmente sul master, per vedere il registro di un ramo diverso dal momento in cui si è ramificato il master:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3dots) ma a volte mostra '+' invece di '='


3 punti mostra il primo commit sul ramo due volte mentre due no.
TJ Biddle,

2

ho trovato

git diff <branch_with_changes> <branch_to_compare_to>

più utile, poiché non si ottengono solo i messaggi di commit ma l'intera diff. Se sei già sul ramo di cui vuoi vedere le modifiche e (ad esempio) vuoi vedere cosa è cambiato nel master, puoi usare:

git diff HEAD master
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.