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?
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?
Odpowiedzi:
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.
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:
git tag <tagname>
, Git utworzy tag przy bieżącej wersji, ale nie poprosi o adnotację. Zostanie oznaczony bez wiadomości (jest to lekki znacznik).git tag -a <tagname>
, Git poprosi cię o adnotację, chyba że użyłeś flagi -m, aby dostarczyć wiadomość.git tag -a -m <msg> <tagname>
, Git oznaczy zatwierdzenie i opatrzy go adnotacją podaną wiadomością.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.
git tag -a <tag> -m ''
), ale tag z adnotacjami zawsze ma taggera (autora) i datę .
git push --follow-tags
, tylko tagi z adnotacjami będą wypychane.
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 describe
bez opcji wiersza poleceń widzi tylko tagi z adnotacjamiRóżnice wewnętrzne
zarówno lekkie, jak i opatrzone adnotacjami tagi to plik, .git/refs/tags
któ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 <your@mail.com> 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 zatwierdzenietag
dla adnotacji, ponieważ w tym przypadku istnieje obiekt znacznikaWymień tylko lekkie znaczniki: Jak mogę wyświetlić wszystkie lekkie znaczniki?
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 adnotacjami są zwykł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.