แท็ก Git นำไปใช้กับสาขาปัจจุบันได้หรือไม่


156

ฉันกำลังทำงานกับพื้นที่เก็บข้อมูลที่มีหลายสาขา

เมื่อฉันสร้างแท็กแท็กนั้นอ้างถึงสาขาปัจจุบันแล้วหรือไม่

กล่าวอีกนัยหนึ่ง: เมื่อใดก็ตามที่ฉันสร้างแท็กฉันจำเป็นต้องสลับไปยังสาขาและแท็กที่ต้องการภายในสาขานั้นเพื่อให้แท็กอ้างถึงสาขานั้น ณ เวลานั้นหรือไม่

คำตอบ:


151

หากคุณสร้างแท็กด้วยเช่น

git tag v1.0

แท็กจะอ้างถึงการกระทำล่าสุดของสาขาที่คุณอยู่ในปัจจุบัน คุณสามารถเปลี่ยนสาขาและสร้างแท็กได้

คุณสามารถอ้างถึงสาขาอื่น ๆ ในขณะที่ติดแท็ก

git tag v1.0 name_of_other_branch

ซึ่งจะสร้างแท็กให้กับการคอมมิทล่าสุดของสาขาอื่น

หรือคุณสามารถวางแท็กไว้ที่ใดก็ได้ไม่ว่าสาขาใดโดยอ้างอิงโดยตรงไปยัง SHA1 ของการกระทำบางอย่าง

git tag v1.0 <sha1>

201

