คุณควรสาขาเมื่อใด


คำตอบ:


59

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

โดยทั่วไปคุณจะเห็นสาขาสองประเภท:

  • สาขาคุณลักษณะ: หากคุณลักษณะบางอย่างรบกวนมากพอที่คุณไม่ต้องการให้ทีมพัฒนาทั้งหมดได้รับผลกระทบในช่วงแรกคุณสามารถสร้างสาขาที่จะทำงานนี้ได้

  • สาขาการแก้ไข: ในขณะที่การพัฒนาดำเนินต่อไปบนลำตัวหลักสามารถสร้างสาขาการแก้ไขเพื่อเก็บการแก้ไขของซอฟต์แวร์เวอร์ชันล่าสุด

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


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

82

ในระยะทั่วไปวัตถุประสงค์หลักของการแยกทาง (ก VCS - รุ่นระบบควบคุม - คุณลักษณะ) เป็นเพื่อให้ได้รหัสแยก

คุณมีสาขาอย่างน้อยหนึ่งสาขาซึ่งเพียงพอสำหรับการพัฒนาตามลำดับและใช้สำหรับงานจำนวนมากที่กำลังบันทึก (มุ่งมั่น) ในสาขาที่ไม่ซ้ำกันนั้น

แต่โมเดลนั้นแสดงขีด จำกัด อย่างรวดเร็ว:

เมื่อคุณมีความพยายามในการพัฒนา (refactoring, evolution, bug-fixes, ... ) และคุณตระหนักดีว่าคุณไม่สามารถทำการเปลี่ยนแปลงในสาขาเดียวกันได้อย่างปลอดภัยกว่าสาขาการพัฒนาปัจจุบันของคุณ (เพราะคุณจะทำลาย API หรือแนะนำโค้ดที่จะทำลาย ทุกอย่าง) จากนั้นคุณต้องมีสาขาอื่น
(เพื่อแยกรหัสใหม่สำหรับรหัสเดิมแม้ว่าชุดรหัสทั้งสองชุดจะถูกรวมในภายหลัง)

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


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

(สาขาที่เรียกว่า "VonC" ไม่มีความหมายสำหรับนักพัฒนารายอื่น: จะเกิดอะไรขึ้นถ้า "VonC" ออกจากโครงการคุณจะทำอย่างไรกับ
สาขานี้สาขาที่เรียกว่า "bugfix_212" สามารถตีความได้ในบริบทของระบบติดตามข้อบกพร่องเช่น และนักพัฒนาทุกคนสามารถใช้มันได้อย่างน้อยก็มีความคิดเกี่ยวกับสิ่งที่เขาควรจะทำกับมัน)

สาขาไม่ใช่แท็ก (SVN เป็นระบบการแก้ไขซึ่งพยายามเสนอคุณลักษณะการกำหนดเวอร์ชันเช่นการแยกสาขาและการแท็กผ่านไดเรกทอรีที่มีสำเนาไฟล์ราคาถูกซึ่งไม่ได้หมายความว่าแท็กเป็นสาขา)

