2010-11-06 13 views
12

Trochę zdezorientowany ..co znaczy osiągalny/nieosiągalny w git?

W git community manual, to mówi poleceń dziennik

git może pokazać list zobowiązuje. Sam w sobie pokazuje wszystkie zobowiązania, które można uzyskać z nadrzędnego zatwierdzenia ; ale można też zrobić więcej konkretne wnioski

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

Myślałem dziennika git sama pokazuje tylko ty się commity wykonane do bieżącego oddziału, a rewizje są sekwencyjne - tak jak można mieć jeden commit dokonane od inny, ale nieosiągalny z tego?

Myślę, że albo błędnie rozumiem, co robi dziennik GIT, co nieosiągalne, albo oba .. wdzięczny za jakąkolwiek pomoc!

+5

Och, myślę, że rozumiem. Ponieważ każde zatwierdzenie przechowuje tylko element nadrzędny, możesz utworzyć listę zatwierdzeń z każdego zatwierdzenia, ale nie przekazać dalej. Dlatego też żadne zatwierdzenie od tego czasu nie jest osiągalne. – bruce

+0

Prawidłowo. W ten sposób git znajduje wszystkie informacje. Zaczyna się od określonego znanego punktu (na przykład oddziału, który wskazuje na dany obiekt commit) i przechodzi stamtąd przez odniesienia do innych obiektów (np. Rodzic (y) zatwierdzenia).Jest to to samo, co w przypadku znalezienia treści związanej z zatwierdzeniem - efektywnie przechodzi przez strukturę katalogów (wewnętrznie reprezentowaną jako drzewa) do każdego pliku (którego zawartość jest przechowywana jako obiekty blob). – Cascabel

Odpowiedz

11

w Git, każde zatwierdzenie (z wyjątkiem pierwszego) będzie miało zatwierdzenie nadrzędne. Wynika z tego, że każde zatwierdzenie (z wyjątkiem pierwszego) jest dzieckiem jednego (lub może więcej niż jednego) innego zatwierdzenia. W Git możesz również mieć kilka gałęzi rozwoju, które zaczynają się lub odbiegają od konkretnego zatwierdzenia przodków. Nic w Git nie mówi, że zatwierdzenia muszą wystąpić w porządku chronologicznym lub liniowym, a zatem narzędzie git log musi być w stanie radzić sobie z kilkoma sposobami sprawdzania historii.

Na przykład załóżmy, że rozwijać moją aplikację i zrobić rewizje w kolejności alfabetycznej:

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

W tym przykładzie należy Zrobiłem nowy oddział na popełnienia i E.

Gdybym uruchomić git log <D> (gdzie <D> jest popełnić na SHA), to historia dziennika wyglądałby następująco:

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

Od tego dokonać, tylko rodzice i ich przodkowie mogą być "widziani". Zaangażowania B, E, F i G są technicznie "nieosiągalne" po zatwierdzeniu D, ponieważ nie mają wspólnych wspólnych zatwierdzeń dla rodziców.

+2

Dzięki. To ma sens. – bruce

+2

To trochę myląco napisane - znaczniki czasu nie mają z tym nic wspólnego. A "git log" tak naprawdę "nie pyta historii" w żaden sposób, ale "przodek". Jeśli poprosisz o coś chronologicznie, to nadal chodzi o łańcuch przodków; po prostu sprawdza metadane i stosuje ograniczenia czasowe. – Cascabel

+1

tak, masz całkowitą rację - znaczniki czasu mają niewiele wspólnego z działaniem logu git. Próbowałem to zilustrować, choć być może uda mi się lepiej zilustrować ten punkt. – Chris

6

"Y jest osiągalny z X" oznacza, że ​​obiekt Y jest osiągalny z DAG. Zależy od tego, co jest Y, może to oznacza:

  • Y jest popełnić: Y jest rodzicem/przodek X.
  • Y jest katalog/folder/blob: Y jest częścią (powiedzieć) zatwierdzenie w drzewie nadrzędnym/przodka X.

Dla niektórych doc (np. git-fsck), po prostu mówi "Y jest osiągalny". Oznacza to, że Y jest osiągalne z jakiegoś znacznika/gałęzi (to znaczy Y nie może być zbierane śmieci)

+2

Wskazówka: jako początkujący gita raczej nie będę wiedział, co oznacza DAG. Twoja cała odpowiedź przeszła mi przez głowę. – bruce

+1

@bruce: Reżyserowany acykliczny wykres. Wszystko wokół tego jest zbudowane. Obiekt commit zawiera odniesienie do jego rodzica (rodziców), ale nie jego dziecko (dzieci). W ten sam sposób, commit zna swoje drzewo (w zasadzie wykaz katalogów), który wie, co blobs (zasadniczo zawartość pliku) i inne drzewa, które zawiera, i tak dalej, ale żaden z nich nie zna swoich rodziców. Zobacz na przykład [model obiektu git] (http://book.git-scm.com/1_the_git_object_model.html) w książce społeczności git. – Cascabel

+2

Dodałem link do http://eagain.net/articles/git-for-computer-scientists/ (git dla informatyków) –