คำตอบของCharlesBและคำตอบของhelmbert นั้นมีประโยชน์ทั้งสองอย่าง แต่ก็ใช้เวลาพอสมควรที่จะเข้าใจพวกเขา นี่เป็นอีกวิธีในการใส่:

  • แท็กเป็นตัวชี้การกระทำและกระทำอยู่เป็นอิสระจากสาขา
    • มันเป็นสิ่งสำคัญที่จะเข้าใจว่าแท็กไม่มีโดยตรงสัมพันธ์กับสาขา - พวกเขาเท่านั้นที่เคยระบุกระทำ
      • การกระทำนั้นสามารถชี้ไปที่สาขาใดก็ได้ - กล่าวคือมันสามารถเป็นส่วนหนึ่งของประวัติศาสตร์ของสาขาใดก็ได้ - รวมถึงไม่มีเลย
    • ดังนั้นการเรียกใช้git show <tag>เพื่อดูรายละเอียดของแท็กจึงไม่มีการอ้างอิงไปยังสาขาใด ๆ มีเพียง ID ของการกระทำที่แท็กชี้ไป
      • (Commit IDs (aka ชื่อวัตถุหรือรหัส SHA-1) คือสตริง 40 ตัวอักษรซึ่งประกอบด้วยเลขฐานสิบหกหลักที่แฮชเหนือเนื้อหาของการคอมมิทเช่น; 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • สาขาเข้ามาเล่นทางอ้อมเท่านั้น :
    • ในช่วงเวลาของการสร้างแท็กโดยหมายถึงการกระทำที่แท็กจะชี้ไปที่ :
      • ไม่ระบุเป้าหมายสำหรับแท็กที่เป็นค่าเริ่มต้นสำหรับการกระทำล่าสุดของสาขาปัจจุบัน (aka HEAD) เช่น:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • การระบุชื่อสาขาเป็นค่าเริ่มต้นที่เป้าหมายแท็กเป็นการกระทำล่าสุดของสาขานั้น เช่น:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (ดังที่คนอื่น ๆ ระบุไว้คุณยังสามารถระบุกระทำ ID ได้อย่างชัดเจนว่าเป็นเป้าหมายของแท็ก)
    • เมื่อใช้git describeเพื่ออธิบายสาขาปัจจุบัน:
      • git describe [--tags] อธิบายถึงสาขาปัจจุบันในแง่ของความมุ่งมั่นเนื่องจากแท็ก [อาจมีน้ำหนักเบา] ล่าสุดในประวัติศาสตร์ของสาขานี้
      • ดังนั้นแท็กอ้างอิงโดยgit describeอาจไม่ได้สะท้อนให้เห็นถึงแท็กส่วนใหญ่สร้างขึ้นเมื่อเร็ว ๆ นี้โดยรวม

ดังนั้นสำหรับแท็กที่กำหนด (เช่น v0.1.0) เพื่อทราบว่าแหล่งใดที่แท้จริงในการสร้างจริง (ของแหล่งที่มานั้น) คุณจำเป็นต้องรู้ว่าสาขาที่สร้างขึ้นนั้นถูกต้องหรือไม่ คือความมุ่งมั่นที่กำหนดอาจมีลูกหลานที่แตกต่างกันในสาขาที่แตกต่างกันใช่ไหม
Hawkeye Parker

2
@HawkeyeParker: ฉันไม่ได้สนใจในเรื่องนี้อีกต่อไป แต่คุณไม่จำเป็นต้องรู้สาขาเพราะแท็กจะระบุการกระทำที่เฉพาะเจาะจง (ซึ่งอาจเป็นส่วนหนึ่งของหลายสาขา) และคุณสามารถตรวจสอบได้จากที่นั่น
mklement0

แต่ถ้าฉันแสดง git [tagname] มันจะแสดงชื่อสาขาเหนือผู้แต่งและวันที่ซึ่งขัดแย้งกับ "Running git show <tag> เพื่อดูรายละเอียดของแท็กที่ไม่มีการอ้างอิงถึงสาขาใด ๆ "
Brad Thomas

39

แท็กและสาขาไม่เกี่ยวข้องกันอย่างสมบูรณ์เนื่องจากแท็กอ้างถึงการส่งข้อความเฉพาะและสาขาเป็นการอ้างอิงแบบเคลื่อนที่ไปยังการส่งมอบครั้งสุดท้ายของประวัติ สาขาไปแท็กอยู่

ดังนั้นเมื่อคุณติดแท็กคอมมิทแล้วคอมไพล์ไม่สนใจว่าคอมมิชชันหรือสาขาใดถูกชำระเงินถ้าคุณให้ SHA1 แก่เขาในสิ่งที่คุณต้องการติดแท็ก

ฉันสามารถติดแท็กได้โดยอ้างถึงสาขา (จากนั้นจะติดแท็กที่ส่วนปลายของสาขา) และต่อมาบอกว่าปลายของสาขาอยู่ที่อื่น (พร้อมgit reset --hardตัวอย่าง) หรือลบสาขา แท็กที่ฉันสร้างขึ้น แต่จะไม่ย้าย


17
กล่าวอีกนัยหนึ่งแท็กเป็นชื่อที่ดีสำหรับแฮช git ที่น่าเกลียด แท็ก (และแฮช) มีอยู่ไม่ว่าสาขาใดจะมีอยู่ (ed)
C-Otto

8

เมื่อโทรgit tag <TAGNAME>โดยไม่มีพารามิเตอร์เพิ่มเติม Git จะสร้างแท็กใหม่จาก HEAD ปัจจุบันของคุณ (เช่น HEAD ของสาขาปัจจุบันของคุณ) เมื่อเพิ่มการคอมมิตเพิ่มเติมลงในสาขานี้ HEAD ของสาขาจะสอดคล้องกับคอมมิทใหม่เหล่านั้นในขณะที่แท็กอ้างถึงการคอมมิทเดียวกันเสมอ

เมื่อโทรgit tag <TAGNAME> <COMMIT>คุณสามารถระบุได้ว่าจะใช้คอมมิทใดในการสร้างแท็ก

โดยไม่คำนึงถึงแท็กยังเป็นเพียง "ตัวชี้" สำหรับการกระทำบางอย่าง (ไม่ใช่สาขา)


6

เราสามารถสร้างแท็กสำหรับการส่งในอดีต:

git tag [tag_name] [reference_of_commit]

เช่น:

git tag v1.0 5fcdb03

1

หากคุณต้องการติดแท็กสาขาที่คุณอยู่ให้พิมพ์:

git tag <tag>

และผลักดันสาขาด้วย:

git push origin --tags

0

หากคุณต้องการสร้างแท็กจากสาขาซึ่งมีลักษณะคล้ายrelease/yourbranchฯลฯ คุณควรใช้บางอย่างเช่น

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

หลังจากสร้างแท็กที่เหมาะสมหากคุณต้องการผลักแท็กไปที่รีโมตจากนั้นใช้คำสั่ง

git push origin YOUR_TAG_VERSION_OR_NAME
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.