ไปที่สาขาหรือไม่ที่จะแตกสาขา?


84

เมื่อไม่นานมานี้เวิร์กโฟลว์การพัฒนาของฉันมีดังต่อไปนี้:

  1. รับคุณสมบัติจากเจ้าของผลิตภัณฑ์
  2. ทำสาขา (หากคุณลักษณะมากกว่า 1 วัน)
  3. นำไปใช้ในสาขา
  4. ผสานการเปลี่ยนแปลงจากสาขาหลักไปยังสาขาของฉัน (เพื่อลดความขัดแย้งระหว่างการรวมย้อนหลัง)
  5. ผสานสาขาของฉันกลับไปที่สาขาหลัก

บางครั้งมีปัญหาในการรวม แต่โดยทั่วไปฉันชอบมัน

แต่เมื่อเร็ว ๆ นี้ฉันเห็นผู้ติดตามความคิดมากขึ้นเรื่อย ๆ ที่จะไม่สร้างสาขาเพราะมันยากที่จะฝึกการรวมกลุ่มอย่างต่อเนื่องการจัดส่งต่อเนื่อง ฯลฯ และฟังดูตลกโดยเฉพาะจากผู้ที่มีพื้นหลัง VCS กระจาย Git, Mercurial ฯลฯ

ดังนั้นคำถามคือเราควรใช้สาขาทุกวันนี้ไหม?


2
ฉันแน่ใจว่านี่เป็นแพลตฟอร์มที่เหมาะสมสำหรับสิ่งนี้ แต่ใช่ฉันต้องการแยกสาขา แต่บางทีคุณควรคิดเกี่ยวกับการควบรวมกิจการกลับ featuresets บางอย่างกลับไปต้นแบบก่อนที่พวกเขาเป็น 100% สำเร็จรูป (เพื่อให้การแสดงตัวอย่าง: P)
ZeissS

1
ดูเหมือนว่าพวกเขาต้องการกลยุทธ์ที่ดีกว่าสำหรับการรวม
b01

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

ฉันจะยืนยันว่าสาขาจะทำให้ง่ายขึ้น ... CI
tdammers

7
โปรดอย่าโพสต์คำต่อคำแบบเดียวกันข้ามไปยังไซต์ Stack Exchange หลายแห่ง
อดัมเลียร์

คำตอบ:


64

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

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

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

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

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

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


1
หากคุณย้อนกลับความมุ่งมั่นที่ไม่พึงประสงค์ในสาขาใหม่ของคุณนั่นจะไม่ย้อนกลับไปที่สาขาหลักเมื่อคุณรวมมันเข้าด้วยกัน? ฉันจะแยกสาขาจากจุดก่อนการเปลี่ยนแปลงที่ไม่พึงประสงค์และเชอร์รี่รับการเปลี่ยนแปลงที่ฉันขึ้นอยู่กับสาขาใหม่
แอนโธนี

@anthony ส่วนใหญ่คุณจะล้างประวัติของคุณ (ลบการแปลงกลับ) ก่อนที่จะรวม บางคนที่ต่อต้านการเขียนประวัติศาสตร์น่าจะดีกว่าทำตามวิธีการของคุณ
idbrii

หากคุณแยกสาขาและเขียนประวัติศาสตร์ทำไมต้องใช้ Git เลย?
Everton

80

คำถามคือเราควรใช้สาขาทุกวันนี้ไหม?

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

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

