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