Come ottenere la cronologia di commit per un solo ramo?


128

Diciamo che ho creato una nuova filiale my_experimentda cui ho masterfatto diversi commit my_experiment. Se eseguo un git logtentativo my_experiment, vedo i commit effettuati su questo ramo, ma anche i commit effettuati masterprima della my_experimentscreazione del ramo.

Troverei molto utile vedere la storia di tutti i commit nel my_experimentsramo fino a quando non colpisce la creazione di quel ramo - effettivamente una vera storia di quel ramo. Altrimenti non mi è chiaro quando guardo attraverso il registro se i commit erano sul my_experimentsramo o meno.

C'è un modo per farlo con Git?

Risposte:


139

È possibile utilizzare un intervallo per farlo.

git log master..

Se hai controllato la tua my_experimentfiliale. Questo confronterà dove si mastertrova HEAD(la punta di my_experiment).


3
Ok ha parlato troppo presto. Lo ha fatto per il mio semplice esempio. Ma ora sto guardando il vero repository di qualcun altro e mi viene in mente che per usare correttamente questo comando, dovrei sapere da quale ramo è stato creato il mio ramo attuale. Forse dovrei essere in grado di dirlo da Gitk ma non è ovvio per me. qualche idea?
Marplesoft,

@Marplesoft Può essere complicato capirlo. Vedere questa domanda .
alex

Potresti spiegare brevemente come funziona? Cosa git log master..dice Git?
tonix,

2
@tonix Segui il link nella risposta per maggiori informazioni su come funziona un intervallo (la master..) parte.
alex

7

Il git merge-basecomando può essere utilizzato per trovare un antenato comune. Quindi se my_experiment non è stato ancora unito a master e my_experiment è stato creato da master, potresti:

git log --oneline `git merge-base my_experiment master`..my_experiment

Se vuoi includere il genitore del tuo primo commit, aggiungi ^ e - first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie,

7

Nota: se si limita quel registro all'ultimo n commit (ultimi 3 commit ad esempio, git log -3), assicurarsi di inserire uno spazio tra 'n' e il proprio ramo:

git log -3 master..

Prima di Git 2.1 (agosto 2014), questo errore: git log -3master..ti mostrerebbe effettivamente gli ultimi 3 commit del ramo corrente (qui my_experiment), ignorando il masterlimite (nel senso che se my_experimentcontiene solo un commit, 3 sarebbero ancora elencati, 2 dei quali ancora master)

Vedi commit e3fa568 di Junio ​​C Hamano ( gitster) :

revisione: analizzare " git log -<count>" più attentamente

Questa riga di comando errata ignora semplicemente " master" e finisce per mostrare due commit dalla corrente HEAD:

$ git log -2master

perché alimentiamo " 2master" atoi()senza assicurarci che l'intera stringa venga analizzata come un numero intero.

Utilizzare strtol_i()invece la funzione helper.


1

Puoi usare solo git log --oneline


Mentre questo codice può rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
DebanjanB,

1

Penso che un'opzione per i tuoi scopi sia git log --online --decorate. Ciò ti consente di conoscere il commit verificato e i commit principali per ogni ramo presente nella trama. In questo modo, hai una bella vista sulla struttura del tuo repository e sui commit associati a un ramo specifico. Penso che leggere questo potrebbe aiutare.


0

So che è molto tardi per questo ... Ma ecco un (non così semplice) oneliner per ottenere quello che stavi cercando:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Stiamo elencando i commit con il nome della filiale e le posizioni relative negli stati della filiale effettivi con git show-branch(inviando gli avvisi a/dev/null ).
  • Quindi conserviamo solo quelli con il nome della nostra filiale all'interno della parentesi grep -E "\[$BRANCH_NAME" .
  • Dove effettivo $BRANCH_NAMEsi ottiene con git branch | grep -E '^\*' | awk '{ printf $2 }'(il ramo con una stella, echeggiato senza quella stella).
  • Dai nostri risultati, rimuoviamo la linea ridondante all'inizio con tail -n+2 .
  • E poi, ci fianlly ripulire l'uscita, eliminando tutto ciò che precede [$BRANCH_NAME]con sed -E "s/^[^\[]*?\[/[/".
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.