การอ้างอิง

  • http://msdn.microsoft.com/en-us/library/aa730834%28v=vs.80%29.aspx

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

  • http://www.cmcrossroads.com/bradapp/acme/branching/

    ... การบูรณาการที่เพิ่มขึ้นบ่อยครั้งเป็นหนึ่งในเสาหลักแห่งความสำเร็จและการขาดงานของมันมักจะเป็นลักษณะของความล้มเหลว วิธีการจัดการโครงการในปัจจุบันมีแนวโน้มที่จะหลีกเลี่ยงโมเดลน้ำตกที่เข้มงวดและยอมรับรูปแบบเกลียวเหมือนของการพัฒนาแบบวนซ้ำ / เพิ่มขึ้นและการส่งมอบวิวัฒนาการ กลยุทธ์การบูรณาการที่เพิ่มขึ้นเช่นการผสานก่อนและบ่อยครั้งและตัวแปรต่างๆเป็นรูปแบบของการจัดการความเสี่ยงที่พยายามขจัดความเสี่ยงก่อนหน้านี้ในวงจรชีวิตเมื่อมีเวลามากขึ้นในการตอบสนอง ความสม่ำเสมอของจังหวะระหว่างการผสานรวมถูกมองเห็นโดย [Booch], [McCarthy] และ [McConnell] ในฐานะตัวบ่งชี้ชั้นนำของโครงการสุขภาพ (เช่น "ชีพจร" หรือ "การเต้นของหัวใจ")  
     
    ไม่เพียง แต่การรวมเข้าด้วยกัน แต่เนิ่นๆและบ่อยครั้งที่มีความเสี่ยงเร็วและใน "ชิ้นเล็ก ๆ " แต่ยังสื่อสารการเปลี่ยนแปลงระหว่างเพื่อนร่วมทีม ...

  • http://www.codinghorror.com/blog/2007/10/software-branching-and-parallel-universes.html

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

  • http://www.lostechies.com/blogs/derickbailey/archive/2010/02/24/branching-strategies-when-to-branch-and-merge.aspx

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

  • http://www.snuffybear.com/ucm_branch.htm
    หมายเหตุจากการอ้างอิงอื่น ๆ ที่ระบุไว้ในที่นี้ผู้เขียนอ้างว่า"บทความนี้จะอธิบายรูปแบบการแยกสาขาที่สำคัญสามแบบที่ใช้ในโครงการวิศวกรรมซอฟต์แวร์"ดูไม่เป็นธรรม คำศัพท์ที่ใช้ดูไม่แพร่หลาย ( EFIX , Model-1,2,3ฯลฯ )

  • http://svn.haxx.se/users/archive-2007-10/att-0101/SCMBranchingModels-talkback.pdf
    เอกสารอ้างอิงนำเสนอตัวอย่างที่น่าสนใจของความยากลำบากในการสื่อสารกลยุทธ์การแยกสาขา

  • http://simpleprogrammer.com/2010/06/04/simple-branching-strategy-part-1-back-to-basics/
    ... ทำให้มันง่าย การทำงานโดยตรงจากลำตัวเป็นวิธีที่ดีที่สุดในความคิดของฉัน  
     
    ดูเหมือนว่าจะเป็นเรื่องนอกรีตเมื่อฉันพิมพ์ลงบนหน้าจอของฉัน แต่ถ้าคุณทนกับฉันซักครู่ฉันจะแสดงให้คุณดูว่าทำไมฉันถึงคิดว่านี่เป็นสิ่งจำเป็นสำหรับกระบวนการแบบ Agile แต่ฉันจะแสดงให้คุณเห็นว่า เพื่อให้มันใช้งานได้ ...  
     
    ... ถ้าฉันต้องให้เหตุผลบนพื้นฐานของการโต้แย้งที่มั่นคงมันจะเป็นคุณค่าของการบูรณาการอย่างต่อเนื่อง ฉันบล็อกเกี่ยวกับคุณค่าของ CIและแนวทางปฏิบัติที่ดีที่สุดในอดีต ฉันเป็นผู้สนับสนุนหลักของ CI ...  
     
    ... คุณต้องถามคำถามกับตัวเองที่นี่จริงๆ: "ค่าใช้จ่ายทั้งหมดที่คุณเกิดขึ้นจากการทำกลยุทธ์การรวมสาขาและการผสานที่ซับซ้อนส่งผลให้เกิดมูลค่าที่แท้จริงซึ่งไม่ได้มีอยู่ในกลยุทธ์ที่ง่ายกว่านี้" ...  
     
    .. . กลยุทธ์ที่ฉันใช้อย่างมีประสิทธิภาพในอดีตและมีการพัฒนาอยู่ตลอดเวลา ฉันจะสรุปได้ที่นี่

    • ทุกคนทำงานนอกลำตัว
    • สาขาเมื่อคุณปล่อยรหัส
    • ปิดการวางจำหน่ายเมื่อคุณต้องการสร้างการแก้ไขข้อบกพร่องสำหรับรหัสที่วางจำหน่ายแล้ว
    • สาขาสำหรับต้นแบบ
      ...
  • http://www.codelathe.com/blog/index.php/2009/07/02/a-svn-branching-strategy-that-works/
    ... สุดท้ายโปรดจำไว้ว่าไม่มีกลยุทธ์การรวมสาขาและการรวมที่เหมาะ มันค่อนข้างขึ้นอยู่กับสภาพแวดล้อมการพัฒนาที่ไม่เหมือนใครของคุณ ...

  • http://blog.perforce.com/blog/?cat=62
    ... สถานการณ์กรณีที่เลวร้ายที่สุดคือคุณแนะนำปัญหา "semantic merge" ซึ่งผลลัพธ์ของการผสานอัตโนมัติไม่ถูกต้อง แต่คอมไพล์ OK และย่องผ่านไป การทดสอบอาจมีชีวิตรอดนานพอที่จะเป็นข้อบกพร่องที่ลูกค้าเห็นได้ จี๊ด!  
     
    การเพิ่มการดูถูกการบาดเจ็บเนื่องจากพวกเขาสามารถหลบหนีการตรวจจับได้นานขึ้นปัญหาการรวมความหมายเป็นการยากที่จะแก้ไขในภายหลังเนื่องจากการเปลี่ยนแปลงนั้นไม่สดใหม่ในใจของนักพัฒนาที่เริ่มต้นการเปลี่ยนแปลง (โดยปกติแล้วจะเป็นการดีที่สุดที่จะรวมการเปลี่ยนแปลงในไม่ช้าหลังจากที่ทำไปแล้วโดยนักพัฒนาที่เริ่มต้นการเปลี่ยนแปลงหากเป็นประโยชน์)

  • https://stackoverflow.com/questions/34975/branching-strategies
    สมาชิกชุมชนแบ่งปันประสบการณ์ที่แตกต่างในโครงการต่าง ๆ โดยใช้กลยุทธ์การแยกสาขา ไม่มีฉันทามติที่ตกลงกันเกี่ยวกับ "ดีที่สุด" หรือ "แย่ที่สุด"

  • http://www.stickyminds.com/s.asp?F=S16454_COL_2
    สรุปสาระสำคัญโดยย่อของสิ่งต่าง ๆ ที่นำเสนอในhttp://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf

    • http://www.stickyminds.com/s.asp?F=S16511_COL_2
      ... มีวิธีการทั่วไปสามวิธีในการตัดสินใจว่าจะแยกสาขาเมื่อใดและอย่างไร:
      • สร้างสาขาที่วางจำหน่ายเมื่อคุณ "ฟีเจอร์เสร็จสมบูรณ์" และวางแผนที่จะแก้ไขปัญหาในนาทีสุดท้ายของบรรทัดโค้ดนี้ ในกรณีนี้สาขาที่วางจำหน่ายนั้นเป็น "รหัสการเตรียมการเผยแพร่" ตามที่อธิบายไว้ในรูปแบบการจัดการการกำหนดค่าซอฟต์แวร์เนื่องจากคุณคาดหวังว่ายังคงมีงานที่ต้องทำ
      • เปลี่ยนสไตล์การทำงานของคุณเพื่อหลีกเลี่ยงการรวมงานในขั้นสุดท้ายโดยไม่ต้องทำงานกับสายการพัฒนาที่ใช้งานอยู่
      • สาขาสำหรับงานใหม่โดยการสร้างสาขางานและการรวมที่ทำงานในสายการพัฒนาที่ใช้งานอยู่หลังจากการเปิดตัวเสร็จสมบูรณ์
        ... เหตุผลสำหรับการแตกแขนงคือการแยกรหัสในตอนท้ายของการปล่อยเพื่อให้มันมีเสถียรภาพ การแยกจากการแยกสาขามักจะปกปิดปัญหาด้านคุณภาพซึ่งจะปรากฏในราคาที่เพิ่มขึ้นในการบำรุงรักษาลำธารขนานก่อนที่จะวางจำหน่ายผลิตภัณฑ์ การแตกกิ่งเป็นเรื่องง่าย แต่มันคือการรวมเข้าด้วยกันและค่าใช้จ่ายทางปัญญาในการทำความเข้าใจว่าการเปลี่ยนแปลงระหว่างสาขานั้นยากอย่างไรจึงเป็นเรื่องสำคัญที่จะต้องเลือกกระบวนการที่ช่วยลดต้นทุนในการแยกและการรวม ...
  • http://nvie.com/posts/a-successful-git-branching-model/กลยุทธ์ Git-oriented
    ... เราถือว่าOrigin / Masterเป็นสาขาหลักที่ซอร์สโค้ดของ HEAD จะแสดงสถานะพร้อมการผลิตเสมอ  
     
    เราพิจารณาที่มา / พัฒนาเพื่อเป็นสาขาหลักที่ซอร์สโค้ดของ HEAD มักจะสะท้อนถึงสถานะที่มีการเปลี่ยนแปลงการพัฒนาที่ส่งมอบล่าสุดสำหรับรีลีสถัดไป บางคนเรียกสิ่งนี้ว่า "การรวมสาขา" นี่คือที่ใด ๆ สร้างตอนกลางคืนโดยอัตโนมัติถูกสร้างขึ้นจาก ....

  • http://svnbook.red-bean.com/en/1.5/svn.branchmerge.html
    ... นโยบายโครงการแตกต่างกันอย่างกว้างขวางเกี่ยวกับเมื่อมันเหมาะสมที่จะสร้างสาขาฟีเจอร์ บางโครงการไม่เคยใช้สาขาฟีเจอร์เลย: commits to / trunkเป็นฟรีสำหรับทุกคน ข้อดีของระบบนี้คือมันง่าย - ไม่มีใครจำเป็นต้องเรียนรู้เกี่ยวกับการแตกแขนงหรือรวมเข้าด้วยกัน ข้อเสียคือรหัสลำต้นมักไม่เสถียรหรือไม่สามารถใช้งานได้ โครงการอื่น ๆ ใช้กิ่งไม้สุดโต่ง: ไม่มีการเปลี่ยนแปลงที่เคยมุ่งมั่นที่จะลำต้นโดยตรง แม้แต่การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ส่วนใหญ่ก็เกิดขึ้นในสาขาอายุสั้นทบทวนอย่างรอบคอบและรวมเข้ากับลำตัว จากนั้นสาขาจะถูกลบ ระบบนี้รับประกันลำต้นที่เสถียรและใช้งานได้ตลอดเวลา แต่มีค่าใช้จ่ายมหาศาลกระบวนการค่าใช้จ่าย  
     
    โครงการส่วนใหญ่ใช้วิธีการกลางถนน พวกเขามักจะยืนยันว่า/ trunkรวบรวมและผ่านการทดสอบการถดถอยตลอดเวลา จำเป็นต้องมีสาขาคุณลักษณะเฉพาะเมื่อการเปลี่ยนแปลงจำเป็นต้องมีการทำลายล้างจำนวนมาก กฎง่ายๆคือการถามคำถามนี้: หากนักพัฒนาทำงานหลายวันและแยกการเปลี่ยนแปลงครั้งใหญ่ทั้งหมดในครั้งเดียว (เพื่อที่/ ลำต้นไม่มั่นคง) มันจะเป็นการเปลี่ยนแปลงที่ใหญ่เกินไปไหม? หากคำตอบสำหรับคำถามนั้นคือ "ใช่" การเปลี่ยนแปลงควรได้รับการพัฒนาบนสาขาคุณลักษณะ ในฐานะนักพัฒนาที่ยอมรับการเปลี่ยนแปลงที่เพิ่มขึ้นในสาขาพวกเขาสามารถตรวจสอบได้อย่างง่ายดายโดยเพื่อน  
     
    ในที่สุดก็มีปัญหาวิธีการเก็บสาขาคุณลักษณะใน "ซิงค์" ที่ดีที่สุดกับลำตัวเป็นงานที่ดำเนินการ ดังที่เราได้กล่าวไปแล้วก่อนหน้านี้มีความเสี่ยงสูงที่จะทำงานในสาขาเป็นเวลาหลายสัปดาห์หรือหลายเดือน การเปลี่ยนแปลงของลำตัวอาจดำเนินต่อไปเรื่อย ๆ จนถึงจุดที่ทั้งสองสายของการพัฒนาแตกต่างกันอย่างมากจนอาจกลายเป็นฝันร้ายที่พยายามจะรวมสาขากลับไปที่ลำต้น  
     
    สถานการณ์นี้ควรหลีกเลี่ยงโดยการรวมการเปลี่ยนแปลงลำตัวเข้ากับสาขาเป็นประจำ แต่งหน้านโยบาย: สัปดาห์ละครั้งรวมมูลค่าการเปลี่ยนเส้นทางของสัปดาห์ที่แล้วเข้ากับสาขา ...

  • http://thedesignspace.net/MT2archives/000680.html
    ... บทช่วยสอนส่วน Eclipse CVS นี้อ้างอิงจากบทความของ Paul Glezen ในเว็บไซต์ Eclipse: ทำการแยกด้วย Eclipse และ CVSและใช้โดยได้รับอนุญาตภายใต้เงื่อนไข ใบอนุญาต EPL การเปลี่ยนแปลงที่ฉันทำกับเวอร์ชันของเขาส่วนใหญ่จะขยายด้วยรูปภาพทีละขั้นตอนและคำอธิบายมากขึ้นและรวมเข้ากับบทเรียนเริ่มต้นของฉันเองในความพยายามที่จะทำให้ผู้เริ่มต้นและผู้ออกแบบสามารถเข้าถึงได้ง่ายขึ้น นักพัฒนาที่มีประสบการณ์อาจต้องการทำงานกับรุ่นของ Paul ...

  • http://learnsoftwareprocesses.com/2007/12/29/common-branching-strategies/
    ... นี่คือบางส่วนของรูปแบบการแตกแขนงทั่วไป:  

    1. รุ่นแยกตามสาขา: หนึ่งในกลยุทธ์การแยกสาขาที่พบมากที่สุดคือจัดแนวสาขากับการวางจำหน่ายผลิตภัณฑ์ สาขาถือครองสินทรัพย์พัฒนาซอฟต์แวร์ทั้งหมดสำหรับการเปิดตัวครั้งเดียว ในบางครั้งจำเป็นต้องรวมการอัปเดตจากรีลีสหนึ่งไปยังอีกรีลีส แต่โดยปกติจะไม่รวมเข้าด้วยกัน สาขาจะถูกยกเลิกเมื่อมีการยกเลิกการวางจำหน่าย  
    2. สาขาต่อโปรโมชั่น: วิธีการทั่วไปอีกวิธีหนึ่งคือการจัดแนวสาขากับระดับโปรโมชั่นสินทรัพย์ซอฟต์แวร์ เวอร์ชันการพัฒนาเฉพาะถูกแยกออกเป็นสาขาการทดสอบซึ่งจะทำการทดสอบการรวมและระบบทั้งหมด เมื่อคุณทำการทดสอบเสร็จสมบูรณ์สินทรัพย์การพัฒนาซอฟต์แวร์จะถูกแยกเป็นสาขาการผลิตและนำไปใช้งานในที่สุด  
    3. สาขาต่อภารกิจ: เพื่อหลีกเลี่ยงงานที่ทับซ้อนกัน (หรือกิจกรรม) และการสูญเสียผลผลิตคุณสามารถแยกงานเหล่านั้นออกเป็นสาขาอื่นได้ โปรดทราบว่าสาขาเหล่านี้เป็นสาขาระยะสั้นที่ควรรวมเข้าด้วยกันทันทีที่งานเสร็จสมบูรณ์มิฉะนั้นความพยายามในการรวมที่จำเป็นอาจเกินกว่าผลประโยชน์ด้านการผลิตในการสร้างพวกเขาตั้งแต่แรก  
    4. สาขาต่อส่วนประกอบ: คุณสามารถจัดตำแหน่งแต่ละสาขากับสถาปัตยกรรมระบบ ในกลยุทธ์นี้คุณแยกแต่ละองค์ประกอบ (หรือระบบย่อย) จากนั้นแต่ละทีมพัฒนาองค์ประกอบตัดสินใจเมื่อรวมรหัสกลับเข้าไปในสายการพัฒนาที่ทำหน้าที่เป็นสาขาการรวม กลยุทธ์นี้สามารถทำงานได้ดีหากสถาปัตยกรรมของระบบอยู่ในสถานที่และแต่ละองค์ประกอบมีอินเตอร์เฟซที่กำหนดไว้อย่างดี ความจริงที่ว่าคุณพัฒนาส่วนประกอบในสาขาช่วยให้สามารถควบคุมสินทรัพย์การพัฒนาซอฟต์แวร์ได้ละเอียดยิ่งขึ้น  
    5. สาขาต่อเทคโนโลยี: กลยุทธ์การแตกสาขาอื่นที่สอดคล้องกับสถาปัตยกรรมระบบ ในกรณีนี้สาขาจะสอดคล้องกับแพลตฟอร์มเทคโนโลยี รหัสทั่วไปมีการจัดการในสาขาที่แยกต่างหาก เนื่องจากลักษณะเฉพาะของสินทรัพย์การพัฒนาซอฟต์แวร์ที่มีการจัดการในสาขาพวกเขาอาจไม่เคยผสาน ...
  • http://msdn.microsoft.com/en-us/library/bb668955.aspx
    ... อ้างอิงแนวทางการแยกและการผสานใน"แนวทางการควบคุมแหล่งที่มา"ในคู่มือนี้สำหรับข้อมูลสรุปของแนวทางการแยกและการรวม ... เมื่อทำการแยกกิ่งลองพิจารณาสิ่งต่อไปนี้:

    • อย่าแยกสาขาเว้นแต่ทีมพัฒนาของคุณจะต้องทำงานกับไฟล์ชุดเดียวกันพร้อมกัน หากคุณไม่แน่ใจเกี่ยวกับสิ่งนี้คุณสามารถทำป้ายชื่อบิลด์และสร้างสาขาจากบิลด์นั้นในภายหลัง การรวมสาขาอาจต้องใช้เวลาและซับซ้อนโดยเฉพาะหากมีการเปลี่ยนแปลงที่สำคัญระหว่างสาขา
    • จัดโครงสร้างต้นไม้สาขาของคุณเพื่อให้คุณต้องรวมตามลำดับชั้น (ขึ้นและลงต้นไม้สาขา) แทนที่จะข้ามลำดับชั้น การแบรนช์ข้ามลำดับชั้นต้องการให้คุณใช้การผสานแบบไม่มีฐานซึ่งต้องการการแก้ไขข้อขัดแย้งด้วยตนเองเพิ่มเติม
    • ลำดับชั้นของสาขาขึ้นอยู่กับสาขาหลักและสาขาย่อยซึ่งอาจแตกต่างจากโครงสร้างทางกายภาพของซอร์สโค้ดบนดิสก์ เมื่อวางแผนการรวมของคุณโปรดจำไว้ว่าโครงสร้างสาขาแบบลอจิคัลแทนที่จะเป็นโครงสร้างแบบฟิสิคัลบนดิสก์
    • อย่าแตกกิ่งก้านสาขาลึกเกินไป เนื่องจากต้องใช้เวลาในการดำเนินการแต่ละผสานและแก้ไขข้อขัดแย้งโครงสร้างการแยกสาขาที่ลึกอาจหมายความว่าการเปลี่ยนแปลงในสาขาย่อยอาจใช้เวลานานมากในการเผยแพร่ไปยังสาขาหลัก สิ่งนี้อาจส่งผลเสียต่อกำหนดการของโครงการและเพิ่มเวลาในการแก้ไขข้อบกพร่อง
    • สาขาในระดับสูงและรวมถึงการกำหนดค่าและไฟล์ต้นฉบับ
    • วิวัฒนาการโครงสร้างการแตกแขนงของคุณเมื่อเวลาผ่านไป
    • การผสานต้องการนักพัฒนาตั้งแต่หนึ่งรายขึ้นไปเพื่อดำเนินการผสานและแก้ไขข้อขัดแย้ง แหล่งที่มาที่ผสานต้องได้รับการทดสอบอย่างถี่ถ้วนเนื่องจากไม่ใช่เรื่องผิดปกติที่จะทำการตัดสินใจที่ไม่ถูกต้องซึ่งจะทำให้การสร้างไม่เสถียร
    • การผสานข้ามลำดับชั้นสาขาเป็นเรื่องยากโดยเฉพาะอย่างยิ่งและคุณต้องจัดการด้วยตนเองด้วยความขัดแย้งหลายอย่างที่สามารถจัดการได้โดยอัตโนมัติ  
      การตัดสินใจว่าจะสร้างสาขาจะสามารถลดลงได้หรือไม่ว่าค่าใช้จ่ายในการรวมความขัดแย้งในแบบเรียลไทม์นั้นสูงกว่าต้นทุนค่าใช้จ่ายในการรวมความขัดแย้งระหว่างสาขา ...
  • http://kashfarooq.wordpress.com/2009/11/23/bazaar-branching-strategy-with-a-subversion-trunk/

    • http://kashfarooq.wordpress.com/2010/12/16/bazaar-branching-strategy-with-a-subversion-trunk-revised/
    • http://kashfarooq.wordpress.com/2009/11/02/using-bazaar-feature-branches-with-a-subversion-trunk/
    • http://kashfarooq.wordpress.com/2009/09/08/bazaar-or-git-moving-away-from-subversion/
      ... การร้องเรียนจากการโค่นล้มเหล่านี้ฟังดูคุ้น ๆ ไหม?
      • คุณได้รับคำแนะนำแบบสุ่มว่า "คุณต้องเรียกใช้การอัปเดต" จากนั้นคุณทำการอัปเดตซึ่งใช้เวลานานกว่าจะเสร็จสมบูรณ์ จากนั้นในที่สุดคุณจะเห็นว่าไม่มีการเปลี่ยนแปลงที่จำเป็นในการดาวน์โหลด
      • คุณได้รับคำแนะนำแบบสุ่มว่า "คุณต้องเรียกใช้การล้างข้อมูล"
      • คุณมีปัญหาการรวมขนาดใหญ่ ตัวอย่างเช่นคุณใช้ ReSharper เพื่อเปลี่ยนชื่อคลาสและบางคนได้อัปเดตคลาสนั้นในระหว่างนี้ จากนั้นคุณจะเห็นข้อผิดพลาดความขัดแย้งของต้นไม้ (ตัวสั่น) หรือแย่กว่านั้นคือคุณเปลี่ยนชื่อ namespace และโฟลเดอร์ทั้งหมด (ตัวสั่นคู่) ตอนนี้คุณอยู่ในโลกแห่งความเจ็บปวดอย่างแท้จริง
      • การรวมของคุณมีแนวโน้มที่จะเป็นคู่มือมากขึ้น คุณต้องใช้ WinMerge บ่อยครั้งเนื่องจากการโค่นล้มไม่มีเงื่อนงำ
      • คุณมักจะรอเต่าเพื่ออัปเดต / ตรวจสอบการแก้ไข / อะไร  
         
        ฉันมีที่เก็บข้อมูลการโค่นล้มบนไดรฟ์ปากกา USB ของฉัน ฉันได้รับความขัดแย้งของต้นไม้และรวมกับปัญหานั้นและฉันเป็นผู้ใช้คนเดียว!  
         
        ปัญหาหลักคือการรวม ...  
         
    • "การโค่นล้ม sucks" เสียงที่คุ้นเคย ถึงเวลาฟังJoelและLinus แล้วหรือยัง
  • http://social.msdn.microsoft.com/Forums/en/tfsversioncontrol/thread/f127676c-8f05-410c-9a30-0eb43a26a9fa
    การอภิปรายแนวทางปฏิบัติที่ดีที่สุดสำหรับกลยุทธ์การแยกสาขาในกรณีของระบบที่กำลังพัฒนา

  • http://branchingguidance.codeplex.com/
    "ไมโครซอฟท์เซิร์ฟเวอร์มูลฐานทีมกิ่งแนะแนว" - เอกสารขนาดใหญ่และมีรายละเอียดที่มีข้อแนะนำที่เหมาะกับโครงการที่แตกต่าง: HTML รุ่นที่นี่ พิสูจน์ว่า Microsoft ไม่เชื่อในกลยุทธ์ wrt branching แบบเดียวที่เหมาะกับทุกคน

  • https://stackoverflow.com/questions/597707/best-branching-strategy-when-doing-continuous-integration https://tackoverflowflow.com/questions/597707/
    กลยุทธ์การแยกสาขาที่ดีที่สุดคืออะไรเมื่อคุณต้องการรวมระบบอย่างต่อเนื่อง ... คำตอบขึ้นอยู่กับขนาดของทีมและคุณภาพของการควบคุมแหล่งที่มาของคุณและความสามารถในการรวมชุดการเปลี่ยนแปลงที่ซับซ้อนอย่างถูกต้อง ...

  • http://codicesoftware.blogspot.com/2010/03/branching-strategies.html
    ... CVS และ SVN ไม่สนับสนุนกลยุทธ์การรวมสาขา / การรวมทั้งหมดเนื่องจากพวกเขาไม่สามารถทำได้ ... ... กฎง่ายๆ: สร้างสาขางานสำหรับทุกคุณสมบัติใหม่หรือแก้ไขข้อผิดพลาดที่คุณนำไปใช้ ... มันฟังดูเหมือน overkill สำหรับผู้ใช้ SVN / CVS แต่คุณรู้ว่า SCM ที่ทันสมัยใด ๆ จะช่วยให้คุณสามารถสร้างสาขาได้ในไม่กี่วินาที  
     
    หมายเหตุสำคัญ: หากคุณมองอย่างระมัดระวังคุณจะเห็นว่าฉันกำลังพูดถึงการใช้สาขางานเป็นนักเปลี่ยนแปลงคนรวย ...

  • http://publib.boulder.ibm.com/infocenter/cchelp/v7r0m1/index.jsp?topic=/com.ibm.rational.clearcase.cc_proj.doc/c_bntr_plnbrstrat.htm
    ... การกำหนดนโยบายได้รับอิทธิพลจากการพัฒนา วัตถุประสงค์ของโครงการและให้กลไกในการควบคุมการวิวัฒนาการของรหัสฐาน มีนโยบายการแบรนช์แตกต่างกันมากพอ ๆ กับองค์กรที่ใช้การควบคุมเวอร์ชัน Rational ClearCase แต่ก็มีความคล้ายคลึงกันที่สะท้อนการยึดมั่นร่วมกันกับแนวทางปฏิบัติที่ดีที่สุด ...

  • http://blogs.open.collab.net/svn/2007/11/branching-strat.html
    ... รูปแบบการโค่นล้ม (หรือโมเดลโอเพ่นซอร์สทั่วไปอย่างแม่นยำมากขึ้น) คือสิ่งที่แสดงในโมเดลลำตัวที่ไม่เสถียร .. .

  • http://en.wikipedia.org/wiki/Trunk_%28software%29
    ในด้านการพัฒนาซอฟแวร์, ลำต้นหมายถึงชื่อสาขา (รุ่น) ของต้นไม้ไฟล์ที่อยู่ภายใต้การควบคุมการแก้ไข ลำต้นมักจะหมายถึงเป็นฐานของโครงการที่การพัฒนาดำเนินไป หากนักพัฒนาทำงานบนลำตัวโดยเฉพาะมันก็จะมีเวอร์ชั่นที่ล้ำสมัยที่สุดของโครงการ แต่ก็อาจจะเป็นเวอร์ชั่นที่ไม่เสถียรที่สุด อีกวิธีหนึ่งคือการแยกสาขาออกจากลำต้นใช้การเปลี่ยนแปลงในสาขานั้นและรวมการเปลี่ยนแปลงกลับเข้าไปในลำต้นเมื่อสาขาได้รับการพิสูจน์แล้วว่ามีความเสถียรและทำงานได้ ขึ้นอยู่กับโหมดการพัฒนาและการคอมมิทนโยบาย trunk อาจมีรุ่นที่เสถียรที่สุดหรือมีความเสถียรน้อยที่สุดหรือมีบางอย่างที่อยู่ระหว่าง  
     
    บ่อยครั้งที่งานหลักของนักพัฒนาเกิดขึ้นในลำต้นและเวอร์ชันที่เสถียรจะถูกแยกและการแก้ไขข้อผิดพลาดเป็นครั้งคราวจะถูกผสานจากกิ่งก้านกับลำต้น เมื่อการพัฒนาเวอร์ชันในอนาคตเสร็จสิ้นในสาขาที่ไม่ใช่ของลำต้นมันมักจะทำสำหรับโครงการที่ไม่เปลี่ยนแปลงบ่อยครั้งหรือที่การเปลี่ยนแปลงที่คาดว่าจะใช้เวลานานในการพัฒนาจนกว่ามันจะพร้อมสำหรับการรวมในลำต้น .. .

  • http://www.mcqueeney.com/roller/page/tom/20060919
    ... ข้อความเหล่านี้มาจากการสัมมนาทางเว็บเรื่องแนวปฏิบัติที่ดีที่สุดในการโค่นล้มซึ่งดำเนินการ 30 สิงหาคม 2549 โดย CollabNet ... กลยุทธ์ขององค์กรที่สอง: trunk ที่ไม่เสถียรเทียบกับ trunk ที่เสถียร ... ... กำหนดค่า trunk ที่ไม่เสถียรเมื่อเป็นไปได้ ...

  • https://stackoverflow.com/questions/153812/subversion-is-trunk-really-the-best-place-for-the-main-development
    ใน SVN, trunk เป็นสถานที่แนะนำสำหรับการพัฒนาหลักและฉันใช้การประชุมนี้ สำหรับโครงการทั้งหมดของฉัน อย่างไรก็ตามนี่หมายความว่าลำตัวบางครั้งไม่เสถียรหรือแตกหัก ... ... จะดีกว่าหรือไม่ที่จะทำ "การพัฒนาป่า" ในบางสาขาเช่น / branch / dev และรวมเข้ากับลำต้นเท่านั้นเมื่อการสร้างมีเหตุผล ของแข็ง?

    • ... ลำต้นเป็นสิ่งที่การพัฒนาอย่างต่อเนื่องจะเกิดขึ้น คุณไม่ควรมีปัญหากับรหัส "เสีย" หากทุกคนทดสอบการเปลี่ยนแปลงก่อนที่จะส่งมอบ กฎง่ายๆคือทำการอัปเดต (รับรหัสล่าสุดทั้งหมดจาก repos) หลังจากที่คุณเขียนรหัสการเปลี่ยนแปลงของคุณ จากนั้นสร้างและทำการทดสอบหน่วย หากทุกอย่างสร้างและทำงานคุณควรตรวจสอบสิ่งต่อไปนี้ใน ...
    • ... Nope trunk ไม่ใช่ที่ที่ดีที่สุด ที่องค์กรของเราเราทำตามวิธีนี้เสมอ: Trunk มีรหัสการเปิดใช้ดังนั้นจึงรวบรวมอยู่เสมอ ด้วยการเปิดตัวแต่ละครั้ง / เหตุการณ์สำคัญเราเปิดสาขาใหม่ เมื่อใดก็ตามที่นักพัฒนาซอฟต์แวร์เป็นเจ้าของรายการเขา / เธอจะสร้างสาขาใหม่ให้กับสาขาที่วางจำหน่ายนี้และผสานเข้ากับสาขาที่วางจำหน่ายหลังจากการทดสอบ สาขาที่วางจำหน่ายถูกรวมเข้ากับลำตัวหลังจากการทดสอบระบบ ...
  • http://blog.yclian.com/2009/03/working-on-branches-and-stable-trunk.html
    ... ฉันเคยทำงานในช่วงท้ายเพราะสำหรับโครงการทั้งหมดที่ฉันทำงานอยู่ ผู้พัฒนาหรือทีมเดียวทำให้มั่นใจได้ว่าการเช็คอินรหัสทุกคนได้ผ่านการทดสอบในท้องถิ่นแล้ว มิฉะนั้นเราสร้างขึ้น (เรายังคง) สาขาการแก้ไขข้อบกพร่องรหัสขนาดใหญ่สำหรับคุณสมบัติใหม่ ฯลฯ  
     
    ประมาณ 2 เดือนที่ผ่านมาผมมีเซสชั่นคอมไพล์สั้น ๆ กับมาลและเขาร่วมกับฉันความคิดของเรื่อง / สาขา และในขณะที่ทีมของฉันเริ่มที่จะเติบโตขึ้นพร้อมกับนักพัฒนามากขึ้นฉันรู้สึกว่าจำเป็นที่จะต้องส่งเสริมให้มีการแตกแขนงมากขึ้นและตอนนี้มันกลายเป็นกฎ สำหรับโครงการที่มีการทดสอบอัตโนมัติที่กำหนดโดยการตั้งค่า CI รับประกันความเสถียรของลำต้นและการฝึกฝนนี้สามารถเข้ากันได้ดี  
     
    เราไม่ได้ใช้คอมไพล์ แต่เป็นการโค่นล้มเพราะนั่นคือวิธีที่เราเริ่มต้นและเรายังคงรู้สึกสบายใจในตอนนี้ (เกือบตลอดเวลา) ...

  • http://www.ericsink.com/scm/scm_branches.html
    นี่เป็นส่วนหนึ่งของหนังสือออนไลน์ที่ชื่อว่าHOWTOซึ่งเป็นแนวทางปฏิบัติที่ดีที่สุดในการควบคุมแหล่งที่มาการควบคุมเวอร์ชันและการจัดการการกำหนดค่า ...  
     
    ... Eric's Preferred Branching ฝึกฝน ... เก็บลำต้น "ไม่เสถียร" โดยทั่วไป ทำการพัฒนาที่แอคทีฟของคุณในลำตัวความเสถียรของมันเพิ่มขึ้นเมื่อคุณเข้าใกล้รีลีส หลังจากที่คุณจัดส่งสร้างสาขาการบำรุงรักษาและทำให้มันมีเสถียรภาพมากเสมอ ...  
     
    ... ในบทถัดไปฉันจะเจาะลึกหัวข้อการรวมสาขา ...

  • http://marc.info/?l=forrest-dev&m=112504297928196&w=2
    เริ่มจดหมายของกระทู้ที่พูดคุยถึงกลยุทธ์การแยกสาขาสำหรับโครงการApache Forrest

    • โปรดทราบว่าในปัจจุบันโครงการดูเหมือนจะใช้โมเดลลำตัวที่ไม่เสถียรพร้อมกิ่งไม้ที่วางจำหน่าย:
    • "งานพัฒนาบนลำต้นของ SVN ... มี" รีลีสสาขา "ของ SVN เช่น forrest_07_branch" ( แนวทางโครงการ )
    • "การสร้างแพ็คเกจผู้สมัครรับการปล่อยตัว ... 17. สร้างสาขาการบำรุงรักษาใน SVN ... " ( วิธีการเปิดตัว )
  • เอกสารการแยกย่อยของ O'Reilly CVS:
    http://commons.oreilly.com/wiki/index.php/Essential_CVS/Using_CVS/Tagging_and_Branching#Basically_stable

    • ... ปรัชญาการแยกสาขาที่มีเสถียรภาพโดยทั่วไประบุว่าลำต้นควรมีข้อมูลโครงการที่ใกล้จะพร้อมสำหรับการเปิดตัวเสมอ ... ... การเปลี่ยนแปลงที่หลากหลายของปรัชญานี้ช่วยให้ทุกสิ่งที่ผ่านการทดสอบหน่วยนักพัฒนาจะถูกรวมเข้ากับ กระโปรงหลังรถ. วิธีการที่ผ่อนคลายเช่นนี้จำเป็นต้องมีผู้สมัครที่จะได้รับการแยกออกและผ่านการวิเคราะห์ QA แบบเต็มก่อนที่จะตีพิมพ์ ...
    • ... ปรัชญาที่ไม่แน่นอนระบุว่า trunk ควรมีรหัสล่าสุดโดยไม่คำนึงถึงความเสถียรของมันและผู้สมัครควรจะถูกแยกออกสำหรับ QA
       
       
      ... รูปแบบที่ผ่อนปรนมากขึ้นยังอนุญาตให้มีการแยกย่อยสำหรับโค้ดทดลองการเปลี่ยนโครงสร้างและรหัสกรณีพิเศษอื่น ๆ การรวมสาขากลับเข้าไปในลำต้นจะดำเนินการโดยผู้จัดการสาขา ...
      • หมายเหตุทรัพยากรด้านบนไม่ปรากฏในการค้นหาใด ๆ ที่ฉันทำ (แนวทางที่เกี่ยวข้องกับ CVS ไม่เป็นที่นิยมอีกต่อไป?)
  • แนวทางปฏิบัติที่ดีที่สุดใน SCM (บทความบังคับ)ที่
    http://www.perforce.com/perforce/papers/bestpractices.html
    ... พื้นที่ทั่วไปหกประการของการปรับใช้ SCM และแนวปฏิบัติที่ดีที่สุดบางประการในแต่ละพื้นที่เหล่านั้น บทต่อไปนี้อธิบายแต่ละรายการ ...
    พื้นที่ทำงาน Codelines, กิ่ง, เปลี่ยนการขยายพันธุ์, Builds, กระบวนการ ...


