Qual è la differenza tra git reflog e log?


158

La pagina man dice che log mostra i log di commit e reflog gestisce le informazioni di reflog. Che cosa sono esattamente le informazioni di reflog e cosa non ha il registro? Il registro sembra molto più dettagliato.

Risposte:


221

git logmostra 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 reflognon 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 --hardtornare a tale ref per ripristinare lo stato precedente. Ricorda, i ref implicano non solo il commit ma l'intera storia dietro di esso.


26
Un avvertimento: a volte PUOI perdere i dati perché le voci di reflog non persistono per l'eternità - vengono eliminate a determinate condizioni. Vedi questa risposta e i documenti per git-reflog e git-gc . Generalmente, se l'operazione distruttiva non è avvenuta più di 2 settimane fa, molto probabilmente sei al sicuro.
mcmlxxxvi,

@mcmlxxxvi Ho due cartelle locali per lo stesso repository, posso unire i reflog per le due cartelle?
Tmx

@Tmx, non capisco bene il tuo caso: cosa intendi per due cartelle locali per lo stesso repository ? Se si hanno due cloni dello stesso repository, che sono aggiornati e si desidera "unire" la cronologia delle modifiche, le .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_revpotrebbero 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.
mcmlxxxvi il

62
  • 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 reflogexpire 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>.

rete di sicurezza

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, è:

" Mantieni la calma e usagit reflog "

stai calmo

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.


14

Ecco la spiegazione del refloglibro 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 reflogcomando può anche essere utilizzato per eliminare voci o scadere dal reflog voci troppo vecchie. Dalla documentazione ufficiale di Linux Kernel Git perreflog :

Il sottocomando expireviene utilizzato per eliminare le voci di reflog meno recenti.

Per eliminare singole voci dal reflog, utilizzare il sottocomando deletee specificare la voce esatta (ad es git reflog delete master@{2}.).


Ma non ti git logfornisce 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.
Noich,

2
Git log è un registro dei tuoi commit . Il reflog, come afferma il libro di Pro Git, è una registrazione dei tuoi riferimenti (in sostanza, i tuoi puntatori di diramazione e il tuo HEADpuntatore) e a quali commit hanno puntato. Ha senso? Su un lato nota, logpuò anche mostrare reflog informazioni, ma si deve passare un flag di opzione speciale come argomento ad esso, --walk-reflogs.

3
Inoltre, poiché sei un principiante di Git, ti consiglio vivamente di leggere il libro Pro Git, è come ho imparato la maggior parte di ciò che ho imparato su Git. Raccomando i capitoli 1-3 e 6-6.5. Consiglio anche vivamente di imparare come rifare sia interattivamente che non interattivamente.

8

Ero curioso anche di questo e voglio solo elaborare e sintetizzare un po ':

  1. git logmostra 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.

  2. git reflogmostra 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 checkouted esegui git reflogdopo 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


1

Mi piace pensare alla differenza tra git log e reflog come la differenza tra un record privato e un record pubblico.

Privato vs 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.

Il registro è lucido. Il reflog è lapidario.

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:

Il registro è lucido.  Reflog è lapidario.

Torna all'idea della "rete di sicurezza"

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.


-6

In realtà, reflog è un alias per

 git log -g --abbrev-commit --pretty=oneline

quindi la risposta dovrebbe essere: è un caso specifico.


9
In git log, -gè la forma abbreviata di --walk-reflogs. Quindi, ciò non spiega nulla.
Adrian W,
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.