ที่ทำงานของฉันต้องการที่จะรวมสาขาที่ไม่มีที่สิ้นสุดเป็นนโยบาย เรามีตัวเลือกอื่น ๆ อีกบ้าง?


119

ที่ทำงานของฉันกำลังพยายามหาวิธีที่เราจัดการแยกสาขาและผสานและเราประสบปัญหาใหญ่

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

ทีนี้ IMHO วิธีที่เป็นธรรมชาติในการจัดการคือสควอชด้านข้างให้กลายเป็นคอมมิชชันเดียว masterก้าวหน้าไปข้างหน้า อย่างที่ควรจะเป็น - เราไม่ได้ทิ้งการพัฒนาขนานไปmasterกับประวัติศาสตร์เป็นเวลาหลายเดือน และถ้าใครต้องการความละเอียดที่ดีกว่าสำหรับประวัติของไซด์แบรนช์แน่นอนว่ามันยังอยู่ที่นั่น - มันไม่ได้อยู่ในmasterไซด์แบรนช์

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

บน SourceTree เท่าที่ฉันสามารถหาได้มันเป็นเรื่องที่ปวดหัวมาก: ถ้าคุณอยู่masterและคุณต้องการดูประวัติmaster+devFeatureคุณต้องเช็คเอาmaster+devFeatureท์ (แตะทุก ๆ ไฟล์ที่แตกต่าง) หรืออย่างอื่น เลื่อนดูบันทึกแสดงสาขาของพื้นที่เก็บข้อมูลทั้งหมดของคุณขนานกันจนกว่าคุณจะพบสถานที่ที่เหมาะสม และโชคดีที่ได้รู้ว่าคุณอยู่ที่ไหน

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

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

เรามีตัวเลือกใด ๆ นอกเหนือจากการรวมสาขาย่อยเข้าด้วยกันเป็นหลักอย่างต่อเนื่องหรือไม่? หรือมีเหตุผลที่การใช้งานผสานอย่างต่อเนื่องไม่เลวร้ายอย่างที่ฉันกลัวหรือไม่?


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

65
OK แต่ในใจของฉันเป็นสาขายาวทำงานเป็นสิ่งที่คุณทำต้องการการมองเห็นบางอย่างเพื่อให้โทษและ bisects ไม่เพียงแค่ลงจอดบน "การเปลี่ยนแปลงที่ถูกนำมาใช้เป็นส่วนหนึ่งของ Rewrite บิ๊ก 2016" ฉันไม่มั่นใจพอที่จะโพสต์เป็นคำตอบ แต่สัญชาตญาณของฉันคือมันเป็นงานภายในสาขาฟีเจอร์ที่ควรแบนเพื่อให้คุณมีประวัติระยะสั้นของโครงการที่เข้าถึงได้จากประวัติศาสตร์หลักโดยไม่ต้อง ตรวจสอบสาขากำพร้า
IMSoP

5
ที่ถูกกล่าวว่ามันค่อนข้างเป็นไปได้ดังนั้นคำถามลดลงถึง "ฉันพยายามใช้ git ในระดับที่สูงกว่าเพื่อนร่วมทีมของฉันทำ; ฉันจะป้องกันไม่ให้พวกเขาสับสนสำหรับฉัน" ซึ่งยุติธรรมพอฉันเพียงแค่ไม่ได้คาดหวังว่าgit log master+bugfixDec10thจะเป็นจุดแตกหัก: - /
Standback

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

4
คือmerge --no-ffสิ่งที่คุณต้องการ? เกี่ยวกับmasterตัวเองคุณมีหนึ่งกระทำที่อธิบายถึงสิ่งที่เปลี่ยนแปลงไปในสาขา แต่ทั้งหมดของกระทำยังคงอยู่และมีการ parented ไปที่หัว
CAD97

คำตอบ:


243

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

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

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

  • คุณสควอชคอมมิทบางส่วนและจดบันทึกในข้อความคอมมิตที่ประวัติสควอชนั้นมีอยู่ในคอมมิชชันดั้งเดิม abcd123
  • คุณลบ[1]สาขาหรือแท็กทั้งหมดที่มี abcd123 เนื่องจากถูกรวมเข้าด้วยกัน
  • คุณปล่อยให้ตัวรวบรวมขยะรัน