37
ฉันเชื่อว่านั่นเป็นคำตอบที่ยาวที่สุดที่ฉันเคยเห็นในคำถามสแต็คการแลกเปลี่ยนใด ๆ !
John Fisher

2
@ JohnFisher ตามJIRA ได้ดีแล้วฉันใช้เวลารวบรวมและสรุปข้อมูลอ้างอิงเหล่านี้เป็นเวลา 6 ชั่วโมง :)
gnat

2
คุณขาดข้อมูลสรุปบางประการซึ่งควรบอกว่าจะใช้หรือไม่ใช้สาขาใหม่สำหรับคุณลักษณะใหม่ คำตอบของคุณเป็นเพียงผลรวมของลิงก์ไปยังบทความต่าง ๆ - บางคนบอกสิ่งหนึ่งในขณะที่คนอื่น ๆ กำลังบอกตรงกันข้าม คำตอบของคุณค่อนข้างยาวดังนั้นฉันอาจหลงทาง
BЈовић

3
@ สรุป BЈовић ให้ไว้ในตอนต้นของคำตอบ: 'ไม่มีกลยุทธ์การแยกย่อย "ดีที่สุด" ที่ใช้กันทั่วไปในโครงการใด ๆ * ทรัพยากรส่วนใหญ่ดูเหมือนจะยอมรับว่าการเลือกกลยุทธ์การผลิตขึ้นอยู่กับข้อมูลเฉพาะของโครงการ '
gnat

