2010-06-09 13 views
11

Quando faccio un git tag, non sono sempre bravo a ricordare se HEAD ~ 6 (ad esempio) è inclusivo o esclusivo.C'è un modo per ottenere lo SHA di un commit dal suo messaggio?

Dato che la maggior parte dei miei commit sono preceduti da un numero di rilascio, mi sono chiesto se c'è qualche comando magico per cercare SHA di commit da parte del suo messaggio.

so che è facile da fare un git log e lavorare da lì, ma voglio di più facile :)

EDIT: Qualcuno ha anche posto la domanda opposta: In Git, is there a way to get the “friendly” name for an arbitrary commit?

risposta

17

È possibile utilizzare la sintassi :/blah per specificare un commit il cui messaggio di commit inizia con il testo specificato.

E.g.

git show ":/Issue #299" 

Questo è valido ovunque possa essere utilizzato un commit. Per esempio.

git cherry-pick ":/Issue #299" 

Se è effettivamente necessario lo SHA-1 del commit, è possibile utilizzare rev-parse.

git rev-parse ":/Issue #299" 

Vedere il "SPECIFYING REVISIONS" section of the git rev-parse man page:

due punti, seguito da una barra, seguito da un testo:
Questa nomi a commettere il cui messaggio di commit inizia con il testo specificato.
Questo nome restituisce il commit di corrispondenza più giovane che è raggiungibile da qualsiasi riferimento.
Se il messaggio di conferma inizia con !, è necessario ripetere ciò; la sequenza speciale :/!, seguita da qualcosa di diverso da ! è riservata per ora.

+0

Cosa succede se il testo non è univoco? – Benjol

+0

@Benjol: IIRC, trova il commit più giovane raggiungibile, dovrai controllare la documentazione. –

+0

Grazie, qualsiasi idea di una parola chiave per vederlo in su ': /' non funziona troppo bene ... – Benjol

1

Prova

git rev-list --grep='message excerpt' HEAD 

Questo elencherà solo i commit che sono antenati di HEAD. Se si desidera eseguire la ricerca di tutti i commit nel repository (compresi quelli che non sono antenati di HEAD), non sono sicuro di come farlo se non eseguendo manualmente manualmente tutte le diramazioni e eseguendo questo comando. (Probabilmente c'è un modo, semplicemente non so cosa potrebbe essere)

8
git log --grep=word 

dovrebbe aiutare a trovare il commit pertinente.
(al contrario di ricerca di commit contents, dove git log -S (opzione piccone) o git grep sono più appropriato)

Aggiungere varie opzioni di formato come

git log --grep=word --pretty=oneline 
git log --grep=word --pretty=format:"%h" 

(l'ultimo che visualizza solo lo SHA1), e Sei bravo ad andare.


Vedere anche "Fun with git log --grep"

git log --grep=frotz --grep=nitfol --since=1.month 

questo trova i commit che è accaduto nel corso dell'ultimo mese e menzionati sia frotz o nitfol nei loro messaggi di log di commit.
Come con il solito "git grep", dare più di un modello significa "questo o quello".

L'articolo fa notare che è git grep linea orientata, e utilizzare anche l'opzione -a-partita in questo comando git log --grep.

Il modo in cui la famiglia "git log" utilizza il meccanismo di grep è esattamente per questo "l'insieme ha una corrispondenza?" aspetto, non "mostrami le linee che corrispondono a questi criteri" aspetto. Esso consente di utilizzare questo meccanismo in questo modo:

Questo mostrerà commit che menzionano frotz e scritto da Linus.

+0

Stavo cercando qualcosa che potrei usare/pipe direttamente in un altro comando, quindi se aggiungi '--pretty = format:"% h "' a quello, ti segnerò come risposta;) – Benjol

+0

L'aggiunta di --pretty = online al comando dovrebbe migliorare ulteriormente la leggibilità. – Unknown

+0

@Benjol: aggiunte le opzioni di formattazione. – VonC

Problemi correlati