Come cercare un repository Git tramite il messaggio di commit?


828

Ho controllato del codice sorgente in GIT con il messaggio di commit "Build 0051".

Tuttavia, non riesco più a trovare quel codice sorgente - come posso estrarre questa fonte dal repository GIT, usando la riga di comando?

Aggiornare

  1. Controllato nelle versioni 0043, 0044, 0045 e 0046 utilizzando SmartGIT.
  2. Ho verificato 0043 e verificato le versioni fino a 0051 su un ramo diverso.
  3. Ho verificato di nuovo 0043.
  4. Ora, 0051 è scomparso.

Aggiornare

Il codice sorgente è sicuramente lì, ora si tratta di verificarlo:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>




2
Le risposte non appartengono alle domande su Stack Overflow. Sei stato un collaboratore abbastanza a lungo che dovresti saperlo. Se desideri fornire una risposta alla tua domanda, sei sicuramente il benvenuto . In alternativa, puoi modificare la risposta di shelhamer per migliorarla / espanderla.
Cody Grey

1
@Cody Mi riferisco a questo post di tanto in tanto. Non puoi semplicemente eliminare casualmente il testo, non è semplicemente cricket. Se vuoi eliminarlo, sei sicuramente il benvenuto a spostarlo nella tua risposta (e potresti anche ottenere alcuni voti per questo - sei stato un collaboratore abbastanza a lungo per sapere come funziona).
Contango

Risposte:


1284

Per cercare nel registro di commit (tra tutti i rami) il testo dato:

git log --all --grep='Build 0051'

Per cercare il contenuto effettivo di commit nella cronologia di un repository, utilizzare:

git grep 'Build 0051' $(git rev-list --all)

per mostrare tutte le istanze del testo dato, il nome del file contenente e il commit sha1.

Infine, come ultima risorsa nel caso in cui il tuo commit sia penzolante e per nulla connesso alla cronologia, puoi cercare il reflog stesso con la -gbandiera (abbreviazione di --walk-reflogs:

git log -g --grep='Build 0051'

EDIT: se sembra che tu abbia perso la tua storia, controlla reflogcome rete di sicurezza. Cerca Build 0051 in uno dei commit elencati da

git reflog

Potresti aver semplicemente impostato il tuo HEADsu una parte della storia in cui il commit 'Build 0051' non è visibile, o potresti averlo spazzato via. L' articolo reflog pronto per git può essere di aiuto.

Per recuperare il commit dal reflog : esegui un checkout git del commit che hai trovato (e facoltativamente crea un nuovo ramo o tag di esso come riferimento)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

2
con git grep 'Build 0051' $ (git rev-list --tutti) Ottengo sh.exe ": / bin / git: Il numero di file errato ha forse cambiato il modo di fare questo?
Jens Schauder

7
git log -i -grep
jhvaras

@JensSchauder Se riscontri un errore con git grep 'search' $(git rev-list --all), provagit rev-list --all | xargs git grep 'search'
afilina il

83

Ho inserito questo nel mio ~ / .gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

Quindi posso digitare "git find string" e ottengo un elenco di tutti i commit che contengono quella stringa nel messaggio. Ad esempio, per trovare tutti i commit facendo riferimento al ticket # 33:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

1
Bello, ma forse manca un ripristino del colore? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman,

4
Io preferisco per stampare il messaggio completo git (grep può essere successo lì, non nel titolo), quindi ho finito con: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Nota i caratteri --alle %b. Grazie @AshleyCoolman per la resetpunta.
Arcol,

Grazie. Ho trovato molto utile l'alias. Non mi piaceva la colorazione e ho trovato il formato online perfetto per questo. Inoltre è stato utile aggiungere -i per renderlo maiuscole e minuscole. ad es.find = log --oneline --name-status -i --grep
rapinare il

39

Anche se un po 'in ritardo, c'è :/qual è la notazione dedicata per specificare un commit (o revisione) in base al messaggio di commit, basta aggiungere il prefisso alla stringa di ricerca :/, ad esempio:

git show :/message

Qui <message>può esserci un complesso schema regex costituito da spazi bianchi, quindi assicurati di citare / scappare quando necessario, ad esempio:

git log -1 -p ":/a few words"

In alternativa, è possibile specificare un punto iniziale per trovare il commit più vicino raggiungibile da un punto specifico, ad esempio:

git show 'HEAD^{/fix nasty bug}'

Vedi: manuale di revisioni git .


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

19
git log --grep="Build 0051"

dovrebbe fare il trucco


1
Devo usare le virgolette doppie (") invece delle virgolette singole (').
frage

9

Prova questo!

git log | grep -b3 "Build 0051"

Grazie - ma non lo trova. Come posso cercare tra tutti i rami possibili?
Contango,

6
Si desidera utilizzare al git grepposto del grep normale e fornire la --allbandiera per cercare più rami.
Shelhamer,

Hmm - lo trovano anche le altre risposte? In caso contrario, potresti avere un problema più grande. Ci proverei git log --all --grep='Build 0051'(risposta di @ shelhamer)
Nic

Ho provato "git log --all", ed elenca solo le versioni a 0046. La versione 0051 era su un ramo diverso. Tornai a 0043 e 0051 scomparve.
Contango,

3
@Gravitas, prova il mio esempio che utilizza il reflog: quello con git log -g. Potresti aver perso la cronologia in un ripristino, ma puoi comunque controllare il reflog se non è stato raccolto.
Shelhamer,

4

prima uso git log --onelineper trovare lo SHA del commit (Message), poi ho usato git log --stat 8zad24dcon lo SHA (le prime coppie sha char esempio (8zad24d)) per trovare le informazioni giuste


1

Questo:

git log --oneline --grep='Searched phrase'

o questo:

git log --oneline --name-status --grep='Searched phrase'

i comandi funzionano meglio per me.


1

Per cercare in tutti i rami

git log --all --grep='Build 0051'

Una volta che sai quale impegno vuoi raggiungere

git checkout <the commit hash>

1

Se la modifica non è troppo vecchia, puoi fare,

git reflog

e quindi controlla l'id di commit

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.