[1]: เซิร์ฟเวอร์ Git บางตัวอนุญาตให้สาขาได้รับการปกป้องจากการลบโดยไม่ตั้งใจ แต่ฉันสงสัยว่าคุณต้องการให้สาขาฟีเจอร์ทั้งหมดของคุณคงอยู่ตลอดไป

ตอนนี้คุณไม่สามารถค้นหาการกระทำนั้นอีกต่อไป - มันไม่มีอยู่จริง

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

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

ว่าmasterประวัติศาสตร์รวมถึงประวัติศาสตร์ที่สมบูรณ์ของทุกสาขาที่รวมเข้าด้วยกันมันเป็นสิ่งที่ดีเพราะนั่นหมายถึงความเป็นจริง [2]หากมีการพัฒนาแบบขนานนั่นควรจะปรากฏในบันทึก

[2]: ด้วยเหตุนี้ฉันจึงชอบการรวมที่ชัดเจนมากกว่าที่จะทำประวัติเชิงเส้นตรง แต่สุดท้ายแล้วเป็นของปลอมอันเป็นผลมาจากการรีบูท

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

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

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

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


43
@ มาตรฐานฉันไม่สนใจสิ่งที่นักพัฒนาทำในพื้นที่ ... ใช้คำสั่ง "wip" คอมมิชชันพิเศษสำหรับการพิมพ์ผิดแต่ละครั้ง ... ไม่เป็นไรดีกว่าที่จะผูกมัดบ่อยเกินไป นักพัฒนาจะล้างข้อมูลการกระทำก่อนที่จะถูกผลักออกไปเช่นการรวมการกระทำทั้งหมดที่เพิ่งแก้ไขข้อผิดพลาดบางอย่าง ยังคงเป็นความคิดที่ดีที่จะให้คำมั่นสัญญาแยกต่างหากหากพวกเขาทำสิ่งที่แตกต่างกันเช่นการกระทำเพื่อการใช้งานจริงและการทดสอบที่เกี่ยวข้อง แต่เมื่อความมุ่งมั่นถูกผลักดันการเขียนใหม่หรือการลบประวัติมีปัญหามากกว่าที่มันคุ้มค่าอย่างน้อยในประสบการณ์ของฉัน
amon

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

80
ไม่มีอะไรน่าผิดหวังมากไปกว่าการพยายามระบุสาเหตุของข้อบกพร่องในรหัสโดยใช้git bisectเพียงเพื่อให้มันมาถึง 10,000 บรรทัด uber-commit จากสาขาด้านข้าง
tpg2114

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

2
cherry-pick ไม่ได้เขียนหรือลบประวัติ มันเพิ่งสร้างคอมมิทใหม่ซึ่งทำซ้ำการเปลี่ยนแปลงจากคอมมิทที่มีอยู่
Sarge Borsch

110

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

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

มุมมอง gitk มาตรฐาน

ใช่ยุ่งเหยิงเล็กน้อย แต่เราก็ชอบเพราะเราสามารถเห็นได้อย่างแม่นยำว่าใครมีการเปลี่ยนแปลงอะไรในเวลาใด มันสะท้อนถึงประวัติศาสตร์การพัฒนาของเราอย่างแม่นยำ หากเราต้องการที่จะเห็นมุมมองในระดับที่สูงกว่าหนึ่งคำขอดึงข้อมูลผสานในแต่ละครั้งเราสามารถดูที่มุมมองต่อไปนี้ซึ่งเทียบเท่ากับgit log --first-parentคำสั่ง:

ดู gitk ด้วย --first-parent

