Mam pewne trudności ze zrozumieniem, jak używać znaczników w porównaniu z oddziałami wgit.
Właśnie przeniosłem bieżącą wersję naszego kodu CVS do git, a teraz będę pracował nad podzbiorem tego kodu dla określonej funkcji. Pracuje nad tym także kilku innych programistów, ale nie wszyscy programiści z naszej grupy będą dbać o tę funkcję. Czy powinienem tworzyć gałąź czy tag? W jakich sytuacjach powinienem używać jednego kontra drugiego?
git
version-control
branch
git-branch
git-tag
Białecki
źródło
źródło
Odpowiedzi:
Tag reprezentuje wersję danego oddziału na chwilę w czasie. Gałąź stanowi oddzielną nić rozwoju, które mogą być realizowane równolegle z innymi działaniami rozwoju na podstawie tego samego kodu. Zmiany w oddziale można ostatecznie scalić z powrotem w innym oddziale, aby je ujednolicić.
Zazwyczaj będziesz oznaczyć konkretnej wersji, dzięki czemu można go odtworzyć, na przykład, jest to wersja wysyłaliśmy do XYZ Corp . oddział to bardziej strategia zapewniania bieżących aktualizacji konkretnej wersji kodu przy jednoczesnym rozwijaniu go. Zrobisz gałąź dostarczonej wersji, będziesz kontynuować programowanie w linii głównej, ale poprawisz błędy w gałęzi, która reprezentuje dostarczoną wersję. Ostatecznie poprawisz te poprawki błędów z powrotem do głównej linii. Często będziesz używać jednocześnie rozgałęziania i tagowania. Będziesz mieć różne tagi, które mogą odnosić się zarówno do linii głównej, jak i jej gałęzi, oznaczając poszczególne wersje (na przykład dostarczone klientom) wzdłuż każdej gałęzi, którą chcesz odtworzyć - do dostawy, diagnozy błędów itp.
W rzeczywistości jest to bardziej skomplikowane - lub tak skomplikowane, jak chcesz - ale te przykłady powinny dać ci pojęcie o różnicach.
źródło
git checkout 88c9f229f
, możesz zrobić coś podobnegogit checkout your_tag
i kasujesz zatwierdzenie, które zostało aliowane przez tag.Z teoretycznego punktu widzenia:
Z technicznego punktu widzenia:
refs/tags/
przestrzeni nazw i mogą wskazywać na tagi obiektów ( tagi z adnotacjami i opcjonalnie podpisane GPG) lub bezpośrednio w celu zatwierdzenia obiektu (rzadziej używany lekki tag dla nazw lokalnych), lub w bardzo rzadkich przypadkach nawet na obiekt drzewa lub obiekt blob (np. podpis GPG ).refs/heads/
przestrzeni nazw i mogą wskazywać tylko na zatwierdzanie obiektów .HEAD
Wskaźnik musi odnosić się do gałęzi (symboliczne odniesienia) lub bezpośrednio do zatwierdzenie (jednej strony głowy lub Nienazwana rozgałęzienia).refs/remotes/<remote>/
przestrzeni nazw i podążają za zwykłymi gałęziami w zdalnym repozytorium<remote>
.Zobacz także stronę gitglossary :
źródło
git checkout <tag>
” wygenerowałby anonimową gałąź bez nazwy (tak zwaną „odłączoną HEAD”) i wybrałby stan znacznika. Utworzenie nowego zatwierdzenia robi to w tej nienazwanej gałęzi i nie zmienia tego, na co wskazuje znacznik.git checkout -b <branch name> <tag name>
Jeśli myślisz o swoim repozytorium jako książce, która kronika postępów w projekcie ...
Gałęzie
Możesz myśleć o oddziale jako o jednej z lepkich zakładek :
Zupełnie nowe repozytorium ma tylko jedno (wywoływane
master
), które automatycznie przechodzi do najnowszej strony (pomyśl o zatwierdzeniu ), którą napisałeś. Możesz jednak tworzyć i używać więcej zakładek, aby oznaczyć inne interesujące miejsca w książce, abyś mógł szybko do nich wrócić.Ponadto zawsze możesz przenieść określoną zakładkę na inną stronę książki (
git-reset
na przykład używając ); Punkty zainteresowania zwykle różnią się w czasie.Tagi
Możesz myśleć o znacznikach jako o nagłówkach rozdziałów .
Może zawierać tytuł (pomyśl tagi z adnotacjami ) lub nie. Znacznik jest podobny, ale różni się od gałęzi, ponieważ stanowi punkt historycznego zainteresowania książką. Aby zachować jego historyczny aspekt, po udostępnieniu tagu (tj. Przekazaniu go do udostępnionego pilota) nie należy przenosić go w inne miejsce w książce.
źródło
To, co musisz zrozumieć, pochodzące z CVS, to to, że nie tworzysz już katalogów podczas zakładania oddziału.
Koniec z „lepkim znacznikiem” (który można zastosować tylko do jednego pliku) lub „znacznikiem gałęzi”.
Rozgałęzienia i znaczniki są dwoma różnymi obiektami w Git i zawsze dotyczą wszystkich repozytoriów.
Nie będziesz już (tym razem z SVN) jawnie strukturyzować swoje repozytorium za pomocą:
Struktura ta wynika z faktu, że CVS jest systemem wersji, a nie systemem wersji (patrz Kontrola źródła vs. Kontrola wersji? ).
Oznacza to, że gałęzie są emulowane przez tagi dla CVS, kopie katalogów dla SVN.
Twoje pytanie ma sens, jeśli jesteś przyzwyczajony do kasy tagu i rozpocznij w nim pracę .
Czego nie powinieneś;)
Tag ma reprezentować niezmienną treść, służy tylko do uzyskania dostępu do niego z gwarancją uzyskania tej samej treści za każdym razem.
W Git historia zmian jest serią zatwierdzeń, tworzących wykres.
Gałąź to jedna ścieżka tego wykresu
Widzieć Jakuba Narębskiego na wszystkie szczegóły techniczne, ale szczerze mówiąc, w tym momencie nie potrzebujesz (jeszcze) wszystkich szczegółów;)
Najważniejsze jest to, że znacznik jest prostym wskaźnikiem do zatwierdzenia, nigdy nie będziesz mógł modyfikować jego zawartości. Potrzebujesz oddziału.
W twoim przypadku każdy programista pracuje nad określoną funkcją:
Zamiast bezpośrednio śledzić oddziały współpracowników, możesz śledzić tylko oddział jednego „oficjalnego” centralnego repozytorium, do którego wszyscy pchają swoją pracę w celu zintegrowania i udostępnienia pracy wszystkich dla tej konkretnej funkcji.
źródło
Gałęzie są wykonane z drewna i wyrastają z pnia drzewa. Tagi są wykonane z papieru (pochodna drewna) i wiszą jak ozdoby świąteczne z różnych miejsc na drzewie.
Twój projekt jest drzewem, a twoja funkcja, która zostanie dodana do projektu, wzrośnie na gałęzi. Odpowiedź brzmi: oddział.
źródło
Wygląda na to, że najlepszym sposobem na wyjaśnienie jest to, że tagi działają jak gałęzie tylko do odczytu. Możesz użyć gałęzi jako tagu, ale możesz przypadkowo zaktualizować ją o nowe zatwierdzenia. Tagi gwarantują, że wskazują na to samo zatwierdzenie, o ile istnieją.
źródło
git tag -f
.Tagi mogą być podpisane lub niepodpisane ; oddziały nigdy nie są podpisane.
Podpisane znaczniki nigdy nie mogą się przenosić, ponieważ są kryptograficznie powiązane (z podpisem) z określonym zatwierdzeniem. Nieoznaczone znaczniki nie są powiązane i można je przenosić (ale przenoszenie znaczników nie jest normalnym przypadkiem użycia).
Oddziały mogą nie tylko przejść do innego zatwierdzenia, ale oczekuje się, że to zrobią. Powinieneś użyć oddziału do swojego lokalnego projektu rozwoju. Nie ma sensu powierzanie pracy repozytorium Git „na znaczniku”.
źródło
Lubię myśleć o oddziałach jak , gdzie idziesz , tagi jak gdzie byłaś .
Znacznik wydaje się jak zakładka do określonego ważnego punktu w przeszłości, takiego jak wydanie wersji.
Podczas gdy gałąź jest szczególną ścieżką, projekt idzie w dół, a zatem znacznik gałęzi przesuwa się wraz z tobą. Po zakończeniu scalasz / usuwasz gałąź (tj. Znacznik). Oczywiście w tym momencie możesz wybrać tagowanie tego zatwierdzenia.
źródło
Git Przypowieść wyjaśnia jak typowy DVCS zostanie utworzony i dlaczego ich twórcy zrobili to, co zrobili. Warto też rzucić okiem na Git for Computer Scientist ; wyjaśnia, co robi każdy typ obiektu w Git, w tym gałęzie i znaczniki.
źródło
Znacznik służy do oznaczenia wersji, a dokładniej odnosi się do punktu w czasie na gałęzi. Gałąź jest zwykle używana do dodawania funkcji do projektu.
źródło
prosty:
Podręcznik użytkownika Git
źródło
prosta odpowiedź brzmi:
ale
źródło