2
การอ่านเพิ่มเติม: การพัฒนา Trunk Based ของ Google กับ Facebook "พวกเขา[Google และ Facebook]ไม่ได้รวมความเจ็บปวดเพราะผู้พัฒนากฎไม่ได้รวมเข้ากับ / จากสาขาอย่างน้อยที่สุดก็ถึงเซิร์ฟเวอร์ repo ส่วนกลางที่พวกเขาไม่ได้อยู่บนเวิร์กสเตชัน นักพัฒนาอาจจะรวมไปถึง / จากสาขาในพื้นที่และการรีบูตเมื่อสิ่งที่ "ทำ" กลับไปที่ repo ส่วนกลาง ... "
gnat

7

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

สาขาเป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนั้น

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


5

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

มันยากกว่าไหมที่จะฝึกการผสมผสานอย่างต่อเนื่องการส่งต่อเนื่องและอื่น ๆให้คุณเป็นรูปธรรม?

ถ้าไม่ฉันไม่เห็นเหตุผลที่จะเปลี่ยนวิธีการทำงานของคุณ

แน่นอนว่าเป็นแนวปฏิบัติที่ดีในการติดตามสิ่งที่เกิดขึ้นและวิธีปฏิบัติที่ดีที่สุดในปัจจุบันมีวิวัฒนาการ แต่ฉันไม่คิดว่าเราต้องละทิ้งกระบวนการ / เครื่องมือ / อะไรก็ตามของเราเพียงเพราะ X (และ / หรือ Y และ / หรือ Z) กล่าวว่าพวกเขาไม่ได้กลัวอีกต่อไป :-)


