Risposte:
git log
mostra l'attuale TESTA e i suoi antenati. Cioè, stampa i punti HEAD di commit, quindi il suo genitore, il suo genitore e così via. Attraversa le origini del repository, guardando ricorsivamente il genitore di ciascun commit.
(In pratica, alcuni commit hanno più di un genitore. Per vedere un registro più rappresentativo, usa un comando simile git log --oneline --graph --decorate
.)
git reflog
non attraversa affatto gli antenati di HEAD. Il reflog è un elenco ordinato dei commit indicati da HEAD: annulla la cronologia del tuo repository. Il reflog non fa parte del repository stesso (è memorizzato separatamente nei commit stessi) e non è incluso in push, fetch o cloni; è puramente locale.
A parte: capire il reflog significa che non puoi davvero perdere i dati dal tuo repository una volta che sono stati impegnati. Se si ripristina accidentalmente un commit precedente, o si fa un refase errato o qualsiasi altra operazione che "rimuove" visivamente i commit, è possibile utilizzare il reflog per vedere dove si trovava prima e git reset --hard
tornare a tale ref per ripristinare lo stato precedente. Ricorda, i ref implicano non solo il commit ma l'intera storia dietro di esso.
.git/logs/refs/<branch>
voci hanno il formato <old_rev> <new_rev> [...] <timestamp> [...]
. Puoi provare a concatenare e ordinare in base al timestamp. Tuttavia, alcune righe new_rev
potrebbero non corrispondere a quelle successive old_rev
, nel qual caso sospetto che il reflog non sia valido. Potresti quindi provare a inserire voci false per "correggere" la sequenza, ma mi sembra troppo seccante.
git log
mostra il registro di commit accessibile dagli ref (intestazioni, tag, telecomandi)git reflog
è una registrazione di tutti i commit che sono o sono stati referenziati nel tuo repository in qualsiasi momento.Ecco perché git reflog
(una registrazione locale che viene potata per impostazione predefinita dopo 90 giorni) viene utilizzata quando si esegue un'operazione "distruttiva" (come l'eliminazione di un ramo), al fine di recuperare lo SHA1 a cui faceva riferimento quel ramo.
Vedi git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire rimuove le voci di reflog precedenti a questa volta; il valore predefinito è 90 giorni.
Con "<pattern>
" (es. "refs/stash
") Al centro, l'impostazione si applica solo ai riferimenti che corrispondono a<pattern>
.
git reflog
è spesso indicato come "la tua rete di sicurezza "
In caso di problemi, il consiglio generale, quando git log non ti mostra quello che stai cercando, è:
Ancora una volta, reflog è una registrazione locale del tuo SHA1.
Al contrario git log
: se spingi il tuo repository verso un repository a monte , vedrai lo stesso git log
, ma non necessariamente lo stesso git reflog
.
Ecco la spiegazione del reflog
libro Pro Git :
Una delle cose che Git fa in background mentre stai lavorando è tenere un reflog - un registro di dove sono stati i tuoi riferimenti HEAD e branch negli ultimi mesi.
Puoi vedere il tuo reflog usando
git reflog
:$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
Ogni volta che il tuo consiglio di filiale viene aggiornato per qualsiasi motivo, Git memorizza tali informazioni per te in questa cronologia temporanea. E puoi anche specificare commit precedenti con questi dati.
Il reflog
comando può anche essere utilizzato per eliminare voci o scadere dal reflog voci troppo vecchie. Dalla documentazione ufficiale di Linux Kernel Git perreflog
:
Il sottocomando
expire
viene utilizzato per eliminare le voci di reflog meno recenti.Per eliminare singole voci dal reflog, utilizzare il sottocomando
delete
e specificare la voce esatta (ad esgit reflog delete master@{2}
.).
git log
fornisce le stesse informazioni? Scusate se sembra ovvio, sono molto nuovo con GIT e vorrei avere alcune nozioni di base proprio prima del mio primo OMG.
HEAD
puntatore) e a quali commit hanno puntato. Ha senso? Su un lato nota, log
può anche mostrare reflog informazioni, ma si deve passare un flag di opzione speciale come argomento ad esso, --walk-reflogs
.
Ero curioso anche di questo e voglio solo elaborare e sintetizzare un po ':
git log
mostra una cronologia di tutti i tuoi commit per la filiale in cui ti trovi. Acquista un ramo diverso e vedrai una cronologia di commit diversa. Se vuoi vedere che commetti la cronologia per tutti i rami, digita git log --all
.
git reflog
mostra una registrazione delle tue referenze come ha detto Cupcake. C'è una voce ogni volta che viene eseguito un commit o un checkout. Prova a passare avanti e indietro tra due rami alcune volte usando git checkout
ed esegui git reflog
dopo ogni checkout. Vedrai la voce principale essere aggiornata ogni volta come una voce "checkout". Non vedi questi tipi di voci in git log
.
Riferimenti: http://www.lornajane.net/posts/2014/git-log-all-branches
Mi piace pensare alla differenza tra git log e reflog come la differenza tra un record privato e un record pubblico.
Con il reflog di git, tiene traccia di tutto ciò che hai fatto localmente. Ti sei impegnato? Reflog lo segue. Hai effettuato un hard reset? Reflog lo segue. Hai modificato un commit ? Reflog lo segue. Tutto ciò che hai fatto localmente, c'è una voce per esso nel reflog.
Questo non è vero per il registro. Se si modifica un commit, il registro mostra solo il nuovo commit. Se esegui un ripristino e salti indietro alcuni commit nella tua cronologia, i commit che hai saltato non verranno visualizzati nel registro. Quando invii le modifiche a un altro sviluppatore o a GitHub o qualcosa del genere, verrà visualizzato solo il contenuto monitorato nel registro. A un altro sviluppatore, sembrerà che i ripristini non siano mai avvenuti o che le modifiche non siano mai avvenute.
Quindi sì, mi piace l'analogia "privato vs pubblico". O forse un registro migliore vs reflog analogia tra è "lucidata vs lapidaria". Il reflog mostra tutte le tue prove ed errori. Il registro mostra solo una versione pulita e raffinata della tua cronologia di lavoro.
Dai un'occhiata a questa immagine per enfatizzare il punto. Si sono verificati numerosi emendamenti e ripristini dall'inizializzazione del repository. Il reflog mostra tutto. Tuttavia, il comando log fa sembrare che ci sia mai stato un solo commit contro il repository:
Inoltre, poiché il reflog tiene traccia delle cose che hai modificato e commette il ripristino , ti consente di tornare indietro e trovare tali commit perché ti darà gli ID di commit. Supponendo che il tuo repository non sia stato eliminato dai vecchi commit, ciò ti consente di resuscitare gli elementi non più visibili nel registro. È così che il reflog a volte finisce per salvare la pelle di qualcuno quando hanno bisogno di recuperare qualcosa che pensavano di aver perso inavvertitamente.
In realtà, reflog è un alias per
git log -g --abbrev-commit --pretty=oneline
quindi la risposta dovrebbe essere: è un caso specifico.
git log
, -g
è la forma abbreviata di --walk-reflogs
. Quindi, ciò non spiega nulla.