วิธีกำจัดการพัฒนาสาขาเพื่อให้การไหลของ Git ง่ายขึ้น


20

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

  • พัฒนาสาขา: รุ่นที่ใช้งานล่าสุด
  • สาขาหลัก: รุ่นที่จะวางจำหน่าย / รุ่นที่วางจำหน่าย
  • ฟีเจอร์ต่าง ๆ : ฟีเจอร์ในการพัฒนา
  • กิ่งก้านของโปรแกรมแก้ไขด่วน: การแก้ไขข้อบกพร่องเร่งด่วนในรุ่นที่วางจำหน่าย

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

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

เป้าหมายของฉัน

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

ฉันมีข้อ จำกัด ดังต่อไปนี้:

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

ที่ฉันไม่แน่ใจเกี่ยวกับการเปลี่ยนแปลง:

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

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

@DaveSwersky เป็นคำถามที่ดี! ฉันไม่แน่ใจนั่นคือเหตุผลที่ฉันถามที่นี่ :) เกี่ยวกับสาขาฟีเจอร์ที่ยาวนาน: ความยากลำบากในการผสานเป็นปัญหาที่มีอยู่แล้วและจะถูกย้ายไปที่อื่น และเมื่อรวมกันกลับจากสาขาหลักก็สามารถทำได้ มันจะยากกว่านี้ไหมถ้าสาขาหลักเป็นปรมาจารย์
Fabian Schmengler

สาขายาวอาศัยอยู่มักจะเป็นสิ่งที่ท้าทายแม้ว่าอาจจะมากขึ้นของความท้าทายที่จะโทควบรวมกว่าสาขา DEV การแก้ไขปัญหานั้นอาจเป็นการแยกงานออกจากกันดีกว่าเพื่อให้สาขาเหล่านั้นมีอายุสั้น หากคุณสามารถป้องกันหัวข้อ / ฟีเจอร์กิ่งไม้ไม่ให้อยู่เกินกว่า 24-48 ชั่วโมงคุณอาจโชคดีกว่าที่จะกำจัด DEV
Dave Swersky

1
@FabianSchmengler อะไรคือเหตุผลที่แท้จริงที่คุณต้องการลบสาขา dev? ดูเหมือนว่าคุณจะต้องการมันสำหรับกรณีที่สิ่งต่าง ๆ ไม่เป็นไปตามแผนที่วางไว้
avi

เรียกมันว่ามาสเตอร์หรือพัฒนาหรืออะไรก็ตามที่คุณต้องการคุณจะต้องมีสาขาการรวมหากคุณต้องการมี CI จริงหรือถ้าคุณมอบหมายให้สาขาฟีเจอร์มันจะเป็นการรวมภายนอกของพวกเขากับการเปิดตัวในปัจจุบันแยก
ᴳᵁᴵᴰᴼ

คำตอบ:


6

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

  • การพัฒนาใหม่ทำให้การผลิตหยุดชะงัก - การถดถอยที่เห็นหลังจากรวมdevelopเข้าด้วยกันmaster
  • การทำให้การผลิตมีความเสถียรทำให้การพัฒนาในอนาคตช้าลง - คุณต้องสร้างเสถียรภาพdevelopให้ดีพอสำหรับการรวมเข้าด้วยกันmaster

หยดdevelopจะไม่ช่วยเหลือ (มาก) - คุณไม่ได้ขจัดปัญหาคุณเพียงแค่การถ่ายโอนdevelopส่วน -specific masterของปัญหาลง

วิธีที่ดีกว่าคือการย้ายการผลิตที่อยู่เบื้องหลังการพัฒนาในปัจจุบัน / อนาคตเพื่อป้องกันการรบกวนกับการพัฒนาสำหรับการเผยแพร่ในอนาคตดังที่แสดงในภาพนี้จากรูปแบบการแบ่งสาขาของคุณคืออะไร? :

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

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

วิธีนี้ใช้ได้ผลกับคุณ:

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

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

ตอนนี้ดูสิ่งที่จะเข้าสู่master(ซึ่งผ่านจุดที่releaseสาขาปัจจุบันถูกดึงออก) คุณมี 2 ตัวเลือก:

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

หากคุณชอบวิธีนี้นี่เป็นวิธีที่คุณเดินทางมาจากที่ที่คุณอยู่ในวันนี้:

  • สร้างกลยุทธ์การตั้งชื่อรุ่น:
    • คุณไม่สามารถมีสาขาย่อยต่อเนื่องที่มีชื่อเดียวกันได้
    • คุณไม่สามารถ (ไม่ควรจริง ๆ ) รีบูทหรือซิงค์สาขารีลีสการผลิต
  • ดึงreleaseXสาขาจากmasterทันทีตามกลยุทธ์การตั้งชื่อนั้น
  • หยุดการกระทำจากไปในdevelopที่พวกเขาจะได้รับเร็ว ๆ masterนี้จะตรงไปยัง
  • ผสานdevelopเข้ากับmaster
  • สั่งให้นักพัฒนาที่จะ rebase พื้นที่ทำงานของพวกเขาในแทนmasterdevelop
  • เปิดmasterให้คอมมิชชัน
  • ลบdevelopหากคุณต้องการ (หรือปล่อยให้ล็อคอย่างถาวร / อ่านอย่างเดียวสำหรับการอ้างอิง)

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

นอกจากนี้คุณยังมีทางเลือกในการปรับใช้อย่างต่อเนื่องซึ่งทำให้การพัฒนาอยู่ในที่เดียวกันกับการผลิต (ซึ่งตรงกันข้ามกับการผลักดันผ่านหรือนำหน้าก่อนหน้า) แต่สำหรับการที่คุณต้องการการเปลี่ยนแปลงทางวัฒนธรรม
Dan Cornilescu

ฉันรู้จักแผนภาพนั้น :)
paul_h

11

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

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

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


5

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

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

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

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

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


2

Well @ dan-cornilescu กล่าวว่าเป็นปัญหาที่ดีสำหรับคุณโดยเฉพาะ แต่กรณีทั่วไปมากขึ้นสำหรับการพัฒนาที่อิงกับ Trunk (กล่าวถึงในการจัดส่งอย่างต่อเนื่อง, Lean Enterprise และคู่มือ DevOps) ทำที่นี่: https://trunkbaseddevelopment.com/

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