แน่นอนมัน! มันเป็นคำถามของการจัดลำดับความสำคัญ: การแยกสาขา (การแยกคุณสมบัติ) กับการรวมง่ายการส่งมอบและอื่น ๆ
SiberianGuy

1
มันเป็นเพียงเรื่องของเครื่องมือ CI ที่คุณใช้ อะไรทำให้คุณไม่สร้างงานและ "ส่งมอบอย่างต่อเนื่อง" จากสาขา
Shaddix

@Shaddix มักจะส่งจากสาขายาก ตัวอย่างเช่นคุณจะส่งมอบจากสาขาคุณลักษณะอย่างไร
SiberianGuy

1
ปัญหาคืออะไรหากคุณมีรหัสแหล่งที่มาเป็นสาขาทั้งหมด (เช่นใน DVCS)
Shaddix

1
@Shaddix ยิ่งคุณใส่รหัสมากเท่าไรคุณก็ยิ่งได้รับความขัดแย้งมากขึ้นระหว่างการรวมเข้าด้วยกัน
SiberianGuy

4

เป็นคำตอบที่น่าสนใจ ในระยะเวลา 20 ปีที่ผ่านมาฉันไม่เคยทำงานกับ บริษัท ที่ใช้ประโยชน์จากการแยกสาขาออกไปเล็กน้อย

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