git logมีตัวเลือกเพิ่มเติมมากมายที่ออกแบบมาเพื่อให้มุมมองที่คุณต้องการได้อย่างแม่นยำ gitkสามารถใช้git logอาร์กิวเมนต์ใดก็ได้เพื่อสร้างมุมมองกราฟิก ฉันแน่ใจว่า GUI อื่นมีความสามารถคล้ายกัน อ่านเอกสารและเรียนรู้วิธีใช้อย่างถูกต้องแทนที่จะบังคับใช้git logมุมมองที่คุณต้องการกับทุกคนในเวลารวม


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

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

@Standback Related สิ่งหนึ่งที่ช่วยรักษาโครงสร้างนี้ให้ฉันใช้คือmerge --no-ff- อย่าใช้การผสานที่รวดเร็วไปข้างหน้าแทนที่จะสร้างการคอมมิชชันคอมมิชชันเสมอเพื่อให้--first-parentมีบางสิ่งที่จะทำงานด้วย
Izkata

34

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

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

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

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


3
ฉันเห็นด้วยอย่างเต็มที่ ทุกคนชอบติดกับนายมาก แต่นั่นเป็นปัญหาที่แตกต่างกันซึ่งใหญ่กว่าและน้อยกว่ามากภายใต้อิทธิพลที่ถ่อมตนของฉัน :-P
Standback

2
+1 สำหรับgit merge --no-ff
0xcaff

1
+1 git merge --no-ffด้วย หากคุณใช้ gitflow สิ่งนี้จะกลายเป็นค่าเริ่มต้น
David Hammen

10

ให้ฉันตอบคะแนนของคุณโดยตรงและชัดเจน:

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

โดยปกติคุณไม่ต้องการปล่อยให้สาขาของคุณไม่ได้ซิงค์เป็นเวลาหลายเดือน

สาขาฟีเจอร์ของคุณแยกย่อยบางอย่างขึ้นอยู่กับเวิร์กโฟลว์ของคุณ ลองเรียกมันว่าmasterเพื่อความเรียบง่าย git checkout long_running_feature ; git rebase masterตอนนี้เมื่อใดก็ตามที่จะกระทำการต้นแบบที่คุณสามารถและควร ซึ่งหมายความว่าสาขาของคุณได้รับการออกแบบโดยซิงค์อยู่เสมอ

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

ทีนี้ IMHO วิธีที่เป็นธรรมชาติในการจัดการคือสควอชด้านข้างให้กลายเป็นคอมมิชชันเดียว

ไม่คุณไม่ต้องการอย่างแน่นอนคุณต้องการผสานการกระทำ ผสานกระทำยังเป็น "กระทำเดียว" ไม่อย่างใดแทรกสาขาทั้งหมดกระทำ "ลงใน" ต้นแบบ มันเป็นความมุ่งมั่นเดียวกับพ่อแม่สองคน - masterหัวและหัวสาขาในเวลาที่ผสาน

ให้แน่ใจว่าได้ระบุ--no-ffตัวเลือกแน่นอน; การควบรวมกิจการโดยไม่--no-ffควรในสถานการณ์ของคุณเป็นสิ่งต้องห้ามอย่างเคร่งครัด น่าเสียดายที่--no-ffไม่ใช่ค่าเริ่มต้น แต่ฉันเชื่อว่ามีตัวเลือกที่คุณสามารถตั้งค่าได้ ดูgit help mergeสิ่งที่--no-ffทำ (ในระยะสั้น: มันเปิดใช้งานพฤติกรรมที่ฉันอธิบายไว้ในวรรคก่อน) มันเป็นสิ่งสำคัญ

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

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

และถ้าใครต้องการความละเอียดที่ดีกว่าสำหรับประวัติของไซด์แบรนช์แน่นอนว่ามันยังอยู่ที่นั่น - มันไม่ได้อยู่ในระดับมาสเตอร์มันอยู่ในไซด์แบรนช์

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

ดูสิ่งที่ฉันทำ ทุกสิ่งที่คุณอธิบายสำหรับการส่งสควอชจะอยู่ที่นั่นพร้อมกับการรวมการส่ง--no-ffมอบ

นี่คือปัญหา: ฉันทำงานเฉพาะกับบรรทัดคำสั่ง แต่ทีมที่เหลือของฉันใช้ GUIS

