เมื่อใดฉันจึงควรหยุดที่จะให้ความสำคัญกับโครงการใหม่


26

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

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

คำตอบ:


23

ทันที

กุญแจสำคัญคือคำถามว่านโยบายสำหรับท่านอาจารย์คืออะไร โดยทั่วไปแล้วด้วย git นโยบายสาขาของ Master คือการปล่อยเสถียรที่buildได้ บางครั้ง Master เป็น 'การฉีด' ที่มีการสร้างและรวมสาขาก่อนที่จะรวมเข้ากับสาขา Release นี่เป็นแนวทาง / นโยบายที่แตกต่างกันสองวิธี

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

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

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

ระบุบทบาทและนโยบายของสาขาอย่างง่ายและสม่ำเสมอตั้งแต่เริ่มต้น

นี้ "สาขาเกี่ยวกับการเปลี่ยนแปลงนโยบาย" สามารถมองเห็นได้ในรูปแบบที่แตกแขนง ความคิดของแต่ละสาขามีบทบาทสามารถอ่านได้ในขั้นสูง SCM กลยุทธ์กิ่ง ทั้งสองอย่างนี้อ่านได้ดีมาก


3
ฉันเห็นด้วยกับสิ่งนี้เป็นส่วนใหญ่ แต่ฉันจะไม่พูดแค่ว่าสร้างได้ฉันจะบอกว่าreleasable (เสถียร) ต้นแบบไม่ควรมีรหัสที่สร้างขึ้น แต่ควรมีรหัสที่ผ่านการทดสอบอย่างละเอียด คุณควรสามารถดึงจากอาจารย์ได้ตลอดเวลามั่นใจในความรู้ที่ว่าจะไม่มีข้อบกพร่องร้ายแรง
Aaronaught

ฉันเห็นด้วยอย่างยิ่งกับ Aaronaught เนื่องจาก IMHO เป็นไปได้อย่างสมบูรณ์แบบ (และวิธีปฏิบัติที่ดีที่สุด) ในการทำงานในลักษณะที่ขั้นตอนจากสถานะที่ buildable หนึ่งไปยังอีกสถานะหนึ่งนั้นเป็นการเปลี่ยนแปลงที่เพิ่มขึ้นเล็กน้อยเสมอ
Doc Brown

1
@MichaelT ฉันเห็นสาขา 'dev' หลายครั้ง แต่ไม่เคยได้ยินพวกเขาอธิบายในบริบทของ "มาสเตอร์ต้น" มาก่อน ฉันคิดว่าฉันจะใช้สิ่งนี้ขอบคุณ
Droogans

13

มีสองสถานการณ์ส่วนใหญ่ที่คุณมักต้องการเริ่มทำงานกับสาขา:

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

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

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

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


12

หากคุณติดตามgit-flow - และค่อนข้างตรงไปตรงมาฉันคิดว่าคุณบ้าถ้าคุณใช้ Git และไม่ใช้รูปแบบการแยกสาขา - คุณไม่ควรผูกมัดmasterจนกว่าคุณจะพร้อมสำหรับการเปิดตัวจริง

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

มีเป็นรุ่นแขนงอื่น ๆ สำหรับ Git แต่ส่วนใหญ่ของพวกเขาได้มาจากรุ่น SCM ส่วนกลางเก่าและสามารถนำไปสู่ปัญหาร้ายแรงในสภาพแวดล้อมที่ DVCS คุณไม่จำเป็นต้องใช้ส่วนขยาย git-flow จริง ๆ และคุณไม่จำเป็นต้องใช้สาขา / โปรแกรมแก้ไขด่วน / ฟีเจอร์เหล่านั้นทั้งหมด แต่กระดูกเปล่าคือdevelopและmasterและโค้ดที่ไม่เสถียรเข้าdevelopมา


คุณไม่จำเป็นต้องทำmasterอย่างนั้นเสียก่อน จำไว้ว่าmasterไม่มีอะไรพิเศษสำหรับคอมไพล์มันไม่จำเป็นต้องอยู่ที่นั่น คุณสามารถมีสาขาการพัฒนาได้จนกว่าคุณจะต้องการเผยแพร่
Miles Rout

2
@MilesRout: ในขณะที่เป็นจริงในหลักการคุณไม่สามารถผสานเว้นแต่สาขาที่มีอยู่แล้วและกระบวนการกำหนดว่าทุกมุ่งมั่นที่จะโทควรผสานไม่ได้ส่งต่ออย่างรวดเร็ว เว้นแต่ฉันหายไปบางสิ่งบางอย่างเป็นทางเลือกเดียวที่จะเริ่มต้นที่ว่างเปล่ากระทำจะเป็นสาขาต้นแบบออกจากพลบางพัฒนากระทำการหรือสาขาที่เปิดตัวซึ่งจะหมายความว่าพวกเขาจะได้รับการแบ่งปันเดียวกันกระทำซึ่งเป็นสิ่งที่คุณควร หลีกเลี่ยง.
Aaronaught

1
อานั่นเป็นจุดที่ดีแน่นอน +1 เพื่อโพสต์และแสดงความคิดเห็น
Miles Rout

1

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

วิธีการนี้ดูเหมือนว่าจะทำงานได้ดีที่สุดในสภาพแวดล้อมที่ดำเนินการจัดส่งอย่างต่อเนื่องเนื่องจากปัญหาเกี่ยวกับการมอบหมายจะถูกจับทันที


1

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

หากต้องการทำอย่างละเอียดวันนี้การติดตามเวอร์ชันของโครงการที่มีการควบคุมซอร์สโค้ดอาจไม่ได้ผลเสมอไป (ตัวอย่างเช่นการใช้ npm เพื่อจัดการการขึ้นต่อกันและระบุ semantic version ด้วย '^') ในกรณีที่ส่วนของโครงการเปลี่ยนแปลงทุกครั้งที่บิวด์เกิดขึ้นโดยไม่จำเป็นต้องสอดคล้องกับการเปลี่ยนแปลงซอร์สโค้ดทุกครั้ง เพื่อจัดการกับความท้าทายใหม่ ๆ ประเภทนี้บางทีมเลือกที่จะสร้าง 'สิ่งประดิษฐ์' ที่บันทึกไว้แล้วในระบบควบคุมสิ่งประดิษฐ์ (เช่น JFrog Artifactory) สำหรับรุ่นติดตามโครงการ

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

สุดท้ายนี้ฉันจะก้าวไปอีกขั้นหนึ่งและแนะนำให้ใช้ต้นแบบเป็นสาขาการพัฒนาในโครงการที่มีผู้มอบหมายหลักเพียงไม่กี่คน ซึ่งเป็นกรณีสำหรับทีมของฉันและอาจเหมือนกันสำหรับร้านค้าบริการไมโครส่วนใหญ่ ความมุ่งมั่นในต้นแบบจะลบการสื่อสารของกระบวนการเปลี่ยนแปลงและอาจหลีกเลี่ยง 'รวมนรก' เมื่อทำงานกับคุณสมบัติในการวิ่งหลายครั้ง นอกจากนี้รหัสในสาขาหลักไม่จำเป็นต้องมี 'งาน' กระบวนการสร้าง / ทดสอบอัตโนมัติจะบอกคุณว่าเกิดข้อผิดพลาดอะไรและมันก็ง่ายพอที่จะตรวจสอบประวัติ git และติดต่อผู้เขียนที่สร้าง build / test :-)


0

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

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