ในทางกลับกันฉันไม่ได้ใช้คอมไพล์มากนักและบางทีมันก็เป็นการรวมแท็ก git ที่มีอิทธิพลต่อคำตอบเหล่านี้ - ฉันเข้าใจว่าสาขา / การผสานนั้นมอบให้กับคอมไพล์เพราะมันง่ายมาก


2
+1, dunns git'er เหล่านี้กำลังคลั่งไคล้มากขึ้นเกี่ยวกับความเหนือกว่าที่เป็นที่ถกเถียงของ git ผ่านการควบคุมเวอร์ชัน / CI setup อื่น ๆ
maple_shaft

3

ใช่คุณควรใช้กิ่งไม้เพื่อแยกความพยายามในการพัฒนา (อย่างน้อยขนาดกลาง) โปรดดู " คุณควรจะสาขาเมื่อไหร่ "

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


2

คุณควรใช้กิ่งอย่างแน่นอน มีจุดแข็งหลายประการ

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

ยากเกินไปไม่เคยเป็นข้อแก้ตัว มันใช้ความพยายามมากขึ้นในการทำสิ่งที่ถูกต้องเสมอ


2
ฉันต้องการดาวน์นี่ไม่ใช่เพราะฉันต่อต้านการแตกแขนง แต่เนื่องจากคุณแนะนำว่าควรใช้ตลอดเวลา
maple_shaft

