2013-07-25 21 views
91

La pagina man indica che il registro mostra i registri di commit e il reflog gestisce le informazioni di reflog. Cosa sono esattamente le informazioni di reflog e cosa ha che il registro non ha? Il registro sembra molto più dettagliato.Qual è la differenza tra git reflog e log?

risposta

119

git log mostra l'attuale HEAD e la sua discendenza. Cioè, stampa i punti HEAD di commit su, quindi i suoi genitori, i suoi genitori e così via. Attraversa la discendenza del repository, guardando in modo ricorsivo su ciascun genitore del commit.

(In pratica, alcuni commit hanno più di un genitore. Per vedere un registro più rappresentativo, utilizzare un comando come git log --oneline --graph --decorate.)

git reflog non attraversare antenati di HEAD a tutti. Il reflog è un elenco ordinato dei commit che HEAD ha indicato: è la cronologia degli annullamenti per il repository. Il reflog non fa parte del repository stesso (è memorizzato separatamente per i commit stessi) e non è incluso in push, fetch o cloni; è puramente locale.

A parte: la comprensione del reflog significa che non è possibile perdere i dati dal repository una volta che è stato eseguito il commit. Se si ripristina accidentalmente un commit precedente, o il rebase errato, o qualsiasi altra operazione che visivamente "rimuove" commette, è possibile utilizzare il reflog per vedere dove si trovava prima e git reset --hard indietro a tale riferimento per ripristinare lo stato precedente. Ricorda, i ref implicano non solo il commit ma l'intera storia dietro di esso.

+11

Una parola di cautela: a volte PUOI perdere i dati perché le voci di reflog non persistono eternamente - vengono eliminate in determinate condizioni. Vedi [questa risposta] (http://stackoverflow.com/a/26451688/1614641) e i documenti per [git-reflog] (https://www.git-scm.com/docs/git-reflog) e [ git-gc] (https://www.git-scm.com/docs/git-gc). Generalmente, se l'operazione distruttiva non era più di 2 settimane fa, probabilmente sei al sicuro. – mcmlxxxvi

+0

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

7

Ecco il explanation of reflog from the Pro Git book:

Una delle cose che Git fa in background mentre si lavora lontano è tenere un reflog - un registro di cui la testa e filiali riferimenti sono stati per gli ultimi mesi .

Potete vedere il vostro reflog utilizzando git reflog:

$ git reflog 
734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated 
d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 
1c002dd... [email protected]{2}: commit: added some blame and merge stuff 
1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 
95df984... [email protected]{4}: commit: # This is a combination of two commits. 
1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 
7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD 

Ogni volta che la punta ramo viene aggiornato per qualsiasi motivo, Git registra l'informazione per voi in questa storia temporanea. E puoi anche specificare i vecchi commit con questi dati.

Il comando reflog può anche essere utilizzato per eliminare voci o scadere le voci dal reflog che sono troppo vecchie. Dal official Linux Kernel Git documentation for reflog:

Il sottocomando expire è usato per potare le voci reflog anziani.

Per eliminare singole voci dal reflog, utilizzare il sottocomando delete e specificare la voce esatta (ad esempio git reflog delete [email protected]{2}).

+0

Ma non il 'git log' fornire le stesse informazioni?Scusate se sembra ovvio, sono molto nuovo a GIT e vorrei avere alcune basi prima del mio primo OMG. – Noich

+2

Git log è un record del tuo *** *** ***. Il reflog, come afferma il libro Pro Git, è una registrazione dei tuoi *** riferimenti *** (in pratica, i tuoi puntatori di ramo e il tuo puntatore "HEAD'), e che commettono a cui hanno puntato. Ha senso? In una nota a margine, 'log' può anche mostrare le informazioni di reflog, ma devi passare un flag di opzione speciale come argomento,' --walk-reflogs'. –

+1

Inoltre, dato che sei un principiante 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 inoltre vivamente di imparare come rebase sia interattivamente che in modo non interattivo. –

32
  • git log mostra il commit di registro accessibile dagli arbitri (teste, tag, telecomandi)
  • git reflog è un record di di tutti i commit che sono o sono state utilizzate in pronti contro termine in qualsiasi momento.

Ecco perché git reflog (un locale di registrazione che viene potata dopo 90 giorni per impostazione predefinita) viene utilizzato quando si esegue un'operazione di "distruttivo" (come l'eliminazione di un ramo), al fine di recuperare l'SHA1 che è stato riferito da quel ramo.
Vedi git config:

gc.reflogexpire 
gc.<pattern>.reflogexpire 

git reflog scadono rimuove le voci reflog di età superiore a questo momento; il valore predefinito è 90 giorni.
Con "<pattern>" (ad esempio "refs/stash") nel mezzo l'impostazione si applica solo ai riferimenti che corrispondono allo <pattern>.

safety net

git reflog è spesso riferimento come "your safety net"

In caso di problemi, il consiglio generale, quando git log non mostra ciò che si sta cercando, è:

"Keep calm and use git reflog"

keep calm

Di nuovo, reflog è una registrazione locale del tuo SHA1.
In contrasto con git log: se si spinge il repository su un upstream repo, si vedrà lo stesso git log, ma non necessariamente lo stesso git reflog.

1

ero curioso di questo come bene e vogliono solo per elaborare e riassumere un po ':

  1. git log mostra una storia di tutti i commit per il ramo si è in. Esegui il checkout di un altro ramo e vedrai una cronologia di commit diversa. Se si desidera visualizzare la cronologia di commit per tutti i rami, digitare git log --all.

  2. git reflog mostra un record dei tuoi riferimenti come ha detto Cupcake. C'è una voce ogni volta che un commit o un checkout è fatto. Prova a passare avanti e indietro tra due rami un paio di volte usando git checkout ed esegui git reflog dopo ogni checkout. Vedrai la voce più alta che viene aggiornata ogni volta come una voce di "checkout". Non vedi questi tipi di voci in git log.

Riferimenti: http://www.lornajane.net/posts/2014/git-log-all-branches

Problemi correlati