Git branching และการติดแท็กแนวทางปฏิบัติที่ดีที่สุด


140

ฉันกำลังเรียนรู้ที่จะใช้ Git โดยการอ่านPro Git ตอนนี้ฉันกำลังเรียนรู้เกี่ยวกับการแตกแขนงและแท็ก คำถามของฉันคือเมื่อฉันควรใช้สาขาและเมื่อฉันควรใช้แท็ก?

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

คำตอบ:


161

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

มีอนุสัญญาที่ชัดเจนเกี่ยวกับการเก็บรหัสของคุณในสาขาแยกจากสาขาหลัก:

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

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

แนวทางปฏิบัติที่ดีที่จะปฏิบัติตาม

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

แนวทางปฏิบัติในการติดแท็ก

ดังที่คุณทราบแล้ว Git ให้ตัวระบุรหัสเช่น 1.0-2-g1ab3183 แต่นั่นไม่ใช่แท็ก! การติดแท็กเสร็จสิ้นด้วยแท็ก git และแท็กที่สร้างขึ้นโดยใช้แท็ก git เป็นพื้นฐานสำหรับการระบุตัวระบุ git ที่อธิบายถึงการสร้าง กล่าวอีกนัยหนึ่งใน Git คุณไม่ต้องติดแท็กสาขา คุณกำลังติดแท็ก มันถูกต้องที่จะบอกว่าแท็กนั้นเป็นเพียงตัวชี้หมายเหตุประกอบเพื่อคอมมิชชัน

ให้ดูตัวอย่างการปฏิบัติที่แสดงให้เห็นว่ามัน

                        / - [v1.0]
                       โวลต์
---. ---. --- .--- S ---.--- A <- master
                         \ 
                           \ -.--- B <- ทดสอบ

มากระทำ 'S' กันเถอะชี้ด้วยแท็ก 'v1.0' การกระทำนี้มีทั้งที่ 'อาจารย์' และสาขา 'ทดสอบ' ถ้าคุณเรียก " คอมไพล์อธิบาย " ที่ด้านบนของการกระทำ 'A' (ด้านบนของ 'โทสาขา) v1.0-2-g9c116e9คุณจะได้รับสิ่งที่ต้องการ หากคุณเรียกใช้ "git อธิบาย" ด้านบนของการกระทำ 'A' (หรือที่เรียกว่า 'การทดสอบ' สาขา) คุณจะได้รับสิ่งที่ต้องการv1.0-2-g3f55e41นั่นคือกรณีที่มีการกำหนดค่า git-อธิบายเริ่มต้น โปรดทราบว่าผลลัพธ์นี้จะแตกต่างกันเล็กน้อย v1.0-2-g9c116e9หมายความว่าเราอยู่ที่กระทำกับ sortened SHA-1 ID ของ9c116e92 v1.0กระทำหลังแท็ก ไม่มีแท็กv1.0-2!

หากคุณต้องการให้แท็กของคุณปรากฏเฉพาะใน 'master' ของสาขาคุณสามารถสร้างคอมมิทใหม่ (เช่นอัปเดตเฉพาะข้อมูลเวอร์ชันเริ่มต้น / ทางเลือกใน GIT-VERSION-FILE) หลังจากการแยกสาขาของสาขา 'ทดสอบ' หากคุณติดแท็กในสาขา 'test' ด้วยเช่น 'v1.0.3` จะเห็นได้จาก' test 'เท่านั้น

อ้างอิง

ฉันพบบล็อกและโพสต์ที่มีประโยชน์มากมายเพื่อเรียนรู้จาก อย่างไรก็ตามสิ่งที่แสดงอย่างมืออาชีพนั้นเป็นของหายาก ดังนั้นฉันอยากจะแนะนำโพสต์ - รูปแบบการแยกสาขาของ Git ที่ประสบความสำเร็จโดย @nvie ฉันยืมภาพประกอบของเขา :)

ป้อนคำอธิบายรูปภาพที่นี่


4
1.0-2-g1ab3183 เป็นตัวระบุที่สร้างโดย git อธิบายจากข้อมูลที่มีอยู่จาก git แต่เรียกมันว่า git identifier นั้นน้อยเกินไป Git ระบุโดยแฮช SHA; แท็กและกิ่งไม้เป็นโครงสร้างของมนุษย์ที่คอมไพล์คอยช่วยติดตาม ดังนั้นให้สร้างแท็กเมื่อคุณคิดว่าวันหนึ่งมนุษย์จะต้องการหาบุ๊กมาร์กที่สะดวกสำหรับการส่งมอบ
mabraham

2
ภาพประกอบที่ยอดเยี่ยมของหลายมิติในจักรวาลคอมไพล์ สวย. ขอบคุณ
Tope

เป็นที่น่าสังเกตว่าหลาย ๆ โครงการไม่จำเป็นต้องมีเลนที่แสดงในแผนภาพนี้ บางโครงการต้องการเพียงสิ่งที่เรียกว่าการพัฒนาและคุณลักษณะที่นี่ สิ่งนี้มักเป็นจริงสำหรับเว็บแอปที่สามารถปรับใช้ได้ตามต้องการ
usr

37

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

คุณควรเพิ่มแท็กเพื่อทำเครื่องหมายรุ่นที่วางจำหน่าย หากคุณต้องการแก้ไขข้อผิดพลาดของรีลีสนั้นคุณต้องสร้างสาขาที่แท็ก

คุณต้องการลบสาขาที่รวมกลับเข้าไปใน HEAD [หรือสาขาอื่น ๆ ]


3
โอ้ ... และฉันคิดว่าคุณหมายความว่าสาขานั้นถูกรวมเข้ากับสาขาอื่นเช่นอาจารย์ ย้ายหัวทุกครั้งที่ฉันเช็คเอาต์ใช่ไหม
Code-Guru

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