ใน git มันเป็นความคิดที่ดีที่จะสร้างแท็กที่มีชื่อเดียวกันกับสาขาที่ถูกลบหรือไม่?


20

ผมมีโครงการที่มีการแตกแขนงคอมไพล์รูปแบบที่ประมาณดังนี้ว่าnvie ของคอมไพล์ไหล

สาขาที่วางจำหน่ายของเรามีชื่ออยู่ในรูปแบบของSemVerเช่นv1.5.2

เมื่อสาขาย่อยได้รับไฟสีเขียวเพื่อการผลิตเราจะปิดสาขาโดยรวมมันเข้ากับต้นแบบใช้แท็กแล้วลบสาขา

เมื่อเราลบสาขาที่วางจำหน่ายทันทีเราได้ใช้ตัวระบุเดียวกันสำหรับการติดแท็กสาขาเช่น v1.5.2

นี่คือคำสั่งที่เราใช้ปิดสาขาที่วางจำหน่าย:

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr origin/v1.5.2
$ git push origin :v1.5.2
$ git push
$ git push --tags

ดูเหมือนว่าจะทำงานได้ในกรณีส่วนใหญ่อย่างไรก็ตามเป็นสาเหตุของปัญหาในสถานการณ์ที่อินสแตนซ์อื่นของ git repo (เช่นเครื่อง dev อื่นหรือสภาพแวดล้อมการจัดเตรียม) มีการชำระเงินในท้องถิ่นของสาขา v1.5.2

git push origin :v1.5.2คำสั่งจะลบสาขาในระยะไกล แต่ไม่ได้ลบรุ่นท้องถิ่นของสาขา (ถ้ามี) ใน Repos ทั้งหมด

สิ่งนี้นำไปสู่การอ้างอิงที่คลุมเครือเมื่อลองชำระเงินv1.5.2ใน repos เหล่านั้น:

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

สามารถหลีกเลี่ยงได้โดยไม่ใช้ไวยากรณ์ที่แตกต่างกันสำหรับกิ่งเช่นrelease-v1.5.2หรือv1.5.2-rc?

หรือเป็นสิ่งที่หลีกเลี่ยงไม่ได้และดังนั้นจึงเป็นความคิดที่ไม่ดีในการสร้างแท็กที่มีชื่อเดียวกับสาขาที่ถูกลบ?

คำตอบ:


19

หากคุณต้องการคงรูปแบบการตั้งชื่อนี้ไว้คุณอาจ:

ตัดสินใจว่าคุณไม่สนใจคำเตือนเหล่านี้

นั่นคือถ้าคุณมีความสุขกับความจริงที่ว่า:

  • git checkout <ref>จะตรวจสอบrefs/heads/<ref>มากกว่าrefs/tags/<ref>(ดูgit-checkout )
  • คำสั่งอื่น ๆ จะใช้refs/tags/<ref>เกินrefs/heads/<ref>(ดูgitrevisions )

ตัวอย่างเช่นในที่เก็บการทดสอบนี้v1.5.2สาขาจะชี้ให้ยอมรับ B แต่v1.5.2แท็กจะชี้ไปที่ A

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkout ชอบชื่อสาขา:

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

แต่git logจะใช้ชื่อแท็ก:

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

นี่อาจทำให้สับสน

อบรมผู้คนให้ลบสาขาในท้องที่เมื่อพวกเขาเห็นแท็กใหม่

สิ่งนี้อาจยาก / ไม่สะดวกขึ้นอยู่กับขนาดขององค์กรของคุณ

เขียนเสื้อคลุมรอบ "git pull" และ "git fetch"

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

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


ขอบคุณสำหรับคำตอบ มีประโยชน์มาก รัฐสัญลักษณ์แรกของคุณที่git checkoutจะตรวจสอบแท็กกว่าสาขาเมื่อมีการอ้างอิง ambigious ไม่ทั้งหมดเรียนอย่างไรก็ตามเรื่องนี้ไม่ได้เป็นพฤติกรรมที่ฉันเห็น Ref: gist.github.com/tommarshall/9376724 นี่เป็นบางสิ่งที่เปลี่ยนแปลงไปในเวอร์ชั่นที่ทันสมัยกว่าหรือไม่? มีธงที่ฉันสามารถตั้งค่าgitconfigเพื่อให้ได้พฤติกรรมนี้หรือไม่?
tommarshall

คุณพูดถูกฉันผิดอย่างสมบูรณ์ ขออภัย! ฉันได้แก้ไขคำตอบและเพิ่มตัวอย่างแล้ว
benj

10

คุณสามารถระบุได้อย่างชัดเจนว่าคุณต้องการสาขาหรือแท็กโดยใช้ชื่อเต็ม:

 git checkout refs/heads/v1.5.2

หรือ

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