ในการกำหนดสาขาหมายถึงการกำหนดเวิร์กโฟลว์การผสาน : คุณจำเป็นต้องรู้ว่าจะผสานสาขาของคุณที่ใดเมื่อคุณทำเสร็จแล้ว
ด้วยเหตุนี้บทที่ 7 ของ Practical Perforce (Laura WINGERD - O'Reilly) จึงเป็นบทนำที่ดี (VCS ไม่เชื่อเรื่องพระเจ้า) เพื่อผสานเวิร์กโฟลว์ระหว่างสาขาประเภทต่างๆ: "" ซอฟต์แวร์วิวัฒนาการอย่างไร "(pdf)

กำหนดคำว่าcodeline (สาขาที่บันทึกขั้นตอนการวิวัฒนาการที่สำคัญของรหัสไม่ว่าจะผ่านแท็กในบางจุดหรือผ่านการผสานที่สำคัญกลับไปที่สาขา)

แนะนำโมเดลเมนไลน์ (โคไลน์กลางเพื่อบันทึกการเผยแพร่) และอธิบายวัตถุประสงค์ต่างๆสำหรับการแตกแขนง:

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

แนวคิดที่น่าสนใจอื่น ๆ เกี่ยวกับ VCS: แนวคิดพื้นฐาน
(เกี่ยวกับ ClearCase เดิม แต่ยังใช้ได้กับ VCS ใด ๆ )


19

SCM ในศตวรรษที่ 21 ทั้งหมดกำลังบอกคุณ:

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

คุณได้รับ:

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

เครื่องมือที่สามารถทำได้:

เครื่องมือที่ไม่สามารถทำได้:

  • SVN
  • CVS
  • VSS
  • TFS
  • บังคับ

1
ทำไมคุณไม่สามารถทำได้ด้วย SVN ??
yegor256

4
SVN ไม่ใช่การรวมที่ดี เนื่องจากขาดการติดตามการผสานที่เหมาะสม เนื่องจากการสร้างสาขานั้นไม่ถูกเหมือนในสาขาที่ฉันชี้ไว้มันจึงกลายเป็นฝันร้ายภายใต้สภาพจริง
pablo

การตรวจสอบย้อนกลับที่ดีกว่า: ทำไมคุณถึงต้องการกระทำหลาย ๆ ครั้งตามที่คุณต้องการ? หนึ่งครั้งต่องานไม่เพียงพอเมื่องานนั้นไม่ใช่คุณสมบัติที่ซับซ้อน? นอกจากนี้ข้อบกพร่องจากคนทั่วไปยังสามารถเดินทางไปยังสาขาหลักได้อย่างง่ายดายและทำให้ไม่ "คงที่" และไม่ "ปลอดภัย" ในขณะที่พวกเขารวมเข้าด้วยกัน
Paiman Samadian

@PaimanSamadian: "หนึ่งครั้งต่องานไม่เพียงพอเมื่องานนั้นไม่ใช่คุณลักษณะที่ซับซ้อน" แน่นอน ในทำนองเดียวกันเมื่องานมีความซับซ้อนการกระทำหนึ่งครั้งก็ไม่เพียงพอ (ฉันทำทุกสองสามนาทีหากสิ่งต่างๆเป็นไปด้วยดี) เหตุใดจึงต้องบังคับให้กระทำหนึ่งครั้งต่อหนึ่งงาน • "นอกจากนี้ข้อบกพร่องจากผู้คนสามารถเดินทางไปยังสาขาหลักได้อย่างง่ายดาย" ไม่จริง จุดสำคัญส่วนหนึ่งของเวิร์กโฟลว์สาขาคุณลักษณะคือทำให้สามารถตรวจสอบและทดสอบโค้ดได้ก่อนที่โค้ดจะรวมเข้ากับสาขาหลัก
Marnen Laibow-Koser

1
@PaimanSamadian การเช็คอินหลายรายการเป็นสิ่งที่ดีในการอธิบายการเปลี่ยนแปลงระดับกลางและทำให้การตรวจสอบง่ายขึ้น นอกจากนี้หากคุณทำงานบางอย่างเพียงไม่กี่ชั่วโมงการเช็คอินหลายครั้งจะดีมาก
pablo

8

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

SCM อื่น ๆ เช่นการโค่นล้มและ CVS มีกระบวนทัศน์ที่แตกแขนง "หนักกว่า" มาก นั่นหมายความว่าสาขาจะถือว่าเหมาะสมสำหรับสิ่งที่ใหญ่กว่าแพทช์ยี่สิบบางอย่างเท่านั้น มีการใช้สาขาแบบคลาสสิกเพื่อติดตามแทร็กการพัฒนาทั้งหมดเช่นเวอร์ชันผลิตภัณฑ์ก่อนหน้าหรือในอนาคต


5

เมื่อคุณต้องการทำการเปลี่ยนแปลงที่สำคัญและ / หรือทดลองกับ codebase ของคุณโดยเฉพาะอย่างยิ่งหากคุณต้องการทำการเปลี่ยนแปลงระดับกลางโดยไม่ส่งผลกระทบต่อ trunk


5

ขึ้นอยู่กับประเภทของ SCM ที่คุณใช้

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

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

ในระบบรุ่นเก่าที่มีที่เก็บส่วนกลาง (เช่น CVS, SVN และ ClearCase) มันเป็นปัญหาที่ร้ายแรงกว่ามากซึ่งจำเป็นต้องได้รับการตัดสินใจในระดับทีมและคำตอบควรเป็นเช่น 'เพื่อรักษารุ่นเก่าในขณะที่อนุญาต การพัฒนาเพื่อดำเนินการต่อในบรรทัดหลัก 'หรือ' เป็นส่วนหนึ่งของการทดลองที่สำคัญ '

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


3

ฉันพบว่าคำแนะนำจาก Laura Wingerd & Christopher Seiwald ที่ Perforce นั้นกระชับและมีประโยชน์จริงๆ:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

โปรดดูที่http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdfสำหรับคำอธิบายโดยละเอียดของแต่ละข้อและแนวทางปฏิบัติที่ดีที่สุดอื่น ๆ


3
คน P4 เคยพูดแบบนี้ แต่ปัจจุบันการตลาดของพวกเขาบอกอะไรที่แตกต่างออกไป พวกเขาพยายามหลีกเลี่ยงการแยกสาขาเป็นเวลาหลายปีเพียงเพราะพวกเขาไม่สามารถทำงานหรือสาขาหัวข้อได้ดีเท่ากับระบบอื่น ๆ เช่น Git
pablo

กระแสตอบรับปี 2558! เหตุผลในการหลีกเลี่ยง Branch คือการหลีกเลี่ยงความจำเป็นในการผสานไม่ใช่เพราะ Perforce ไม่มีสาขางาน / หัวข้อ (คุณสามารถทำ "สาขางาน" ในสตรีมได้ - ใน Perforce เราเรียกว่า "สตรีมงาน" ตามที่คนอื่นกล่าวไว้ - การแยกสาขาเป็นนัยใน DVCS และคำถามจะไม่เคารพฉันคิดว่าการสนทนาควร จำกัด เฉพาะเครื่องมือที่ทำงานในรูปแบบไคลเอนต์เซิร์ฟเวอร์หรือ DVCS ที่ใช้แบบรวมศูนย์ (ตั้งแต่รุ่น 2015.1 คุณสามารถใช้ Perforce ในโหมด DVCS ได้ - ดีที่สุดของทั้งสองโลก)
Lester Cheung

2

มีวัตถุประสงค์หลายประการในการแตกแขนง:

  1. สาขาคุณลักษณะ / จุดบกพร่อง สาขาแบบไดนามิกและแอคทีฟที่ย้ายกลับไปที่ลำตัวเมื่อคุณลักษณะ / การแก้ไขข้อบกพร่องเสร็จสมบูรณ์
  2. กิ่งก้านคงที่ (แท็กในการโค่นล้มแม้ว่าในสาระสำคัญเป็นเพียง 'สาขาปกติ') พวกเขาให้ภาพรวมแบบคงที่ของการพูดการเปิดตัว แม้ว่าจะสามารถใช้งานได้ แต่ก็ยังคงไม่ถูกแตะต้อง

1

ความจำเป็นในการแยกสาขาอาจเกิดขึ้น:

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


  • 1

    เมื่อใดก็ตามที่คุณรู้สึกชอบ

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

    OTOH ไม่มีความแตกต่างทางเทคนิคระหว่างสาขาและการชำระเงินใน SCM แบบกระจายและการรวมจะง่ายกว่ามาก คุณจะรู้สึกเหมือนแตกแขนงบ่อยขึ้น


    0

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

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


    0

    ทิ้งเทคนิคกันไปเลย .....

    สาขาเมื่อคุณรู้ว่าการรวมกลับง่ายขึ้น!

    โปรดทราบว่าการรวมจะมีผลกับวิธีดำเนินงานในโครงการเสมอ

    เมื่อสิ่งนี้ประสบความสำเร็จปัญหาในระดับอุดมศึกษาอื่น ๆ ทั้งหมดจะเข้ามาเล่น

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