Apakah tag Git hanya berlaku untuk cabang saat ini?

156

Saat ini saya sedang bekerja dengan repositori yang memiliki banyak cabang.

Ketika saya membuat tag, apakah tag itu merujuk ke cabang saat itu?

Dengan kata lain: Setiap kali saya membuat tag, apakah saya perlu beralih ke cabang yang diinginkan dan tag di dalam cabang itu sehingga tag merujuk ke cabang itu pada saat itu?

Gerardo
sumber

Jawaban:

151

Jika Anda membuat tag dengan mis

git tag v1.0

tag akan merujuk pada komit terbaru dari cabang tempat Anda saat ini. Anda dapat mengubah cabang dan membuat tag di sana.

Anda juga bisa merujuk ke cabang lain sambil memberi tag,

git tag v1.0 name_of_other_branch

yang akan membuat tag ke komit terbaru dari cabang lain.

Atau Anda bisa meletakkan tag di mana saja, tidak peduli cabang mana, dengan secara langsung merujuk ke SHA1 dari beberapa commit

git tag v1.0 <sha1>
Kalle Pokki
sumber
201

Jawaban CharlesB dan jawaban helmbert sama-sama membantu, tetapi butuh beberapa saat untuk memahaminya. Berikut cara lain untuk menggambarkannya:

  • Sebuah tag adalah pointer ke komit , dan komit ada secara independen dari cabang .
    • Penting untuk memahami bahwa tag tidak memiliki hubungan langsung dengan cabang - mereka hanya mengidentifikasi komit .
      • Komit itu dapat ditunjukkan dari sejumlah cabang - yaitu, ia dapat menjadi bagian dari sejarah sejumlah cabang - termasuk tidak ada.
    • Oleh karena itu, menjalankan git show <tag>untuk melihat detail tag tidak mengandung referensi ke cabang apa pun, hanya ID dari komit yang ditunjuk oleh tag.
      • (Komit ID (alias nama objek atau SHA 1-ID) yang string 40 karakter yang terdiri dari hex digit yang hash atas isi dari komit, misalnya:. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Cabang hanya berperan secara tidak langsung :
    • Pada saat membuat tag , dengan menyiratkan komit yang akan dituju oleh tag :
      • Tidak menentukan target untuk tag default ke komit terbaru cabang saat ini (alias HEAD); misalnya:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Menentukan nama cabang sebagai target tag default untuk komit cabang terbaru; misalnya:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Seperti yang telah dicatat orang lain, Anda juga dapat menentukan ID komit secara eksplisit sebagai target tag.)
    • Saat menggunakan git describeuntuk menggambarkan cabang saat ini:
      • git describe [--tags] menjelaskan cabang saat ini dalam hal komit sejak tag [mungkin ringan] terbaru dalam sejarah cabang ini .
      • Dengan demikian, tag yang dirujuk oleh git describeBUKAN mencerminkan keseluruhan tag yang baru dibuat .
mklement0
sumber
Jadi, untuk tag yang diberikan (mis., V0.1.0), untuk mengetahui sumber apa yang sebenarnya ada dalam bangunan yang sebenarnya (dari sumber itu), Anda benar-benar perlu mengetahui cabang pembuatannya, bukan? Yaitu, komit yang diberikan mungkin memiliki keturunan yang berbeda di cabang yang berbeda, kan?
Hawkeye Parker
2
@ HawkeyeParker: Saya tidak terbenam dalam hal ini lagi, tetapi Anda tidak perlu tahu cabang, karena tag mengidentifikasi komit tertentu (yang dapat menjadi bagian dari beberapa cabang), dan Anda dapat menyelidiki dari sana.
mklement0
Tetapi jika saya melakukan git show [tagname] maka itu menunjukkan nama cabang di atas Penulis dan Tanggal, yang bertentangan dengan "running git show <tag> untuk melihat detail tag tidak mengandung referensi ke cabang mana pun"
Brad Thomas
39

Tag dan cabang sama sekali tidak terkait, karena tag merujuk ke komit tertentu, dan cabang adalah referensi yang bergerak ke komit terakhir dari sejarah. Cabang pergi, tag tetap.

Jadi ketika Anda menandai sebuah komit, git tidak peduli komit atau cabang mana yang diperiksa, jika Anda memberinya SHA1 dari apa yang ingin Anda beri tag.

Saya bahkan dapat menandai dengan merujuk ke cabang (kemudian akan menandai ujung cabang), dan kemudian mengatakan bahwa ujung cabang ada di tempat lain (dengan git reset --hardmisalnya), atau menghapus cabang. Namun tag yang saya buat tidak akan bergerak.

CharlesB
sumber
17
Dengan kata lain, tag adalah nama yang bagus untuk hash git yang jelek. Tag (dan hash) ada tidak peduli cabang mana yang ada (ed).
C-Otto
8

Saat memanggil hanya git tag <TAGNAME>tanpa parameter tambahan, Git akan membuat tag baru dari HEAD Anda saat ini (yaitu HEAD dari cabang Anda saat ini). Saat menambahkan komit tambahan ke cabang ini, HEAD cabang akan mengikuti komit baru tersebut, sementara tag selalu merujuk ke komit yang sama.

Saat menelepon, git tag <TAGNAME> <COMMIT>Anda bahkan dapat menentukan komit yang digunakan untuk membuat tag.

Bagaimanapun juga, sebuah tag masih merupakan "pointer" ke komit tertentu (bukan cabang).

helmbert
sumber
6

Kami dapat membuat tag untuk beberapa komitmen di masa lalu:

git tag [tag_name] [reference_of_commit]

misalnya:

git tag v1.0 5fcdb03
Sana Hameed
sumber
1

Jika Anda ingin menandai cabang tempat Anda berada, ketikkan:

git tag <tag>

dan dorong cabang dengan:

git push origin --tags
Mutatos
sumber
0

Jika Anda ingin membuat tag dari cabang yang merupakan sesuatu seperti release/yourbranchdll. Maka Anda harus menggunakan sesuatu seperti

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Setelah membuat tag yang tepat jika Anda ingin mendorong tag ke jarak jauh, gunakan perintah

git push origin YOUR_TAG_VERSION_OR_NAME
BharathRao
sumber