เป็นการดีกว่าที่จะรวม“ บ่อยครั้ง” หรือหลังจากรวมฟีเจอร์สาขาใหญ่แล้วเสร็จ?


40

พูดได้หลายสาขาจะได้รับการพัฒนาAและBเช่นเดียวกับที่เพิ่มขึ้น "แก้ไขข้อผิดพลาด" Cสาขา

ตอนนี้C"เสร็จสิ้น" และถูกรวมเข้ากับต้นแบบแล้ว AและBยังอยู่ในระหว่างการพัฒนาและจะไม่ได้รับการแก้ไขก่อน (อาจ) สาขาการแก้ไขข้อบกพร่องอื่นถูกรวมเข้ากับข้อมูลหลัก

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

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


2
การทำซ้ำที่เป็น
ริ้น

5
@gnat ที่เกี่ยวกับการรวมสาขาต่าง ๆ ไว้ในสายหลักฉันสงสัยว่าการผสานหลักกลับเข้ากับคุณลักษณะในขณะที่คุณลักษณะกำลังได้รับการพัฒนาก็ดีเพื่อ "แก้ไขข้อขัดแย้งก่อน"
paul23

1
@ paul23 ฉันจะบอกว่าเป็นสิ่งจำเป็นในทางปฏิบัติ
Berin Loritsch

3
จริงๆแล้วปัญหาเรื่องการกำหนดเวอร์ชันของฉันก็หายไปเมื่อฉันเริ่มใช้การออกแบบที่เหมาะสมกับโค้ดของฉันเช่นการแยกโมดูลและการสร้างรูปแบบการทำงานที่ชัดเจน หากคุณสะดุดปัญหามากเกินไปในระหว่างการรวมคุณอาจมีปัญหาอื่นที่ร้ายแรงกว่าที่แฝงตัวอยู่ การออกแบบที่ดีนั้นมีประโยชน์อย่างมากในการหลีกเลี่ยงความขัดแย้งที่ไม่จำเป็น
T. Sar - Reinstate Monica

2
คุณอาจต้องการผสานจากอาจารย์เป็นประจำเพื่อปิด "ไม่พอ" เพื่อไม่ให้รวมกันในภายหลังเจ็บปวดเกินไป
Thorbjørn Ravn Andersen

คำตอบ:


71

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

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

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

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


33
ผสานหรือลบล้างเนื่องจากการรีบูตมักสร้างประวัติการกระทำที่สะอาดกว่า
chrylis -on strike-

11
@ chrylis: การรีสตาร์ตอาจเป็นอันตรายหาก "มีสาขาครอบคลุมเรื่องราว mutliple" หมายความว่านักพัฒนาสองคนทำงานในสาขาเดียวกัน
meriton - เมื่อโจมตี

9
@meriton จากเอกสารอย่างเป็นทางการ: อย่าปฏิเสธการยอมรับว่ามีอยู่นอกพื้นที่เก็บข้อมูลของคุณและผู้คนอาจทำงานตามพวกเขา ถ้าคุณทำตามแนวทางนั้นคุณก็จะสบายดี หากคุณไม่ทำคนจะเกลียดคุณและคุณจะถูกเพื่อนและครอบครัวดูถูกเหยียดหยาม LOL
สุดยอดนักขี่จักรยาน

6
@XtremeBiker: rebase ใน Git เปลี่ยนประวัติศาสตร์ Git ทำงานเหมือนชีวิตจริงในเรื่องนี้: เพื่อเปลี่ยนประวัติศาสตร์คุณต้องมีการสมรู้ร่วมคิด มีสาขาในพื้นที่เก็บข้อมูลสำหรับ Git เองซึ่งถูกรีบูทเป็นประจำและเป็นสาขาที่มีการเปิดเผยต่อสาธารณะ เหตุผลที่ทำให้งานนี้เกิดขึ้นเพราะมีการสมรู้ร่วมคิด: ทุกคนที่ใช้สาขานี้ตกลงที่จะเขียนประวัติศาสตร์ในบางช่วงเวลาดังนั้นพวกเขาจะต้องแน่ใจว่าพวกเขาอยู่ในตำแหน่งที่จะรวมทุกอย่างไว้ด้วยกันในเวลานั้น
Jörg W Mittag

1
@ paul23 พิจารณาส่ง A และ B ไปยังสาขาที่แบ่งปันใหม่อย่างจริงจังก่อนส่งให้อาจารย์ หากทั้งคู่ต่างยกเครื่องหัวรุนแรงอย่างรุนแรงคุณต้องการให้พวกเขาทดสอบร่วมกันก่อนที่จะก่อให้เกิดการรวมกลุ่มกับนาย หากคุณมั่นใจว่าคุณสามารถส่งตรงถึงมือคุณแล้วส่งไปที่สาขาที่อัปเดตใหม่ คุณอาจต้องการดูรหัสต้นฉบับจากคุณลักษณะที่สองในกรณีที่การผสานไม่ดีหรือคุณต้องการออกแบบใหม่
Sinc

11

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

ฉันจะพิจารณากลยุทธ์ที่คล้ายกันดังต่อไปนี้

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

5

โดยปกติมักจะดีกว่าขนาดใหญ่

คำขอดึงที่เล็กกว่าและบ่อยกว่านั้นจะดีขึ้นเกือบทุกครั้ง

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

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

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

เพื่อนร่วมงานของฉันส่วนใหญ่คร่ำครวญเมื่อมีคนสร้างคำขอให้ดึงจำนวนมากและส่วนใหญ่ก็เป็นเช่นนั้น

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


1
การตั้งค่าสถานะฟีเจอร์สามารถมีค่าใช้จ่ายสูง (450 ล้านเหรียญสหรัฐใน 45 นาที) ตัวอย่างนี้ยังกล่าวถึงโดยลุง Bob (แต่ไม่มีเทคนิคใด ๆ (ตามที่คาดหวัง))
Peter Mortensen

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

3

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


2
ดีAและBยกเครื่องใหม่หัวรุนแรงที่สำคัญในการทำงานของโปรแกรมพวกเขาจะไม่ "ทำ" ภายในหนึ่งเดือน อย่างไรก็ตามพวกเขาก็ไร้ประโยชน์ก่อนที่พวกเขาจะทำ ...
paul23

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

1
นั่นเป็นเหตุผลที่ทำให้การรีบูตเครื่องในประเทศของคุณอยู่เหนือการเปลี่ยนแปลงใด ๆ ในสาขาหลักนั้นมีประโยชน์สำหรับการพัฒนาในระยะยาว ช่วยให้งานของคุณราวกับว่ามันเพิ่งแตกสาขาล่าสุด
NKCampbell

2

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


1
คุณสมบัติธง= รหัสผีดิบ (จนกว่าจะฟื้นคืนชีพ)?
Peter Mortensen

@PeterMortensen คุณต้องตั้งเป้าหมายที่จะลบธงโดยเร็วที่สุดเท่าที่จะเป็นไปได้ แต่มันสามารถใช้งานได้ในบางสถานการณ์
Qwertie

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