เขาพูดว่าที่ไหนเขาแก้ไขมันหรือเปล่า?
b01

ตั้งค่า CI ในพื้นที่ของคุณเองเพื่อดูสาขาของคุณสำหรับสาขาที่มีอายุสั้น (2-5 วัน) ที่อาจเป็นค่าใช้จ่าย เคยไปที่นั่นแล้ว
ริ้น

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

นั่นไม่ได้ทำ CI ฉันใน CI หมายถึงการบูรณาการ - รวมการทำงานของนักพัฒนาทั้งหมดเช่นการรวม ไม่มีอะไรผิดปกติกับการเรียกใช้การทดสอบในพื้นที่สำหรับทุกกระทำ แต่สิ่งเดียวกัน
bdsl

2

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

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

  • backport refactorings

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

  • ใช้สวิตช์คุณสมบัติ

2

เราเพิ่งผ่านขั้นตอนนี้ (อีกครั้ง) .. ก่อนอื่นเรามีการอภิปราย GIT / SVN ทั้งหมดซึ่งนำเราไปสู่กลยุทธ์การแยกสาขาโดยทั่วไป

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

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

ประโยคนี้อาจช่วยชีวิตคุณได้: สิ่งที่อยู่ใน SCM ไม่เหมือนกับสิ่งที่อยู่ในสิ่งประดิษฐ์ของคุณ!

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

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

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

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