(คำพูดจากด้านข้าง: ฉันเกือบจะทำงานร่วมกับบรรทัดคำสั่งได้เป็นอย่างดี (นั่นคือเรื่องโกหกฉันมักใช้ emacs magit แต่นั่นเป็นอีกเรื่องหนึ่ง - ถ้าฉันไม่ได้อยู่ในสถานที่ที่สะดวกในการตั้งค่า emacs ส่วนตัวของฉัน สายเช่นกัน). แต่กรุณาทำด้วยตัวเองชอบและลองอย่างน้อยgit guiหนึ่งครั้ง. มันเป็นเพื่อให้มีประสิทธิภาพมากขึ้นสำหรับการเลือกเส้น hunks ฯลฯ สำหรับการเพิ่ม / ยกเลิกเพิ่ม.)

และฉันได้ค้นพบว่า GUIS ไม่มีตัวเลือกที่เหมาะสมในการแสดงประวัติจากสาขาอื่น

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

ดังนั้นหากคุณถึงสควอชแล้วพูดว่า "การพัฒนาครั้งนี้บีบอัดจากสาขา XYZ" มันเป็นความเจ็บปวดครั้งใหญ่ที่จะได้เห็นว่ามีอะไรใน XYZ

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

ดังนั้นพวกเขาจึงต้องการให้สาขาด้านการพัฒนาขนาดใหญ่และยาวผสานเข้าด้วยกันด้วยการรวมกิจการ

และพวกเขาพูดถูก แต่พวกเขาไม่ได้ "รวมใน " พวกเขาเป็นเพียงรวม การผสานเป็นสิ่งที่สมดุลอย่างแท้จริงมันไม่มีด้านที่ต้องการซึ่งรวมอยู่ใน "อื่น ๆ " ( git checkout A ; git merge Bเหมือนกันgit checkout B ; git merge Aทุกgit logประการยกเว้นความแตกต่างเล็กน้อยในการมองเห็นเช่นกิ่งไม้ที่ถูกสลับไปมาเป็นต้น)

พวกเขาไม่ต้องการประวัติใด ๆ ที่ไม่สามารถเข้าถึงได้ทันทีจากสาขาหลัก

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

ฉันเกลียดความคิดนั้น

ถ้าอย่างนั้นคุณก็ต้องเจ็บปวดเพราะคุณกำลังทำงานกับเครื่องมือที่คุณใช้อยู่ gitวิธีการเป็นอย่างสวยงามและมีประสิทธิภาพโดยเฉพาะอย่างยิ่งในการแยกพื้นที่ / การรวม; หากคุณทำถูกต้อง (ดังกล่าวข้างต้นโดยเฉพาะอย่างยิ่งกับ--no-ff) มันเป็น leaps และขอบเขต superiour กับวิธีการอื่น ๆ (เช่นระเบียบการโค่นล้มของการมีโครงสร้างไดเรกทอรีขนานสำหรับสาขา)

มันหมายถึงความยุ่งเหยิงไม่รู้จบเกี่ยวกับประวัติศาสตร์การพัฒนาแบบคู่ขนาน

ไม่มีที่สิ้นสุดขนาน - ใช่

Unnavigable, ยุ่งเหยิง - ไม่

แต่ฉันไม่เห็นทางเลือกอื่นที่เรามี

ทำไมไม่ทำงานเหมือนนักประดิษฐ์gitเพื่อนร่วมงานของคุณและคนอื่น ๆ ในโลกทำทุกวัน?

เรามีตัวเลือกใด ๆ นอกเหนือจากการรวมสาขาย่อยเข้าด้วยกันเป็นหลักอย่างต่อเนื่องหรือไม่? หรือมีเหตุผลที่การใช้งานผสานอย่างต่อเนื่องไม่เลวร้ายอย่างที่ฉันกลัวหรือไม่?

ไม่มีตัวเลือกอื่น ไม่เลว


10

การบีบด้านข้างในระยะยาวจะทำให้คุณสูญเสียข้อมูลจำนวนมาก

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

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


