แท็กต่างจากสาขาใน Git อย่างไร ฉันควรใช้อันไหนดี


616

ฉันมีปัญหาในการทำความเข้าใจวิธีใช้แท็กกับสาขาใน.

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


4
เนื่องจากการค้นหาเว็บสำหรับวิธีการใช้แท็ก git พาฉันไปที่ลิงก์นั้นก่อนฉันจึงเพิ่มว่ามีคำตอบที่ดีกว่า (IMHO) เกี่ยวกับแท็กที่นี่: stackoverflow.com/questions/35979642/ …
Alexei Martianov

คำตอบ:


520

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

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

จริงๆแล้วมันซับซ้อนกว่านี้ - หรือซับซ้อนกว่าที่คุณต้องการ - แต่ตัวอย่างเหล่านี้ควรให้ความคิดเกี่ยวกับความแตกต่าง


40
ในกรณีของเขาเขาต้องการที่จะใช้สาขาบางทีคุณควรทราบในคำตอบของคุณ;)
knittl

13
AFAIK, แท็กไม่ซ้ำกันในแต่ละสาขา ดังนั้นคุณไม่สามารถตั้งชื่อเดียวกันสำหรับการกระทำที่แตกต่างกันในแต่ละสาขา
MY

5
@MY แน่นอนว่าไม่ใช่เรื่องเลวร้าย IMHO โดยเฉพาะอย่างยิ่งในวิธีที่อธิบายโดย tvanfosson การมีมากกว่าหนึ่งแท็กที่มีชื่อเดียวกันในสาขาต่าง ๆ อาจยากที่จะรักษา จากตัวอย่างฉันจะคิดว่าถ้าคุณสามารถมีแท็กที่มีชื่อเดียวกันในสาขาต่าง ๆ มันจะถูกจัดตั้งขึ้นอย่างรวดเร็วว่าเป็นการปฏิบัติที่ไม่ดี ดีใจที่ได้ทราบว่าคุณทำไม่ได้ ขอบคุณฉัน!
หมุน

28
แท็กเป็นเพียงนามแฝงสำหรับแฮชการกระทำ เช่นเดียวกับคุณสามารถชำระเงินการกระทำด้วยgit checkout 88c9f229fคุณสามารถทำสิ่งที่ชอบgit checkout your_tagและคุณจะชำระเงินการกระทำที่มีชื่อแทนโดยแท็ก
jterm

6
@ jterm ไม่ใช่ชื่อแทนสาขาด้วยใช่ไหม ข้อแตกต่างเพียงอย่างเดียวคือนามแฝงสาขาจะกำหนดตัวเองโดยอัตโนมัติกับการกระทำล่าสุดในห่วงโซ่
Viktor Molokostov

529

จากมุมมองทางทฤษฎี :

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

จากมุมมองทางเทคนิค :

  • แท็กอาศัยอยู่ในrefs/tags/namespace และสามารถชี้ไปที่วัตถุแท็ก (ข้อเขียนและเลือก GPG ลงนามในแท็ก) หรือโดยตรงไปยังกระทำวัตถุ (น้ำหนักเบาแท็กการใช้งานน้อยสำหรับชื่อท้องถิ่น) หรือในกรณีที่หายากมากแม้กระทั่งวัตถุต้นไม้หรือวัตถุหยด (เช่นจีพีจีลายเซ็น )
  • สาขาอยู่ในrefs/heads/namespace และสามารถชี้เท่านั้นที่จะกระทำวัตถุ HEADชี้ต้องดูสาขา (อ้างอิงสัญลักษณ์) หรือโดยตรงไปยังกระทำ (HEAD แฝดหรือสาขาที่ไม่มีชื่อ)
  • ระยะไกลติดตามสาขาอยู่ในrefs/remotes/<remote>/namespace <remote>และทำตามสาขาสามัญในพื้นที่เก็บข้อมูลระยะไกล

