2015-08-13 22 views
11

Come posso trovare il numero di commit tra due commit in git?Numero di commit tra due commit

Inoltre, c'è un modo che potrei fare lo stesso con qualsiasi progetto su GitHub (utilizzando l'interfaccia utente, non l'API)?

+0

Se si dispone di due commit hai il loro numero di revisione no? Sottrarre i due? Potrei semplificare o non capire la domanda. –

+0

@CarlosBribiescas in 'git', un commitish non è necessariamente un ID di commit. Inoltre, anche se si hanno gli ID di commit, in git, gli ID di commit sono gli hash (ff3823ac, 554fbae3, ecc.). – haneefmubarak

risposta

14

Prima di darvi una risposta, considerare questo commettere grafico:

 o ----------- 
    /   \ 
... - A - o - o - o - B 
     \  /
     o ----- o 

Ogni o rappresenta un commit, come fanno A e B (sono solo le lettere per parliamo specifiche commit) . Quanti commit ci sono tra commit A e B?

Detto questo, nei casi più lineare, basta usare git rev-list --count A..B e poi decidere cosa si intende per "tra" (cosa comprende B ed escludere A? È così che git rev-list --count si comporteranno). In casi simili a questi, otterrai tutti i commit su tutti i rami; aggiungi --first-parent, ad esempio, per seguire solo la "linea principale".

(È anche menzionato "commitish", suggerendo che potremmo avere i tag annotate Ciò non influenzerà l'uscita dal git rev-list, che conta solo i commit specifiche..)


Edit: Dato git rev-list --count A..B include commettere B (omettendo commit A) e si desidera escludere entrambi i punti finali, è necessario sottrarre uno. In conchiglie moderni si può fare questo con le coperture aritmetica:

count=$(($(git rev-list --count A..B) - 1)) 

Per esempio:

$ x=$(($(git rev-list --count HEAD~3..HEAD) - 1)) 
$ echo $x 
2 

(questo particolare repo ha una struttura grafico molto lineare, quindi non ci sono rami qui e ci sono due commit "tra" la punta e tre dietro la punta). Si noti, tuttavia, che questo produrrà -1 se A e B identificare il stesso commettono:

$ x=$(($(git rev-list --count HEAD..HEAD) - 1)) 
$ echo $x 
-1 

così si potrebbe desiderare di controllare che prima:

count=$(git rev-list --count $start..$end) 
if [ $count -eq 0 ]; then 
    ... possible error: start and end are the same commit ... 
else 
    count=$((count - 1)) 
fi 
+0

Che cosa fai se vuoi ottenere il totale tra tutti i rami aggiunti? Inoltre, in mezzo, stavo pensando ad "esclusivo" (esclude A & B). – haneefmubarak

+0

Il comando 'git rev-list' (provalo senza' --count') gira il grafico, stampando lo SHA-1 di ogni commit selezionato. La notazione 'A..B' significa" seleziona ogni commit raggiungibile a partire da B e ripristina tutti i commit parent, ma esclude ogni commit raggiungibile partendo da A e lavorando di nuovo ", quindi se vuoi tutti loro, si ' ri in grande forma, perché è quello che ottieni. Nel frattempo, dato che 'rev-list' include' A' stesso, sottrai uno. – torek

+0

potresti inserire il commento nella tua risposta insieme a un solo liner che sottrae anche uno (magari conduci il risultato in '| xargs expr -1 +') e poi lo contrassegnerò come corretto – haneefmubarak

5
$ git log 375a1..58b20 --pretty=oneline | wc -l 

Specificare il commit iniziale seguito dal commit finale, quindi contare le righe. Questo dovrebbe essere il conteggio dei commit tra questi due intervalli di commit. Utilizzare la formattazione --pretty=online in modo che ogni commit occupi una singola riga.

Per quanto riguarda la GUI in GitHub, non conosco un modo per eseguire lo stesso compito. Ma ciò dovrebbe essere banale, poiché quanto sopra è il modo possibile di farlo direttamente in Git Bash.

Problemi correlati