เหตุใดฉันจึงควรใช้แท็กเทียบกับสาขารุ่น / รุ่นเบต้าในการกำหนดเวอร์ชัน


114

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

ต้องมีเหตุผลที่ดีหลายประการในการติดแท็กแทนที่จะแยกเป็นสาขา แต่ฉันอยากรู้ว่าข้อดีเหล่านั้นคืออะไร

คำตอบ:


96

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

ในทางปฏิบัติแท็กเป็นสาขาที่ไม่มีสาขาอยู่แล้วเพียงแค่เพิ่มวิธีอ้างอิงเวอร์ชันเฉพาะของโครงการเพื่อลดความซับซ้อน

แก้ไข: นี่เป็นวิธีที่ดีในการใช้คอมไพล์ที่ฉันใช้กับโปรเจ็กต์ทั้งหมดของฉัน


เฮ้ (: เป็นเวิร์กโฟลว์ที่ยอดเยี่ยมจริงๆที่ครอบคลุมโซลูชันที่เป็นไปได้ทั้งหมด
Hakan Deryal

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

2
ความสวยงามของวิธีการ nvie สำหรับฉันคือฉันไม่จำเป็นต้องเข้าใจในตอนแรก ฉันสามารถค้นหาส่วนของสิ่งที่ฉันต้องการทำและพิมพ์คำสั่ง หลังจากนั้นไม่กี่ครั้งมันก็กลายเป็นธรรมชาติและภายในสองสามวันฉันก็เต้นไปรอบ ๆ กิ่งไม้อย่างมืออาชีพ!
Killroy

หวังว่าจะเข้าใจแนวทาง gitflow โดยใช้เพียงสุ่มสี่สุ่มห้าจะทำให้คุณพลาดความเรียบง่ายทั้งหมดที่คุณสามารถนำไปใช้กับสถานการณ์ของคุณได้ และ gitflow นั้นไม่เหมาะสมสำหรับทีมส่วนใหญ่ไม่ว่าจะซับซ้อนเกินไปหรือเรียบง่ายเกินไป
toolforger

151

แท็กคือไม่เปลี่ยนรูป

ในขณะที่คุณสามารถสร้างสาขาชื่อ "1.0.0" - คุณหรือใครก็ตามที่มีสิทธิ์ในการกระทำคุณสามารถกดไปที่สาขานั้น (โดยเจตนาหรือไม่ก็ตาม) และเปลี่ยนความหมายของ 1.0.0

คุณไม่สามารถทำได้ด้วยแท็กเมื่อคุณสร้างแท็กนั่นแหล่ะ แท็ก 1.0.0 หมายถึงตรงนั้นและไม่สามารถเปลี่ยนแปลงได้*

นั่นคือความแตกต่างหลักในทางปฏิบัติระหว่างแท็กและสาขา

* คุณสามารถลบและสร้างแท็กใหม่ได้ดังนั้นการเปลี่ยนแท็ก แต่ไม่ใช่โดยบังเอิญ


18

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

นี่คือบทความที่ดีเกี่ยวกับเวิร์กโฟลว์ประเภทนี้: http://nvie.com/posts/a-successful-git-branching-model/


18

สาขาและแท็กเป็นสิ่งเดียวกัน (ตัวชี้ไปที่คอมมิตหรือที่เรียกว่า"ref" ) ยกเว้นสาขาจะย้ายไปยังคอมมิตถัดไปโดยอัตโนมัติในขณะที่แท็กยังคงอยู่ตลอดไป1ในคอมมิตเดียวกัน

ในการสร้างรุ่นโดยทั่วไปคุณต้องการทำเครื่องหมาย "สแนปชอต" ของโค้ดที่สร้างรุ่นนั้นและคุณต้องการให้มีการทำเครื่องหมายในลักษณะนั้นแม้ในขณะที่คุณพัฒนาโค้ดต่อไปดังนั้นคุณจึงต้องใช้แท็ก

หากคุณพยายามใช้สาขาสำหรับสิ่งนั้นสาขานั้นอาจย้ายไปยังคอมมิตอื่นโดยไม่ได้ตั้งใจซึ่งไม่ได้สร้างรีลีส


1เว้นแต่คุณจะลบแท็กแน่นอน

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


เรียน @downvoter มีเหตุผลที่เฉพาะเจาะจงใด ๆ ในการโหวตลงหรือไม่?
Branko Dimitrijevic

ฉันไม่ได้ลงคะแนนคำตอบของคุณ แต่คุณหมายถึงอะไรที่“ สาขาย้ายไปยังการคอมมิตถัดไปโดยอัตโนมัติ” สาขาจะไม่ย้ายไปที่การคอมมิตใด ๆ โดยอัตโนมัติ การรันgit commitการอัปเดตส่วนหัวของสาขาที่เช็คเอาต์เพื่ออ้างอิงการคอมมิตใหม่ใช่ แต่ไม่มีสาขาอื่น "โดยอัตโนมัติ" ย้ายไปที่คอมมิตถัดไป คุณควรชี้แจงย่อหน้าแรกของคำตอบของคุณ
แปรงสีฟัน

1
@Toothbrush แน่นอนว่านั่นคือสิ่งที่ฉันหมายถึง "เคลื่อนไหวโดยอัตโนมัติ" อย่างไรก็ตามสาขาไม่ได้ "เป็นเจ้าของ" การกระทำใด ๆ อย่างแท้จริงมันไม่ได้ชี้ไปที่ชุดของการกระทำ แต่เพียงแค่ชี้ไปที่การคอมมิตหนึ่งชุด (และส่วนที่เหลือสามารถบอกเป็นนัยได้บางครั้งก็ไม่ชัดเจนโดยการเดินกราฟคอมมิต) ภายใต้ git branch เป็นเพียงไฟล์บรรทัดเดียวภายใต้.git\refs\headsซึ่งมีแฮชของคอมมิต คำมั่นสัญญาว่าตัวเองไม่ "จำ" ว่าสาขาใดเป็นผู้สร้าง ซึ่งแตกต่างจาก Mercurial เช่นที่ข้อมูลสาขาสามารถเขียนลงในข้อมูลเมตาของคอมมิต
Branko Dimitrijevic

ใช่ แต่หลายคนไม่รู้ - โดยเฉพาะผู้มาใหม่ที่สับสนเกี่ยวกับวิธีการมากมายที่แนะนำทางออนไลน์ในการทำสิ่งต่างๆด้วย Git
แปรงสีฟัน

6

คุณใช้แท็กเพื่อบันทึกการกระทำที่สำคัญในประวัติศาสตร์ "นี่เป็นการคอมมิตที่แน่นอนที่เราใช้สำหรับเวอร์ชันนี้ในวันพฤหัสบดีที่ฝนตกเมื่อเซิร์ฟเวอร์บิวด์พัง" หากคุณใช้ branch แทนแท็กคุณจะไม่มีทางรู้ว่าคุณใช้การคอมมิตที่แน่นอนใด คุณรู้แค่ว่า "เราเปิดตัวเวอร์ชัน 1.1.0 ที่ไหนสักแห่งในสาขานี้" เว้นแต่คุณจะจดแฮชที่แน่นอนสำหรับคอมมิตนั้นด้วยตนเองซึ่งเป็นสาเหตุที่คุณใช้แท็กตั้งแต่แรก :)


