Co tak naprawdę oznaczają kasy git?

96

Co jest checkoutw git?

Wiem, że kiedy zrobisz coś checkoutdla określonej gałęzi, HEADwskazuje na tę gałąź. Ale co to naprawdę oznacza? Czy to oznacza, że ​​mogę wtedy pracować w tej gałęzi? Jeśli tak, to bez sprawdzenia oddziału nie mogę nad nim pracować?

Co to remote checkoutznaczy? Jak to jest przydatne?

daehaai
źródło
1
Brak wziętych. Tak, mam i trafiam na teorię, co to znaczy. tj. wskaż HEAD itp. Ale chcę wiedzieć z punktu widzenia "kod do kasy - dokonaj zmian - zamelduj", czy jest inaczej?
daehaai
25
@antonijn - próbowałem googlować pytanie - to jest pierwszy wynik - trochę smutne, że kiedy tu dotarłem, zobaczyłem, że pytanie jest zamknięte i to szalone podejście wszystkich ma - pochodzę z TFS i ja Zaczynam podejrzewać, że „Checkout” oznacza coś zupełnie innego w GIT. Chcę wiedzieć, co to znaczy w git-landzie.
BrainSlugs83

Odpowiedzi:

60

Jak zauważyłeś, HEADjest to etykieta wskazująca, gdzie jesteś w drzewie zatwierdzeń. Porusza się wraz z tobą, gdy przechodzisz od jednego zatwierdzenia do drugiego. git checkout <commit>to podstawowy mechanizm poruszania się po drzewie zatwierdzeń, przenoszący fokus ( HEAD) do określonego zatwierdzenia.

Commit może być określony przez jeden z wielu sposobów, popełnić hash, nazwę oddziału, nazwę znacznika, względna (składnię HEAD^, HEAD~1itd) i tak dalej. Często przydatne jest rozważenie, że wyewidencjonowanie jest zmianą gałęzi i istnieją pewne opcje, które działają z tej perspektywy, ale wszystkie odnoszą się do zatwierdzeń.

Do kasy, zatwierdzenie ma wpływ z innej strony niż poruszanie HEADsię.

  • Katalog roboczy jest aktualizowany do stanu wypisanego zatwierdzenia.
  • jeśli podano nazwę gałęzi, checkout powoduje, że gałąź jest aktywna. Aktywna gałąź przesunie się wraz z dodanymi nowymi zatwierdzeniami.
    • z -bopcją nowa gałąź zostanie utworzona na podstawie bieżącego zatwierdzenia, a następnie uaktywniona.
    • dzięki tej --trackopcji wyewidencjonowana gałąź może zostać powiadomiona o zdalnym oddziale
    • z --orphanopcją tworzony jest nowy oddział (jak z -b), ale nie będzie oparty na żadnym istniejącym zatwierdzeniu.

Jest jeszcze kilka opcji, o których możesz przeczytać na stronie podręcznika git checkout , z których wszystkie obracają się wokół przechodzenia od jednego zatwierdzenia do drugiego - różnią się tylko efektem, jaki ma ten ruch oprócz przenoszenia HEAD.

David Culp
źródło
Więc brzmi to tak, jakby „checkout” oznaczało coś zupełnie innego (w każdym razie w porównaniu z TFS - odpowiednikiem TFS byłoby „uzyskanie” określonego „zestawu zmian”). Cieszę się, że to sprawdziłem! - czy jest jakaś magiczna stała dla „najnowszych”? (w TFS to „T”) - w ten sposób możemy po prostu pobrać najnowszą wersję kodu bez znajomości etykiety „HEAD”?
BrainSlugs83
1
Jeśli jesteś w gałęzi, nazwa gałęzi jest najnowszym zatwierdzeniem dla tej gałęzi - jeśli nie jesteś w gałęzi, jesteś na najnowszym zatwierdzeniu. Użyłbym polecenia log, aby znaleźć najnowsze zatwierdzenie w repozytorium bez względu na gałąź, a następnie ręcznie do niego przejść - ale jestem pewien, że w razie potrzeby można to zautomatyzować.
David Culp,
O ostatnim akapicie: pamiętaj, że git checkout <commit> <path>nie zmienia gałęzi.
galath,
Twoje wyjaśnienie nie jest źle, ale zapomniałeś bardzo ważną (i potencjalnie niebezpiecznej) przypadek użycia: git checkout <path>.
Eric Duminil
24

Pozwólcie, że wyjaśnię niektóre przypadki użycia wyewidencjonowania z plikiem, folderem i gałęziami, aby pomóc w zrozumieniu.

Powiedzmy, że mamy folder o nazwie, deva index.htmltakże wszystko jest śledzone, a katalog roboczy jest czysty.

Jeśli przypadkowo zmienię nazwę pliku index.htmli chcę cofnąć, że po prostu git checkout index.htmlgo użyję, odzyska stan pliku z aktualnie wybranej gałęzi repozytorium.

Teraz, jeśli zrobiłem jakąś zmianę w devfolderze i chcę to odzyskać. Mogę użyć, git checkout devale co, jeśli istnieje już gałąź o nazwie devzamiast sprawdzania tego folderu, ściągnie tę gałąź. Aby tego uniknąć, wolałbym zrobić git checkout -- dev.

Teraz pusty podwójny myślnik oznacza bieżącą gałąź i pyta gita o folder devz aktualnie wybranej gałęzi.

Podobnie jeśli git checkout alpha devto zrobię, ściągnę folder dev z gałęzi alpha.

Ta odpowiedź dotyczy twojego pierwszego pytania „git checkout naprawdę znaczy”.

bawa g
źródło
2
W twojej ostatniej linii Ta odpowiedź jest na twoje pierwsze pytanie „git checkout naprawdę znaczy”. czy sprawdzasz folder „naprawdę” z gałęzi „mean”: P
Paramvir Singh Karwal
22

„Do wyewidencjonowania” oznacza, że ​​pobierasz dowolne zatwierdzenie z repozytorium i odtwarzasz stan skojarzonego drzewa plików i katalogów w katalogu roboczym.

Kiedy sprawdzasz commit, który nie jest odgałęzieniem (np. git checkout HEAD~2), Jesteś na tak zwanej odłączonej głowie. Możesz tutaj tworzyć zatwierdzenia, ale kiedy przełączysz się na inną gałąź, zatwierdzenia te nie będą możliwe do odzyskania przez nazwę gałęzi i mogą nawet zostać usunięte przez garbage collectora po pewnym czasie.

Michael Wild
źródło