Czy ktoś może mi powiedzieć różnicę między HEAD, drzewem roboczym a indeksem w Git?
Z tego, co rozumiem, wszystkie są nazwami różnych gałęzi. Czy moje założenie jest prawidłowe?
Edytować
znalazłem to
Pojedyncze repozytorium git może śledzić dowolną liczbę gałęzi, ale twoje drzewo robocze jest powiązane tylko z jedną z nich (gałąź „bieżąca” lub „wyewidencjonowana”), a HEAD wskazuje na tę gałąź.
Czy to oznacza, że HEAD i działające drzewo są zawsze takie same?
git
version-control
Joyce Babu
źródło
źródło
HEAD
jest zatwierdzeniem na końcu bieżącej gałęzi. Jeśli właśnie sprawdziłeś gałąź, tj. Nie masz zmodyfikowanych plików, to jej zawartość odpowiada działającemu drzewu. Gdy tylko coś zmodyfikujesz, nie będzie już pasować.Staging Area
do tej listy. Co to jestHEAD
,Working Tree
,Index
orazStaging Area
Odpowiedzi:
Kilka innych dobrych referencji na te tematy:
(uwaga: jak skomentował przez Timo Huovinen te strzały nie dopuszcza, co wskazuje na to, że to rozkaz workflow , w zasadzie jak pokazano strzałkami
1 -> 2 -> 3 -> 4
, gdzie1
jest pierwszym popełnić i4
jest ostatni)źródło
Różnica między HEAD (bieżąca gałąź lub ostatni zatwierdzony stan w bieżącej gałęzi), indeksem (zwanym także obszarem przejściowym ) a drzewem roboczym (stan plików w kasie) jest opisana w sekcji „Trzy stany” w rozdziale „1.3 Podstawy Git ” rozdział książki Pro Git autorstwa Scott Chacon (licencja Creative Commons).
Oto obraz ilustrujący to z tego rozdziału:
W powyższym obrazie „katalog roboczy” jest taki sam jak „drzewo robocze”, „obszar przejściowy” to alternatywna nazwa git „index”, a HEAD wskazuje na aktualnie wypisaną gałąź, która wskazuje punkty do ostatniego zatwierdzenia w „ katalog git (repozytorium) ”
Zauważ,
git commit -a
że wprowadzi zmiany i zatwierdzi w jednym kroku.źródło
working tree
wydaje się być preferowaneworking directory
obecnie. Zobacz github.com/git/git/commit/…Twoje drzewo robocze znajduje się w plikach, nad którymi obecnie pracujesz.
HEAD
jest wskaźnikiem do gałęzi lub zatwierdzenia, które ostatnio wypisałeś, i który będzie rodzicem nowego zatwierdzenia, jeśli go wykonasz. Na przykład, jeśli jesteś wmaster
gałęzi, wtedyHEAD
wskażemaster
, a kiedy zatwierdzisz, to nowe zatwierdzenie będzie potomkiem rewizji, któramaster
wskazała, imaster
zostanie zaktualizowane, aby wskazywało na nowe zatwierdzenie.Wskaźnik jest obszarem, gdzie nowa inscenizacja jest gotów popełnić. Zasadniczo zawartość indeksu jest tym, co przejdzie do nowego zatwierdzenia (jeśli to zrobisz
git commit -a
, spowoduje to automatyczne dodanie wszystkich zmian do plików, o których Git wie o indeksie przed zatwierdzeniem, więc zatwierdzi bieżącą zawartość twojego drzewa roboczego ).git add
doda lub zaktualizuje pliki z drzewa roboczego do twojego indeksu.źródło
git commit -a
(musisz je dodaćgit add
), więc twoje drzewo robocze może zawierać dodatkowe pliki, które Twój indeks, lokalne repozytorium lub Twoje zdalne repozytorium nie ma.HEAD
odnosi się do ostatniego zatwierdzenia, więc kiedy zatwierdzasz, aktualizujeszHEAD
do nowego zatwierdzenia, które odpowiada indeksowi. Pchanie nie ma z tym wiele wspólnego - powoduje, że oddziały w oddziałach zdalnego dopasowywania w lokalnym repozytorium.Drzewo robocze
Twoje drzewo robocze to pliki, nad którymi obecnie pracujesz.
Indeks Git
„Indeks” git to miejsce, w którym umieszczasz pliki, które chcesz zatwierdzić w repozytorium git.
Indeks jest również znany jako pamięci podręcznej , pamięci podręcznej katalogu , aktualnego katalogu pamięci podręcznej , obszaru przemieszczania , wystawił plików .
Przed „zatwierdzeniem” (zameldowaniem) plików do repozytorium git, musisz najpierw umieścić pliki w „indeksie” git.
Indeks nie jest katalogiem roboczym: możesz wpisać polecenie takie jak
git status
, a git powie ci, jakie pliki w katalogu roboczym zostały dodane do indeksu git (na przykład za pomocągit add filename
polecenia).Indeks nie jest repozytorium git: pliki w indeksie git to pliki, które git zatwierdziłby w repozytorium git, jeśli użyto komendy git commit.
źródło
reset --hard HEAD
aby upewnić się, że twój indeks == twoje drzewo robocze. a następnie:mkdir history && git checkout-index --prefix history/ -a
Wynikiem jest powielenie całego drzewa roboczego w twoimhistory/
katalogu. Ergo git index> = katalog roboczy gitecho untracked-data > untracked-file
, przed lub po krokachgit reset --HARD
igit checkout-index
. Przekonasz się, że nieśledzonego pliku nie ma whistory
katalogu. Możesz także niezależnie modyfikować zarówno indeks, jak i drzewo robocze, chociaż modyfikowanie indeksu bez uprzedniego dotknięcia drzewa roboczego jest trudne (wymaga użyciagit update-index --index-info
).