Come ottenere le modifiche su un ramo in Git
Domanda
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?Notare che git diff HEAD...branch
mi dà le differenze che desidero, ma il corrispondente comando git log mi dà più di quello che voglio.
Nelle immagini, supponiamo questo:
x---y---z---branch / ---a---b---c---d---e---HEAD
Vorrei ottenere un registro contenente i commit x, y, z.
git diff HEAD...branch
dà questi commit- Tuttavia,
git log HEAD...branch
dà x, y, z, c, d, e.
Soluzione
Nel contesto di un elenco di revisione, A...B
ecco come git-rev-parse
lo definisce.git-log accetta un elenco di revisioni. git-diff
non accetta un elenco di revisioni: richiede una o due revisioni e ha definito il file A...B
sintassi per indicare come è definita nel file git-diff
manpage.Se git-diff
non ha definito esplicitamente A...B
, la sintassi non sarebbe valida.Si noti che il git-rev-parse
la pagina man descrive A...B
nella sezione "Specifica degli intervalli" e tutto in quella sezione è valido solo nelle situazioni in cui è valido un intervallo di revisione (ad es.quando si desidera un elenco di revisioni).
Per ottenere un registro contenente solo x, yez, prova git log HEAD..branch
(due punti, non tre).Questo è identico a git log branch --not HEAD
, e significa tutti i commit sul ramo che non sono su HEAD.
Altri suggerimenti
git cherry branch [newbranch]
fa esattamente quello che chiedi, quando sei nel master
ramo.
Sono molto affezionato anche a:
git diff --name-status branch [newbranch]
Il che non è esattamente quello che stai chiedendo, ma è comunque molto utile nello stesso contesto.
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
Questo è simile alla risposta che ho pubblicato su: Anteprima di un push Git
Trascina queste funzioni nel tuo profilo Bash:
- gbout - ramo git in uscita
- gbin - ramo git in entrata
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à ciò che è nel maestro che non è nella filiale 1
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
}
Simile a diverse risposte come quella di Alex V e NDavis, ma nessuna è esattamente la stessa cosa.
Quando già nella filiale in questione
Utilizzando:
git diff master...
Che unisce diverse funzionalità:
- è super corto
- mostra le modifiche effettive
Aggiornamento:
Questo probabilmente dovrebbe essere git diff master
, ma anche questo mostra la differenza, non i commit come specificato nella domanda.
Inserisci un -p lì dentro per vedere alcune MODIFICHE AI 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\`'
Visualizza i commit univoci di un ramo:
gbl
Per vedere il registro del ramo corrente dalla diramazione del master:
git log master...
Se sei attualmente su master, per vedere il registro di un ramo diverso da quando si è diramato dal master:
git log ...other-branch
git log --cherry-mark --oneline from_branch...to_branch
(3 punti) ma a volte mostra '+' invece di '='
ho trovato
git diff <branch_with_changes> <branch_to_compare_to>
più utile, dal momento che non ottieni solo i messaggi di commit ma l'intero 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