Jaka jest różnica między tagiem z adnotacjami i bez adnotacji?

332

Jeśli chcę oznaczyć bieżące zatwierdzenie. Wiem, że działają oba następujące wiersze poleceń:

git tag <tagname>

i

git tag -a <tagname> -m '<message>'

Jaka jest różnica między tymi poleceniami?

użytkownik462301
źródło
1
@Thilo To nie jest dokładny duplikat. Przywoływane pytanie dotyczy tego, kiedy adnotować, a nie powiązanych flag.
Todd A. Jacobs,
1
Jest to bardzo dobrze wyjaśnione w dokumentacji Gita: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane
TLDR bez adnotacji: zatwierdzenie; adnotacja: zatwierdzenie, autor, data, (opcjonalnie) komentarz
Antony Hatchkins

Odpowiedzi:

254

TL; DR

Różnica między poleceniami polega na tym, że jedno z nich udostępnia wiadomość znacznika, a drugie nie. Tag z adnotacjami ma komunikat, który można wyświetlić za pomocą git-show (1), podczas gdy tag bez adnotacji jest tylko nazwanym wskaźnikiem do zatwierdzenia.

Więcej informacji o lekkich tagach

Zgodnie z dokumentacją : „Aby utworzyć lekki znacznik, nie należy podawać żadnej z opcji -a, -s ani -m, wystarczy podać nazwę znacznika”. Istnieją również różne opcje pisania wiadomości na tagach z adnotacjami:

  • Gdy używasz git tag <tagname>, Git utworzy tag przy bieżącej wersji, ale nie poprosi o adnotację. Zostanie oznaczony bez wiadomości (jest to lekki znacznik).
  • Gdy używasz git tag -a <tagname>, Git poprosi cię o adnotację, chyba że użyłeś flagi -m, aby dostarczyć wiadomość.
  • Gdy używasz git tag -a -m <msg> <tagname>, Git oznaczy zatwierdzenie i opatrzy go adnotacją podaną wiadomością.
  • Podczas używania git tag -m <msg> <tagname>Git zachowuje się tak, jakbyś przekazał flagę -a dla adnotacji i użył dostarczonej wiadomości.

Zasadniczo sprowadza się to tylko do tego, czy tag ma mieć adnotację i inne powiązane informacje, czy nie.

Todd A. Jacobs
źródło
4
Czy istnieje różnica między tagiem „adnotacja” a komunikatem zatwierdzenia?
Steve Bennett
3
@SteveBennett Tak. Adnotacja znacznika nie jest komunikatem zatwierdzenia. Nie możesz tego zobaczyć za pomocą git-log (1); musisz użyć git-show (1).
Todd A. Jacobs,
115
Różnica między tagami „z adnotacjami” i „lekkimi” wykracza poza wiadomość. Możesz mieć tag z adnotacjami bez wiadomości ( git tag -a <tag> -m ''), ale tag z adnotacjami zawsze ma taggera (autora) i datę .
Piotr Findeisen
1
Dla mnie to samo. Tagi wersji zwykle zawierają całkiem bezużyteczne wiadomości (czy może powiedzieć więcej niż nazwa? Po co?). Niestety, ta najczęściej głosowana odpowiedź nie wspomina o tej różnicy.
Piotr Findeisen
44
Inną ważną rzeczą, na którą należy zwrócić uwagę, jest to, że kiedy wpychasz tagi do zdalnego repozytorium za pomocą git push --follow-tags, tylko tagi z adnotacjami będą wypychane.
Xatoo,
209

Wciśnij tagi z adnotacjami, zachowaj lekki lokalny

man git-tag mówi:

Znaczniki z komentarzami są przeznaczone do wydania, a lekkie znaczniki są przeznaczone do prywatnych lub tymczasowych etykiet obiektów.

Niektóre zachowania różnicują je między sobą w sposób przydatny dla tego zalecenia, np .:

  • tagi z adnotacjami mogą zawierać wiadomość, twórcę i datę inną niż zatwierdzone przez nich zatwierdzenie. Możesz więc użyć ich do opisu wydania bez dokonywania zatwierdzenia wydania.

    Lekkie tagi nie mają tych dodatkowych informacji i nie potrzebują ich, ponieważ będziesz ich używać tylko do rozwoju.

  • git push --follow-tags wypycha tylko tagi z adnotacjami
  • git describe bez opcji wiersza poleceń widzi tylko tagi z adnotacjami

Różnice wewnętrzne

  • zarówno lekkie, jak i opatrzone adnotacjami tagi to plik, .git/refs/tagsktóry zawiera SHA-1

  • w przypadku lekkich tagów SHA-1 wskazuje bezpośrednio na zatwierdzenie:

    git tag light
    cat .git/refs/tags/light
    

    drukuje to samo co SHA-1 HEAD.

    Nic więc dziwnego, że nie mogą zawierać żadnych innych metadanych.

  • znaczniki z adnotacjami wskazują obiekt znacznika w bazie danych obiektów.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    zawiera SHA adnotowanego obiektu znacznika:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    a następnie możemy uzyskać jego zawartość za pomocą:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    próbka wyjściowa:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    I w ten sposób zawiera dodatkowe metadane. Jak widać z danych wyjściowych, pola metadanych to:

    Bardziej szczegółowa analiza formatu znajduje się w: Jaki jest format obiektu znacznika git i jak obliczyć jego SHA?

Bonusy

  • Sprawdź, czy tag ma adnotację:

    git cat-file -t tag
    

    Wyjścia

    • commit dla lekkości, ponieważ nie ma obiektu znacznika, wskazuje on bezpośrednio na zatwierdzenie
    • tag dla adnotacji, ponieważ w tym przypadku istnieje obiekt znacznika
  • Wymień tylko lekkie znaczniki: Jak mogę wyświetlić wszystkie lekkie znaczniki?

Ciro Santilli
źródło
1
Jest to o wiele wyraźniejsze niż obecnie akceptowana odpowiedź. Dzięki.
Reece
43

Duża różnica jest doskonale wyjaśnione tutaj .

Zasadniczo lekkie znaczniki są tylko wskaźnikami do konkretnych zatwierdzeń. Żadne dalsze informacje nie są zapisywane ; z drugiej strony tagi z adnotacjamizwykłymi obiektami , które mają autora i datę i można się do nich odwoływać, ponieważ mają własny klucz SHA.

Jeśli wiesz, kto oznaczył to, co i kiedy jest dla Ciebie istotne, użyj tagów z adnotacjami. Jeśli chcesz po prostu oznaczyć konkretny punkt w rozwoju , bez względu na to, kto i kiedy to zrobił, lekkie tagi są wystarczająco dobre.

Zwykle wybierasz tagi z adnotacjami, ale tak naprawdę to zależy od mistrza projektu Git.

Luis
źródło