แต่มีคำตอบของคุณ


1

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

ข้อยกเว้นที่น่าสังเกตบางอย่างที่ฉันชอบคือการแยกขนาดใหญ่สำหรับการซ่อมแซมขนาดใหญ่คุณสมบัติขนาดยักษ์ที่ใช้เวลานานกว่าการวิ่งเพื่อพัฒนา


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

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

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

@ พอลเชื่อฉันที่ไม่ได้ทำงานในทุกโครงการหรือเทคโนโลยี คิดว่าไฟล์การกำหนดค่า XML ทั่วไปเหมือนใน Struts ที่ทุกคนจุ่มมือลงในมันทุกวัน แต่ไม่วิธีการทำงานของคุณตลอดเวลาและฉันสมควรได้รับ downvote ทั้งหมด ขอบคุณ
maple_shaft

1
@maple_shaft meta-hint หากคุณพิจารณาแท็ก (git) และโพสต์สิ่งที่ผู้ใช้ทั่วไปของแท็กเหล่านั้นจะพิจารณาเป็นค่าลบคาดว่า flyby downvotes Flybys เป็นปฏิกิริยาที่ไม่ยุติธรรมต่อการถูกทำร้ายโดยความคิดเห็นบางส่วนที่คุณรับเป็นการส่วนตัว พิจารณามันดีเพราะมันช่วยเพิ่มตัวแทนของคุณผ่านหลังคาของเขา
Bill K

1

ฉันแนะนำรูปแบบสาขาประเภทนี้:

ปล่อย - ทดสอบ - พัฒนา

จากการพัฒนา, สาขาโดยนักพัฒนาและ / หรือโดยคุณสมบัติ

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

โครงการประเภทนี้ใช้ได้ดีกับนักพัฒนาจำนวนมากและหลายโครงการในรหัสฐานเดียวกัน


0

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

IMHO แล้วคำตอบคือใช่ เรายังควรใช้การแยกทาง


0

กระบวนการในองค์กรของฉันใช้สาขาอย่างกว้างขวางและ (กระบวนการที่ดูเหมือนเล็กน้อย) การรวมกลุ่มอย่างต่อเนื่อง

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


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

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

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

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