Czy tagi Git mają zastosowanie tylko do bieżącej gałęzi?

156

Obecnie pracuję z repozytorium, które ma wiele gałęzi.

Czy kiedy tworzę tag, odnosi się on do aktualnej gałęzi?

Innymi słowy: za każdym razem, gdy tworzę tag, czy muszę przełączyć się na żądaną gałąź i tag wewnątrz tej gałęzi, aby tag odnosił się do tej gałęzi w tym momencie?

Gerardo
źródło

Odpowiedzi:

151

Jeśli tworzysz tag np

git tag v1.0

znacznik będzie odnosił się do ostatniego zatwierdzenia gałęzi, w której się aktualnie znajdujesz. Możesz tam zmienić gałąź i stworzyć tag.

Możesz też po prostu odnieść się do innej gałęzi podczas tagowania,

git tag v1.0 name_of_other_branch

który utworzy znacznik do ostatniego zatwierdzenia innej gałęzi.

Lub możesz po prostu umieścić tag w dowolnym miejscu, bez względu na gałąź, odwołując się bezpośrednio do SHA1 jakiegoś zatwierdzenia

git tag v1.0 <sha1>
Kalle Pokki
źródło
201

Odpowiedź Charlesa B. i Helmberta są pomocne, ale zrozumienie ich zajęło mi trochę czasu. Oto inny sposób ujęcia tego:

  • Tag jest wskaźnikiem do popełnienia i commity istnieć niezależnie od gałęzi .
    • Ważne jest, aby zrozumieć, że tagi nie mają bezpośredniego związku z gałęziami - zawsze identyfikują tylko zatwierdzenie .
      • Na to zatwierdzenie można wskazać z dowolnej liczby gałęzi - tj. Może być częścią historii dowolnej liczby gałęzi - w tym żadnej.
    • Dlatego bieganie, git show <tag>aby zobaczyć szczegóły tagu, nie zawiera odniesienia do żadnych gałęzi, tylko identyfikator zatwierdzenia, na który wskazuje tag.
      • (Identyfikatory zatwierdzeń (czyli nazwy obiektów lub identyfikatory SHA-1) to 40-znakowe ciągi składające się z cyfr szesnastkowych, które są hashami na treści zatwierdzenia; np . 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2:)
  • Gałęzie wchodzą w grę tylko pośrednio :
    • W czasie tworzenia tagu , sugerując zatwierdzenie , na które będzie wskazywał tag :
      • Brak określenia celu dla znacznika powoduje domyślną zmianę ostatniego zatwierdzenia bieżącej gałęzi (aka HEAD); na przykład:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Określenie nazwy gałęzi jako celu znacznika powoduje ustawienie domyślne ostatniego zatwierdzenia tej gałęzi; na przykład:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Jak zauważyli inni, możesz również jawnie określić identyfikator zatwierdzenia jako cel tagu).
    • Podczas używania git describedo opisu bieżącej branży:
      • git describe [--tags] opisuje bieżącą gałąź pod względem zatwierdzeń od ostatniego [prawdopodobnie lekkiego] znacznika w historii tej gałęzi .
      • Dlatego taggit describe , do którego odwołuje się, może NIE odzwierciedlać ogólnie ostatnio utworzonego tagu .
mklement0
źródło
Tak więc dla danego tagu (np. V0.1.0), aby wiedzieć, jakie rzeczywiste źródło znajduje się w rzeczywistej kompilacji (tego źródła), naprawdę musisz znać gałąź, na której została oparta kompilacja, prawda? To znaczy, dane zatwierdzenie może mieć różnych potomków w różnych gałęziach, prawda?
Hawkeye Parker
2
@HawkeyeParker: Nie jestem już w tym zanurzony, ale nie powinieneś znać gałęzi, ponieważ tag identyfikuje określone zatwierdzenie (które może być częścią wielu gałęzi) i możesz stamtąd zbadać.
mklement0
Ale jeśli zrobię git show [zmienna], to pokaże nazwę gałęzi powyżej autora i daty, co jest sprzeczne z "uruchomieniem git show <tag>, aby zobaczyć szczegóły znacznika nie zawierają odniesienia do żadnych gałęzi"
Brad Thomas
39

Tagi i gałąź są całkowicie niepowiązane, ponieważ znaczniki odnoszą się do konkretnego zatwierdzenia, a gałąź jest ruchomym odniesieniem do ostatniego zatwierdzenia w historii. Gałęzie znikają, tagi pozostają.

Więc kiedy oznaczysz zatwierdzenie, git nie dba o to, który zatwierdzenie lub gałąź są wyewidencjonowane, jeśli podasz mu SHA1 tego, co chcesz oznaczyć.

Mogę nawet oznaczyć, odwołując się do gałęzi (oznacza to wtedy końcówkę gałęzi), a później powiedzieć, że końcówka gałęzi znajduje się gdzie indziej ( git reset --hardna przykład) lub usunąć gałąź. Jednak utworzony przeze mnie tag nie będzie się poruszał.

Charles B.
źródło
17
Innymi słowy, tagi to po prostu ładne nazwy brzydkich skrótów git. Znacznik (i hash) istnieje bez względu na to, które gałęzie istnieją (red.).
C-Otto
8

Dzwoniąc po prostu git tag <TAGNAME> bez żadnych dodatkowych parametrów, Git utworzy nowy tag z twojego aktualnego HEAD (tj. HEAD twojej aktualnej gałęzi). Dodając kolejne zatwierdzenia do tej gałęzi, gałąź HEAD będzie nadążać za tymi nowymi zatwierdzeniami, podczas gdy znacznik zawsze odnosi się do tego samego zatwierdzenia.

Podczas wywoływania git tag <TAGNAME> <COMMIT>możesz nawet określić, którego zatwierdzenia użyć do utworzenia tagu.

Niezależnie od tego, znacznik jest nadal po prostu „wskaźnikiem” do określonego zatwierdzenia (a nie gałęzi).

Helmbert
źródło
6

Możemy stworzyć tag dla jakiegoś wcześniejszego zatwierdzenia:

git tag [tag_name] [reference_of_commit]

na przykład:

git tag v1.0 5fcdb03
Sana Hameed
źródło
1

Jeśli chcesz oznaczyć oddział, w którym się znajdujesz, wpisz:

git tag <tag>

i popchnij gałąź za pomocą:

git push origin --tags
Mutatos
źródło
0

Jeśli chcesz stworzyć tag z gałęzi, która jest podobna do release/yourbranchitp. Następnie powinieneś użyć czegoś w rodzaju

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Po utworzeniu odpowiedniego tagu, jeśli chcesz przekazać tag do zdalnego, użyj polecenia

git push origin YOUR_TAG_VERSION_OR_NAME
BharathRao
źródło