ดูmanpage gitglossary เพิ่มเติม :

สาขา

"branch" เป็นสายการพัฒนาที่ใช้งานอยู่ การคอมมิชชันล่าสุดในสาขาถูกอ้างถึงเป็นส่วนปลายของสาขานั้น ส่วนปลายของสาขาถูกอ้างอิงโดยหัวหน้าสาขาซึ่งเคลื่อนที่ไปข้างหน้าเมื่อมีการพัฒนาเพิ่มเติมในสาขา พื้นที่เก็บข้อมูล git เดียวสามารถติดตามจำนวนสาขาโดยพลการ แต่แผนผังการทำงานของคุณเชื่อมโยงกับหนึ่งในนั้น (สาขา "ปัจจุบัน" หรือ "เช็คเอาต์" สาขา) และ HEAD ชี้ไปที่สาขานั้น

แท็ก

การอ้างอิงที่ชี้ไปที่แท็กหรือการมอบหมายวัตถุ ตรงกันข้ามกับส่วนหัวแท็กจะไม่เปลี่ยนแปลงโดยการส่งข้อมูล แท็ก (ไม่วัตถุแท็ก) $GIT_DIR/refs/tags/จะถูกเก็บไว้ใน [ ... ] โดยทั่วไปแท็กมักใช้เพื่อทำเครื่องหมายจุดเฉพาะในห่วงโซ่การคอมมิท

แท็กวัตถุ

วัตถุที่มีการอ้างอิงชี้ไปยังวัตถุอื่นซึ่งสามารถมีข้อความเช่นเดียวกับวัตถุกระทำ นอกจากนี้ยังสามารถมีลายเซ็น (PGP) ซึ่งในกรณีนี้จะเรียกว่า "วัตถุแท็กที่ลงนาม"


36
คำถาม: ถ้าคุณปฏิบัติกับสาขาเหมือนแท็ก (นั่นคือคุณสร้างมันแล้วไม่เคยอัปเดต) มีความแตกต่างที่แท้จริงหรือไม่?
Steve Bennett

30
@SteveBennett อย่างแน่นอน มีข้อมูลที่แตกต่างกัน (คุณสามารถลงชื่อแท็กคุณสามารถเพิ่มคำอธิบายไปยังสาขา) คุณสามารถย้ายสาขาได้ (แม้ว่าคุณจะไม่เคยอัปเดตก็ตามคุณยังสามารถรีบูตได้) คุณไม่สามารถย้ายแท็ก (ลิงก์ไปยังการคอมมิทเฉพาะ) คุณสามารถเลือกที่จะผลักดันสาขา แท็กจะไม่ถูกผลักดันโดยค่าเริ่มต้น คุณไม่ควรใช้สิ่งใดสิ่งหนึ่งกับสิ่งอื่น (เว้นแต่คุณจะอยู่ในความคิดแบบ SVN จริง ๆ ซึ่งในกรณีนี้คุณต้อง "เลิกเรียนรู้" อย่างรวดเร็วถ้าคุณต้องการที่จะใช้คอมไพล์)
VonC

19
@SteveBennett: มีความแตกต่างที่ Git ปฏิบัติกับกิ่งไม้กับวิธีที่ใช้กับแท็ก นอกจากสิ่งที่ VonC กล่าวไว้คุณไม่สามารถเลื่อนแท็กโดยไม่ได้ตั้งใจ: " git checkout <tag>" จะสร้างสาขาที่ไม่มีชื่อแบบไม่ระบุชื่อ (เรียกว่า 'HEAD HEAD') และเลือกสถานะของแท็ก การสร้างการคอมมิชชันใหม่จะทำในสาขาที่ไม่มีชื่อและไม่เปลี่ยนแท็กที่ชี้ไป
Jakub Narębski

