อะไรคือความแตกต่างระหว่างแท็กที่มีคำอธิบายประกอบและไม่มีการแก้ไข?


333

หากฉันต้องการติดแท็กการกระทำปัจจุบัน ฉันรู้ว่าทั้งสองบรรทัดคำสั่งต่อไปนี้ทำงาน:

git tag <tagname>

และ

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

ความแตกต่างระหว่างคำสั่งเหล่านี้คืออะไร?



1
@Thilo นี่ไม่ใช่สิ่งที่ซ้ำกันแน่นอน คำถามที่อ้างอิงเป็นเรื่องเกี่ยวกับเวลาที่จะเพิ่มความคิดเห็นไม่ใช่เกี่ยวกับการตั้งค่าสถานะที่เกี่ยวข้อง
Todd A. Jacobs

1
นี่เป็นคำอธิบายที่ดีมากในเอกสารของ Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane

TLDR ไม่ได้ถูกเปิดเผย: commit; คำอธิบายประกอบ: กระทำ, ผู้เขียน, วันที่, ความคิดเห็น (ไม่จำเป็น)
Antony Hatchkins

คำตอบ:


255

TL; DR

ความแตกต่างระหว่างคำสั่งคือคำสั่งหนึ่งมอบข้อความแท็กให้คุณ แท็กที่มีหมายเหตุประกอบมีข้อความที่สามารถแสดงด้วย git-show (1) ในขณะที่แท็กที่ไม่มีคำอธิบายประกอบนั้นเป็นเพียงตัวชี้ที่ตั้งชื่อไว้เพื่อคอมมิชชัน

เพิ่มเติมเกี่ยวกับแท็กน้ำหนักเบา

ตามเอกสารประกอบ : "ในการสร้างแท็กที่มีน้ำหนักเบาอย่าระบุตัวเลือก -a, -s หรือ -m เพียงระบุชื่อแท็ก" นอกจากนี้ยังมีตัวเลือกต่าง ๆ ในการเขียนข้อความบนแท็กที่มีคำอธิบายประกอบ:

  • เมื่อคุณใช้git tag <tagname>Git จะสร้างแท็กที่การแก้ไขปัจจุบัน แต่จะไม่พร้อมท์ให้คุณใส่คำอธิบายประกอบ มันจะถูกแท็กโดยไม่มีข้อความ (นี่คือแท็กที่มีน้ำหนักเบา)
  • เมื่อคุณใช้git tag -a <tagname>Git จะขอให้คุณใส่คำอธิบายประกอบเว้นแต่ว่าคุณจะใช้แฟล็ก -m เพื่อให้ข้อความ
  • เมื่อคุณใช้git tag -a -m <msg> <tagname>Git จะแท็กการคอมมิทและใส่คำอธิบายประกอบลงในข้อความที่ให้ไว้
  • เมื่อคุณใช้งานgit tag -m <msg> <tagname>Git จะทำตัวราวกับว่าคุณผ่านแฟล็ก -a เพื่อใส่คำอธิบายประกอบและใช้ข้อความที่ให้ไว้

โดยทั่วไปจะเป็นเพียงแค่จำนวนเงินที่คุณต้องการให้แท็กมีคำอธิบายประกอบและข้อมูลอื่น ๆ ที่เกี่ยวข้องหรือไม่


4
มีความแตกต่างระหว่างแท็ก "คำอธิบายประกอบ" และข้อความยืนยันหรือไม่
Steve Bennett

3
@SteveBennett ใช่ หมายเหตุประกอบแท็กไม่ใช่ข้อความยืนยัน คุณไม่สามารถดูได้ด้วย git-log (1); คุณต้องใช้ git-show (1)
Todd A. Jacobs

115
ความแตกต่างระหว่างแท็ก "คำอธิบายประกอบ" และ "จริงจัง" นั้นเกินกว่าข้อความ คุณสามารถมีแท็กที่มีคำอธิบายประกอบโดยไม่มีข้อความ ( git tag -a <tag> -m '') แต่แท็กที่มีคำอธิบายประกอบจะมีตัวแท็ก (ผู้เขียน) และวันที่เสมอ
Piotr Findeisen

1
เหมือนกับฉัน. แท็กเวอร์ชันมักจะมีข้อความที่ไร้ประโยชน์ (มันสามารถพูดมากกว่าชื่ออะไรได้หรือ?) น่าเสียดายที่คำตอบที่ได้รับคะแนนสูงสุดนี้ไม่ได้กล่าวถึงความแตกต่างนี้
Piotr Findeisen