+ rebaseสำหรับการกล่าวขวัญ ไม่ว่าจะเป็นวิธีการที่ดีที่สุดที่นี่ (โดยส่วนตัวแล้วฉันไม่เคยมีประสบการณ์ที่ยอดเยี่ยมกับมันแม้ว่าฉันจะไม่ได้ใช้มันมาก) แต่มันก็ดูเหมือนจะเป็นสิ่งที่ใกล้ที่สุดกับสิ่งที่ OP ต้องการจริงๆ - โดยเฉพาะ การประนีประนอมระหว่างการถ่ายโอนข้อมูลประวัติล้าสมัยและการซ่อนประวัตินั้นอย่างสมบูรณ์
Kyle Strand

1

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

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

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

หากต้องการตอบคำถามของคุณอย่างชัดเจน:

เรามีตัวเลือกใด ๆ นอกเหนือจากการรวมสาขาย่อยเข้าด้วยกันเป็นหลักอย่างต่อเนื่องหรือไม่?

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


3
ฉันขอโทษ - ฉันทำสิ่งเดียวกัน แต่ฉันไม่เห็นว่าสิ่งนี้ตอบคำถาม: - /
Standback

2
เพิ่มคำตอบที่ชัดเจนสำหรับคำถามที่คุณระบุ
Wayne Werner

ดังนั้นมันดีสำหรับความมุ่งมั่นของฉันเอง แต่ฉัน (และทีมของฉัน) จะจัดการกับงานของทุกคน การรักษาประวัติของฉันให้สะอาดนั้นเป็นเรื่องง่าย การทำงานในประวัติ dev ยุ่ง ๆ เป็นปัญหาที่นี่
Standback

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

1
การรีบูตเป็นประจำจะไม่มีประโยชน์หากนักพัฒนาหลายคนกำลังทำงานในสาขาฟีเจอร์นั้น
Paŭlo Ebermann

-1

การควบคุมการแก้ไขคือการทิ้งขยะ

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

ในท้ายที่สุดประวัติศาสตร์ควรได้รับการเก็บรักษาไว้ (อาจมีการใช้งานบางอย่างในอนาคต) แต่ควรรวมเพียงแค่ "สำเนาที่ไม่มีการคัดลอก" เท่านั้น

ด้วย Git สิ่งนี้สามารถทำได้โดยการแยกสาขาฟีเจอร์ก่อน (เพื่อเก็บประวัติทั้งหมด) จากนั้น (โต้ตอบ) รีบูตสาขาของฟีเจอร์แบรนช์จากต้นแบบแล้วผสานรวมสาขาที่ถูกปฏิเสธ


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

1
ใช่. และเมื่อคุณรวมเข้ากับมาสเตอร์มันก็จะเป็นไปข้างหน้าอย่างรวดเร็ว
DepressedDaniel

แต่ประวัติศาสตร์นี้ถูกเก็บไว้อย่างไร? คุณปล่อยให้ฟีเจอร์ดั้งเดิมแผ่สาขาไปรอบ ๆ หรือไม่?
Paŭlo Ebermann

@ PaŭloEbermann Bingo
DepaniDaniel

อย่างที่คนอื่นพูดในความคิดเห็น: กิ่งไม้เป็นเพียงตัวชี้ไปยังกราฟประวัติศาสตร์gitและพวกเขาอยู่ในท้องถิ่น ชื่อfooใน repo หนึ่งอาจถูกตั้งชื่อbarในrepo อื่น และพวกเขาควรจะเป็นชั่วคราว: คุณไม่ต้องการที่จะยุ่งเหยิง repo ของคุณด้วยสาขาฟีเจอร์นับพันที่จำเป็นต้องมีชีวิตอยู่เพื่อหลีกเลี่ยงการสูญเสียประวัติ และคุณจะต้องเก็บสาขาเหล่านั้นไว้เพื่อเก็บประวัติอ้างอิงgitในที่สุดจะลบการกระทำใด ๆ ที่สาขาไม่สามารถเข้าถึงได้อีกต่อไป
cmaster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.