60
IMO สาขาจะถูกแยกเส้นลำดับเวลา (โลกคู่ขนาน) และแท็กเป็นช่วงเวลาเฉพาะในช่วงเวลา
Eonil

25
ยังไม่มีใครพูดถึงที่นี่ แต่คุณสามารถใช้แท็กเป็นจุดเริ่มต้นสาขา:git checkout -b <branch name> <tag name>

143

หากคุณคิดว่าที่เก็บของคุณเป็นหนังสือที่บันทึกความคืบหน้าเกี่ยวกับโครงการของคุณ ...

สาขา

คุณสามารถนึกถึงสาขาเป็นหนึ่งในที่คั่นหน้าเหนียวเหล่านั้น:

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

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

นอกจากนี้คุณสามารถย้ายบุ๊คมาร์คเฉพาะไปยังหน้าอื่น ๆ ของหนังสือได้ตลอดเวลา ( git-resetเช่นใช้); จุดที่น่าสนใจมักจะแตกต่างกันไปตามกาลเวลา

แท็ก

คุณสามารถคิดว่าแท็กเป็นหัวของบท

บุ๊ก

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


16
ฉันคิดว่าสาขาจะเป็นหนังสือและที่คั่นหน้าเป็นแท็ก คุณสามารถเขียนหนังสือต่อไปได้ แต่ไม่สามารถแก้ไขได้ แท็กเป็นเพียงช่วงเวลาที่คงที่ในหนังสือ
Mārtiņš Briedis

5
@Jubobs ฉันชอบคำอธิบายสาขาเป็นแนวการพัฒนา หนังสือจะเป็นสาขา คุณสามารถเริ่มหนังสือเล่มใหม่ตามสถานที่ที่เหลือสาขาหลัก คุณสามารถเขียนพาราลิลได้จากนั้นลองรวมเข้ากับหนังสือเล่มเดียว / สาขา
Mārtiņš Briedis

2
@ MārtiņšBriedisฉันเข้าใจวิธีที่คุณคิดสาขา แต่ฉันพบว่าใน Git นั่นทำให้เข้าใจผิด ดูstackoverflow.com/questions/25068543/…
jub0bs

2
อันนี้เป็นคำตอบที่ประหยัดเวลาจริงๆ
Ali Foroughi

2
หากคุณเริ่มเขียนหนังสือและมี 50 หน้าแรกคุณสามารถคัดลอก (สร้างสาขาใหม่จากนั้น) และเขียนหนังสือสองเล่มต่อไปพร้อมกัน (หรือมอบสำเนาหนังสือให้นักเขียนคนอื่น - ผู้พัฒนา) และในที่สุดคุณก็สามารถผสาน เปลี่ยนจากหนังสือเล่มอื่นเป็นหนังสือของคุณ
barell

42

สิ่งที่คุณต้องรู้มาจาก CVS คือคุณไม่ได้สร้างไดเรกทอรีอีกต่อไปเมื่อตั้งค่าสาขา
ไม่มี "แท็กปักหมุด" (ซึ่งสามารถใช้ได้กับไฟล์เดียวเท่านั้น) หรือ "แท็กสาขา"
Branch และแท็กเป็นวัตถุสองชนิดที่แตกต่างกันใน Git และพวกมันจะใช้กับrepo ทั้งหมด

คุณจะไม่ (ด้วย SVN ในเวลานี้) ต้องจัดโครงสร้างที่เก็บของคุณอย่างชัดเจนด้วย:

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

โครงสร้างนั้นมาจากข้อเท็จจริงที่ว่า CVS เป็นระบบแก้ไขและไม่ใช่ระบบเวอร์ชัน (ดูการควบคุมแหล่งที่มากับการควบคุมการแก้ไข? )
นั่นหมายความว่ากิ่งก้านจะถูกจำลองผ่านแท็กสำหรับ CVS สำเนาไดเรกทอรีสำหรับ SVN

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

