2010-11-06 18 views
12

po 'confuso ..che cosa significa raggiungibile/irraggiungibile in git?

Nel git community manual, si dice comando log

GIT può mostrare liste di commit. Da solo, mostra tutti i commit raggiungibili dal genitore commit; ma si può anche fare più richieste specifiche

$ git log v2.5.. # commits since (not reachable from) v2.5 

ho pensato git log da solo i commit apportate al ramo corrente mostra solo, ed i commit sono sequenziali - così come si può avere un commit effettuato dal un altro, ma irraggiungibile da esso?

Penso di non aver capito male cosa fa git log o cosa significa irraggiungibile o entrambi .. grati per qualsiasi aiuto!

+5

Oh, penso di aver capito. Poiché ogni commit memorizza solo il suo genitore, puoi creare un elenco di commit da qualsiasi commit, ma non in avanti. Pertanto qualsiasi commit non è raggiungibile da. – bruce

+0

corretto. Ecco come git trova tutte le informazioni. Inizia da un dato punto noto (ad esempio un ramo, che punta a un dato oggetto di commit), e si fa strada da lì attraverso i riferimenti ad altri oggetti (ad esempio il genitore (i) del commit).Questo è lo stesso del modo in cui trova il contenuto associato al commit: attraversa efficacemente la struttura delle directory (rappresentata internamente come alberi) in ogni file (il cui contenuto è memorizzato come BLOB). – Cascabel

risposta

11

in Git, ogni commit effettuato (tranne il primo) avrà un commit padre. Ne segue che ogni dato commit (tranne il primo) è figlio di uno (o forse più di uno) altro commit. Puoi anche avere diversi rami di sviluppo in Git, che iniziano o deviano in un particolare commit ancestrale. Nulla in Git stabilisce che i commit debbano avvenire in ordine cronologico o lineare, e quindi lo strumento git log deve essere in grado di gestire diversi modi di interrogare la cronologia.

Per esempio, assumere ho sviluppato la mia domanda e fare commit in ordine alfabetico:

---A---B---E---G 
    \  \ 
    C---D F 

In questo esempio, devo aver fatto una nuova filiale a commettere A ed E.

Se fossi per eseguire git log <D> (dove <D> è l'SHA del commit), allora la storia del registro sarebbe simile a questa:

D---C---A--- 

da quel commit, solo il i genitori e i loro antenati commettono possono essere 'visti'. I commit B, E, F e G sono tecnicamente "irraggiungibili" dal commit D, in quanto non condividono nessun commit padre connesso in comune.

+2

Grazie. Questo ha perfettamente senso. – bruce

+2

Questo è un po 'scritto in modo confuso - i timestamp non hanno nulla a che fare con questo. E 'git log' in realtà non" query history ", ma" ancestral ". Se lo chiedi per qualcosa di cronologico, continua a camminare nella catena degli antenati; esamina solo i metadati e applica le restrizioni temporali. – Cascabel

+1

sì, hai ragione - i timestamp hanno poco a che fare con il log di git. Stavo tentando di illustrarlo, anche se potrei essere in grado di illustrare meglio il punto. – Chris

6

"Y è raggiungibile da X" significa che l'oggetto Y è raggiungibile dallo DAG. Dipende da cosa Y è, questo può significa:

  • Y è un commit: Y è un genitore/antenato di X.
  • Y è una directory/cartelle/blob: Y è una parte di (a dire) un commit nell'albero principale/antenato di X.

per alcuni doc (es git-fsck), semplicemente dire "Y è raggiungibile". Ciò significa che Y è raggiungibile da qualche tag/ramo (cioè Y non può essere raccolto automaticamente)

+2

Suggerimento: come newbie git, è improbabile sapere cosa significhi DAG. Tutta la tua risposta è andata dritta sopra la mia testa. – bruce

+1

@bruce: grafico aciclico orientato. Tutto in git è costruito attorno a questo. Un oggetto commit contiene un riferimento ai suoi genitori, ma non al suo child (ren). Allo stesso modo, un commit conosce il suo albero (essenzialmente elenco di directory), che sa quali blob (essenzialmente il contenuto del file) e altri alberi che contiene, e così via, ma nessuno di loro conosce i loro genitori. Vedi ad esempio il [git object model] (http://book.git-scm.com/1_the_git_object_model.html) nel libro della community git. – Cascabel

+2

Ho aggiunto un collegamento a http://eagain.net/articles/git-for-computer-scientists/ (git for computer scientist) –