Git - มีปัญหาอะไรเกิดขึ้นจากการทำงานกับอาจารย์โดยตรง


25

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

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

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


2
กำหนด "ทำงานโดยตรง" มีอาจารย์อยู่เพราะตั้งใจจะใช้ คุณคิดว่ามันมีไว้เพื่ออะไรและใช้เพื่ออะไร
candied_orange

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

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

... ทีมใหญ่แค่ไหน?
ZJR

@MrCochese ฉันจะไม่เรียกการพัฒนาลำตัวในแง่ที่นี่ "ปกติ" แน่นอนว่าไม่มีที่ไหนในหลาย ๆ ที่ที่ฉันใช้ Git และฉันก็ไม่อยากทำ ฟีเจอร์กิ่งไม้ทำงานได้ดีขึ้น
Marnen Laibow-Koser

คำตอบ:


57

มีปัญหาหลายอย่างเมื่อส่งการคอมมิตไปยังมาสเตอร์โดยตรง

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

11
เฮ้ดู! คุณตอบคำถามจริงๆไม่เหมือนคนอื่นโดยทั่วไป ++ ยินดีต้อนรับสู่ SE.SE!
RubberDuck

ปัญหาเหล่านี้ส่วนใหญ่เป็นปัญหาที่เกิดจากการทำงานโดยตรงกับอาจารย์ไม่ดีไม่ใช่จากการทำงานโดยตรงกับอาจารย์ต่อ se
Ant P

1
@AntP ปัญหาใดที่สามารถป้องกันได้จากมุมมองของคุณ
Gernot

10

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

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

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


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

@AntP: กระบวนการที่คุณกำลังอธิบายไม่ใช่สิ่งที่ฉันจะเรียกว่า คุณสมบัติดังกล่าวได้รับการทดสอบพร้อมใช้งานและพร้อมใช้งานหรือซ่อนอยู่โดยสวิตช์คุณสมบัติหรือสิ่งที่คล้ายกันจนกว่าจะถึงเวลาที่ได้รับการทดสอบพร้อมใช้งานและพร้อมใช้งาน คุณไม่ได้จัดส่งคุณสมบัติที่ไม่ทำงาน
Robert Harvey

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

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

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

2

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

ด้วยที่กล่าวว่า Ive เห็นบางทีมทำให้การไหลของพวกเขาซับซ้อน

การไม่ใช้ PR เมื่อรวมกับต้นแบบเป็นข้อผิดพลาดเนื่องจากนักพัฒนาจะไม่มีอำนาจเลือกเมื่อเกิดการรวม

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

การทำให้สาขาสำหรับแต่ละสภาพแวดล้อม (dev, test, prod) เป็นความผิดพลาด สิ่งนี้อยู่นอกขอบเขตสำหรับ git และควรได้รับการจัดการโดยขั้นตอนการเผยแพร่ บิวด์เดียวกันที่แน่นอนควรถูกปรับใช้กับสภาพแวดล้อมทั้งหมดซึ่งเป็นไปไม่ได้หากมีสาขาสำหรับแต่ละสภาพแวดล้อม

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


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

บางทีฉันอาจจะไม่ชัดเจนอย่างสมบูรณ์ เมื่อบิลด์ถูกปรับใช้กับสภาพแวดล้อม ควรปรับใช้สิ่งประดิษฐ์เดียวกันกับสภาพแวดล้อมถัดไปโดยไม่ต้องสร้างใหม่
Esben Skov Pedersen

หากคุณมีบิลด์ที่ทำซ้ำได้มันไม่สำคัญว่าคุณจะสร้างใหม่หรือไม่ หากคุณไม่มีบิลด์ที่ทำซ้ำได้แสดงว่าคุณมีปัญหาใหญ่กว่า :)
Marnen Laibow-Koser

... แต่ใช่ฉันคิดว่าคุณควรติดแท็กคอมมิทที่ปรับใช้ของคุณเพื่อให้คุณสามารถโปรโมตรหัสเดียวกันได้ (ไม่ว่าคุณจะสร้างใหม่)
Marnen Laibow-Koser

ใช่ แต่เซิร์ฟเวอร์ CI ส่วนใหญ่สามารถเชื่อมโยงบิลด์เพื่อออกจากกล่องทำให้ง่ายต่อการติดตามการปรับใช้ เมื่อติดตั้งอย่างถูกต้องไม่จำเป็นต้องติดตามการปรับใช้ในคอมไพล์ Git เป็น scm ไม่ใช่เครื่องมือปรับใช้
Esben Skov Pedersen

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

2

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

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

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

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


1
การผลักดันของนักพัฒนา / เครื่องสาขาของเขาและเธอในแต่ละวันเป็นการสำรองที่ดี
เอียน

ฉันไม่เข้าใจความรู้สึกแรกของคุณ ฉันไม่เห็นวิธีที่pullจะสร้างสาขาใหม่หรือวิธีที่pushจะเป็นการดำเนินการผสาน แต่ที่pullเป็นค่อนข้างอักษรfetchตามด้วยmerge!
mkrieger1

@ mkrieger1 ฉันสามารถดูวิธีการหนึ่งที่สามารถพิจารณาในท้องถิ่นจะเป็นสาขาที่แตกต่างจากmaster origin masterในทางเทคนิคแล้วพวกมันต่างกันในสองรีโมตที่ต่างกันแต่ละอันมีประวัติของตัวเอง
RubberDuck

@RubberDuck ใช่แน่นอน ด้วยpull: ก่อน: สองสาขาอาจชี้ไปที่ความมุ่งมั่นที่แตกต่างกัน - หลัง: สองสาขาชี้ไปที่การกระทำที่เทียบเท่า - ไม่มีสาขาที่สร้างขึ้นดังนั้นฉันจะไม่เรียกมันว่า "การดำเนินการแยกทาง" หากคำสั่งใดในสองคำสั่งฉันจะเรียกpushมันว่าเพราะอาจสร้างสาขาใหม่ในรีโมท สิ่งที่ไม่ได้ทำคือการผสาน
mkrieger1

@ mkrieger1 คุณต้องพิจารณาทิศทางของการรวมด้วย
RubberDuck

2

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

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

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

"อย่าใช้สาขาหลัก" ไม่เพียงพอ


2

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

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

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

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


1

ไม่มี "การปฏิบัติที่ไม่ดี" ในการทำงานโดยตรงกับสาขา แต่คุณต้องตัดสินใจว่าอะไรที่สนับสนุนกระบวนการของคุณดีที่สุด:

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

คำถามที่ 2: คุณต้องการมีกระบวนการตรวจสอบโค้ดหรือไม่? จากนั้นคุณควรจะมี "ฟีเจอร์แบรนช์" ที่จะถูกรวมเข้ากับมาสเตอร์ (หรือพัฒนาถ้าคุณมี) ผ่านคำขอการดึง

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


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