44
สิ่งสำคัญอีกอย่างที่ควรทราบคือเมื่อคุณผลักแท็กไปยังที่เก็บข้อมูลระยะไกลโดยใช้git push --follow-tagsแท็กที่มีคำอธิบายประกอบเท่านั้นที่จะถูกผลัก
Xatoo

209

ผลักดันแท็กที่ใส่หมายเหตุประกอบไว้

man git-tag พูดว่า:

แท็กที่ทำหมายเหตุประกอบไว้สำหรับปล่อยในขณะที่แท็กที่มีน้ำหนักเบานั้นมีไว้สำหรับป้ายส่วนตัวหรือป้ายชั่วคราว

และพฤติกรรมบางอย่างแตกต่างระหว่างพวกเขาในรูปแบบที่คำแนะนำนี้มีประโยชน์เช่น:

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

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

  • git push --follow-tagsจะผลักดันแท็กที่มีคำอธิบายประกอบเท่านั้น
  • git describe หากไม่มีตัวเลือกบรรทัดคำสั่งจะเห็นแท็กที่มีคำอธิบายประกอบเท่านั้น

ความแตกต่างภายใน

  • ทั้งแท็กที่มีน้ำหนักเบาและมีคำอธิบายประกอบเป็นไฟล์ภายใต้.git/refs/tagsที่ประกอบด้วย SHA-1

  • สำหรับแท็กที่มีน้ำหนักเบา SHA-1 จะชี้ไปที่การกระทำโดยตรง:

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

    พิมพ์เช่นเดียวกับ SHA-1 ของ HEAD

    จึงไม่น่าแปลกใจที่พวกเขาไม่สามารถมีข้อมูลเมตาอื่น ๆ

  • แท็กหมายเหตุประกอบชี้ไปที่วัตถุแท็กในฐานข้อมูลวัตถุ

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

    มี SHA ของวัตถุแท็กหมายเหตุประกอบ:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    จากนั้นเราสามารถรับเนื้อหาด้วย:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    ตัวอย่างผลลัพธ์:

    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
    

    และนี่คือวิธีที่มีข้อมูลเมตาเพิ่มเติม ดังที่เราเห็นได้จากผลลัพธ์เขตข้อมูลเมตาคือ:

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

โบนัส

  • กำหนดว่าแท็กจะมีคำอธิบายประกอบหรือไม่:

    git cat-file -t tag
    

    เอาท์พุท

    • commit สำหรับน้ำหนักเบาเนื่องจากไม่มีแท็กวัตถุจึงชี้ไปที่การส่งโดยตรง
    • tag สำหรับคำอธิบายประกอบเนื่องจากมีวัตถุแท็กในกรณีนั้น
  • รายการแท็กน้ำหนักเบาเท่านั้น: ฉันจะแสดงรายการแท็กน้ำหนักเบาทั้งหมดได้อย่างไร


1
นี่ชัดเจนกว่าคำตอบที่ยอมรับในปัจจุบัน ขอบคุณ
Reece

43

ใหญ่แตกต่างกันจะมีการอธิบายที่ดีที่สุดที่นี่

โดยทั่วไปแท็กที่มีน้ำหนักเบาเป็นเพียงตัวชี้ไปยังการกระทำที่เฉพาะเจาะจง ไม่มีข้อมูลเพิ่มเติมจะถูกบันทึกไว้ ; ในทางกลับกันแท็กที่ใส่คำอธิบายประกอบเป็นวัตถุปกติซึ่งมีผู้เขียนและวันที่และสามารถอ้างถึงได้เนื่องจากพวกเขามีคีย์ SHA ของตัวเอง

หากรู้ว่าใครแท็กอะไรและเมื่อใดมีความเกี่ยวข้องกับคุณให้ใช้แท็กที่มีคำอธิบายประกอบ หากคุณต้องการติดแท็กจุดเฉพาะในการพัฒนาของคุณไม่ว่าใครและเมื่อใดที่ทำเช่นนั้นแท็กที่มีน้ำหนักเบาก็ดีพอ

โดยปกติแล้วคุณจะไปที่แท็กหมายเหตุประกอบ แต่มันขึ้นอยู่กับต้นแบบ Git ของโครงการ

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