ใน Git ประวัติความเป็นมาของการแก้ไขเป็นชุดของความมุ่งมั่นก่อตัวเป็นกราฟ
สาขาคือหนึ่งเส้นทางของกราฟนั้น

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • หากคุณชำระเงินแท็กคุณจะต้องสร้างสาขาเพื่อเริ่มทำงาน
  • หากคุณชำระเงินสาขาคุณจะเห็นการกระทำล่าสุด ('หัว') ของสาขานั้นโดยตรง

ดู คำตอบของ Jakub Narębskiสำหรับด้านเทคนิคทั้งหมด แต่ตรงไปตรงมา ณ จุดนี้คุณไม่จำเป็นต้อง (ยัง) รายละเอียดทั้งหมด;)

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


ในกรณีของคุณนักพัฒนาซอฟต์แวร์แต่ละคนทำงานกับคุณสมบัติเฉพาะ:

  • ควรสร้างสาขาของตัวเองในที่เก็บของตน
  • ติดตามสาขาจากที่เก็บของเพื่อนร่วมงาน (สาขาที่ทำงานในฟีเจอร์เดียวกัน)
  • การดึง / ผลักเพื่อแบ่งปันงานของคุณกับเพื่อน

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


1
ขอบคุณที่ให้ความกระจ่างว่ากิ่งและแท็กทำงานอย่างไร :) ฉันจะไม่สามารถเข้าใจได้อย่างสมบูรณ์หากไม่มีตัวอย่างของคุณ
ufk

3
@VonC: ฉันคิดว่าคุณหมายถึง "SVN" ในคำตอบของคุณและไม่ใช่ "CVS" CVS ไม่มีโครงสร้างไดเรกทอรี SVN ทำ อันที่จริงแล้วการติดแท็กในคอมไพล์ทำให้ฉันนึกถึงการติดแท็กใน RCS / CVS มากกว่าการแท็กใน SVN (โดยที่ tag == ทำให้สาขาแย่ลง)
Chris Cleeland

1
@ChrisCleeland จุดที่ดี ฉันได้พยายามแยกคะแนน CVS และ SVN อีกเล็กน้อยในคำตอบ (แก้ไข)
VonC

37

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

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


3
รักการเปรียบเทียบ
doz87

16

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


11
รับประกันว่าแท็กจะชี้ไปที่การคอมมิชชันเดิมตราบเท่าที่มีอยู่ ไม่จริงอย่างสมบูรณ์ git tag -fจริงๆคุณสามารถย้ายแท็กที่มี
jub0bs

14

แท็กสามารถทั้งลงนามหรือไม่มีการลงชื่อ ; สาขาไม่เคยลงนาม

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

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


12

ผมชอบที่จะคิดว่าของสาขาเป็นที่คุณจะ , แท็กเป็นที่คุณได้รับที่คุณได้รับ

แท็กรู้สึกเหมือนบุ๊คมาร์คที่มีความสำคัญในอดีตเช่นการเปิดตัวเวอร์ชัน

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


10

Git อุปมาอธิบายถึงวิธี DVCS ทั่วไปได้รับการสร้างขึ้นและทำไมผู้สร้างของพวกเขาทำในสิ่งที่พวกเขาทำ นอกจากนี้คุณอาจต้องการที่จะดูที่Git สำหรับนักวิทยาศาสตร์คอมพิวเตอร์ ; มันอธิบายสิ่งที่วัตถุแต่ละประเภทใน Git ทำรวมถึงกิ่งและแท็ก


6

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



4

คำตอบง่ายๆคือ:

branch: ตัวชี้แบรนช์ปัจจุบันจะย้ายไปพร้อมกับคอมมิททุกรายการที่เก็บไว้

แต่

แท็ก: ความมุ่งมั่นที่จุดแท็กจะไม่เปลี่ยนแปลงอันที่จริงแล้วแท็กนั้นเป็นสแนปช็อตของการกระทำนั้น

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