ให้ฉันตอบคะแนนของคุณโดยตรงและชัดเจน:
ปัญหาของเราคือกับสาขาระยะยาว - ประเภทที่คุณมีไม่กี่คนที่ทำงานด้านข้างที่แยกจากต้นแบบเราพัฒนาขึ้นสองสามเดือนและเมื่อเราถึงเหตุการณ์สำคัญ
โดยปกติคุณไม่ต้องการปล่อยให้สาขาของคุณไม่ได้ซิงค์เป็นเวลาหลายเดือน
สาขาฟีเจอร์ของคุณแยกย่อยบางอย่างขึ้นอยู่กับเวิร์กโฟลว์ของคุณ ลองเรียกมันว่า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เพื่อนร่วมงานของคุณและคนอื่น ๆ ในโลกทำทุกวัน?
เรามีตัวเลือกใด ๆ นอกเหนือจากการรวมสาขาย่อยเข้าด้วยกันเป็นหลักอย่างต่อเนื่องหรือไม่? หรือมีเหตุผลที่การใช้งานผสานอย่างต่อเนื่องไม่เลวร้ายอย่างที่ฉันกลัวหรือไม่?
ไม่มีตัวเลือกอื่น ไม่เลว