4
ฉันคิดว่าเขาหมายถึงการสร้างสาขาที่ชื่อ 1.1.0 และไม่ได้ใช้อีกต่อไปดังนั้นมันจะแสดงโครงการในเวอร์ชันที่มีชื่อ
Hakan Deryal

2

นอกจากคำตอบอื่น ๆ แล้วนี่คือ 2 เซ็นต์ของฉัน

คำตอบสั้น ๆ :ใช้แท็กสำหรับรุ่นที่วางจำหน่าย

คำตอบแบบยาว:ฉันเชื่อว่าการใช้แท็กสำหรับการกำหนดเวอร์ชันโดยเฉพาะนั้นดีกว่าการใช้สาขา หากคุณต้องการอัปเดต relase ให้แยกสาขาออกจากการคอมมิตที่ติดแท็กและเมื่อคุณทำงานกับสาขานั้นเสร็จแล้ว (ส่วนใหญ่จะเป็นสาขาโปรแกรมแก้ไขด่วน) ให้สร้างแท็กใหม่ที่ส่วนหัวของสาขาใหม่นั้นด้วยเวอร์ชันใหม่ จากนั้นรวมสาขานั้นกลับเข้าใน master / development เนื่องจากคุณไม่ควรเปลี่ยนเวอร์ชันรีลีสจริงๆเว้นแต่จะเป็นโปรแกรมแก้ไขด่วนที่น่าจะรวมกลับเข้าไปในซอร์สโค้ดของคุณ จากนั้นลบสาขานั้นเนื่องจากไม่จำเป็นอีกต่อไป ถ้าคุณต้องการใช้โปรแกรมแก้ไขด่วนอื่นกับเวอร์ชันใหม่ให้ทำตามขั้นตอนเดิมซ้ำ

อ้างถึงส่วนของบทความต่อไปนี้ที่แสดงวิธีการผสานโปรแกรมแก้ไขด่วนกับเวิร์กโฟลว์ Git ของผู้เขียน - https://hackernoon.com/a-branching-and-releasing-strategy-that-fits-github-flow-be1b6c48eca2

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