การผสาน SVN นั้นยากขนาดไหน


28

สำเนาซ้ำที่เป็นไปได้:
ฉันเป็นผู้ที่ถูกโค่นล้มทำไมฉันจึงควรพิจารณาหรือไม่พิจารณา Mercurial หรือ Git หรือ DVCS อื่น ๆ

ทุกครั้งที่คุณได้ยินคนพูดว่าการควบคุมเวอร์ชันแบบกระจาย (Git, HG) นั้นดีกว่าการควบคุมเวอร์ชั่นแบบรวมศูนย์ (เช่น SVN) เนื่องจากการรวมกันนั้นยากและเจ็บปวดใน SVN สิ่งนี้คือฉันไม่เคยมีปัญหาใด ๆ กับการรวมใน SVN และเนื่องจากคุณเคยได้ยินการอ้างสิทธิ์ที่ทำโดยผู้สนับสนุน DVCS และไม่ใช่ผู้ใช้ SVN จริงมันมีแนวโน้มที่จะเตือนฉันเกี่ยวกับโฆษณาที่น่ารังเกียจบนทีวีที่พวกเขา พยายามขายสิ่งที่คุณไม่ต้องการโดยให้นักแสดงทำผิดพลาดแสร้งทำเป็นว่าสิ่งที่คุณมีอยู่แล้วและใช้งานได้ดีใช้ยากอย่างไม่น่าเชื่อ

และกรณีการใช้งานที่นำขึ้นมาอย่างสม่ำเสมอคือการรวมสาขาอีกครั้งหนึ่งซึ่งทำให้ฉันนึกถึงโฆษณาผลิตภัณฑ์ฟางแมนอีกครั้ง หากคุณรู้ว่าคุณกำลังทำอะไรคุณไม่ควร (และไม่ควรต้อง) รวมสาขาในตอนแรก (แน่นอนว่ามันยากที่จะทำเมื่อคุณทำอะไรผิดพลาดและไร้สาระ!)

ดังนั้นการลดกรณีการใช้ชาวฟางที่ไร้สาระมีอะไรบ้างในการรวม SVN ที่ยากกว่าการรวมในระบบ DVCS โดยรวม


6
ฉันยังไม่ได้ทำงานในสภาพแวดล้อมที่พวกเขามีสาขานานหลายเดือนถูกรวมเข้าด้วยกันและพวกเขาใช้การควบคุมเวอร์ชันแบบกระจาย สถานที่เดียวที่ฉันทำงานที่ทำเช่นนั้นกิ่งไม้ที่มีอายุยืนยาวนั้นใช้ TFS / การโค่นล้ม ฉันคาดหวังว่าสาขาที่มีอายุยาวนานเช่นนี้จะยากที่จะรวมกับ DVCS ได้เช่นกัน
Oded

13
@MasonWheeler ฉันงงงวย คุณใช้ VCS ทำอะไร ฉันเคยเห็นและอ่านว่าหนึ่งในแนวทางปฏิบัติที่แนะนำคือมีสาขาฟีเจอร์ การรวมกลับไปที่ลำตัวเป็นสิ่งจำเป็น หรือฉันเข้าใจผิดบางอย่าง? (ใช่ต้นไม้คำอุปมาแตก แต่ไม่มีประโยชน์ที่จะเริ่มต้นด้วย IMO)
Andres F.

9
@ MasonWheeler: ฉันคิดว่าคุณกำลังนำต้นไม้มาเทียบกันสักหน่อย
whatsisname


8
@ MasonWheeler คุณมีประสบการณ์ในการพัฒนาสภาพแวดล้อมที่แตกต่างกันมากน้อยแค่ไหนหากคุณไม่เคยได้ยินเรื่องการรวมกลับไปที่ท้ายรถ? ร้านค้าบางร้านมีลำตัวที่มั่นคงและสาขาทดลองซึ่งในกรณีนี้การเก็บเชอร์รี่ที่ประสบความสำเร็จกลับสู่คอกเป็นเหตุการณ์ปกติ
itsbruce

คำตอบ:


25

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

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


46

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

และในนั้นเป็นที่มาของความสับสนและปัญหาโดยรวมของคุณ

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

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

ถ้าฉันใช้ SVN ฉันจะใช้โครงสร้าง codebase ที่แตกต่างอย่างสิ้นเชิง ทำไม? เนื่องจาก SVN ทำให้การผสานยากดังนั้นคุณจึงพัฒนาสำนวนและเทคนิคเพื่อหลีกเลี่ยงการรวมที่ซับซ้อน

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

ความจริงง่ายๆคือ: คุณควรเข้าใกล้ DVCS ในวิธีที่แตกต่างจาก SVN คุณควรใช้สำนวนที่เหมาะสมกับระบบควบคุมเวอร์ชันต่าง ๆ เหล่านี้ ใน SVN คุณใช้สำนวนที่ไม่เกี่ยวข้องกับการรวมเนื่องจากการผสานนั้นยาก ใน DVCS คุณใช้สำนวนที่มักใช้การรวมกันเพราะมันไม่ใช่เรื่องใหญ่

เครื่องมือที่เหมาะสมสำหรับงานที่เหมาะสม

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

จริงๆโจเอลอธิบายมากดีไปกว่านี้ฉันสามารถ คุณควรอ่านให้ดี


2
ในทางตรงกันข้ามฉันไม่เคย "ฝึกฝน" ที่จะหลีกเลี่ยงการรวมสาขา มันเป็นเพียงสิ่งที่ไม่เคยเกิดขึ้นกับฉันอย่างสุจริตมาตั้งแต่แรกจนกระทั่งฉันเริ่มได้ยินคน DVCS พูดคุยเกี่ยวกับมันและปฏิกิริยาของฉันทันทีคือ (และยังคงเป็น) "อะไรคุณบ้าหรืออะไร?"
Mason Wheeler

14
@ ช่างก่ออิฐ: นั่นมันไม่ฝึกเลยเหรอ? คุณได้รับการฝึกฝนให้ใช้ SVN ในรูปแบบ SVN และสไตล์ SVN คือการไม่ใช้การรวม ดังนั้นคุณถูกฝึกให้ไม่ใช้หรือพิจารณารวมสิ่งต่าง ๆ เข้าด้วยกัน นั่นเป็นเหตุผลที่มันไม่เคยเกิดขึ้นกับคุณ เพราะคุณใช้ระบบที่ทำให้มันยาก
Nicol Bolas

5
มีความแตกต่างอย่างมากระหว่าง "ไม่ได้รับการฝึกฝนมา" และ "ไม่ได้รับการฝึกฝน"
Mason Wheeler

7
@MasonWheeler: ไม่ไม่มี หากคุณไม่ได้รับการสอนอย่างถูกต้องว่าจะทำอะไรคุณก็จะได้รับการฝึกฝนโดยปริยายว่าไม่ควรทำ มันไม่ได้อยู่ในเพลงของสำนวนที่คุณสามารถใช้เพื่อแก้ปัญหา ดังนั้นคุณไม่สามารถใช้เพื่อแก้ไขปัญหาได้ เอฟเฟ็กต์ไม่แตกต่างจากการบอกไม่ให้รวมเพราะแม้ว่าคุณต้องการคุณก็ไม่รู้เหมือนกัน วิธีที่คุณปฏิเสธข้อโต้แย้งที่ดีในฐานะ "พื้นเก่าที่เหนื่อยล้าเหมือนกัน" เป็นหลักฐานของสิ่งนี้ คุณไม่คิดว่าจะผสานเป็นเครื่องมือ คุณคิดว่ามันเป็นข้อยกเว้นหรือบางสิ่งที่ผิดปกติ สิ่งที่ต้องถามแทนที่จะใช้
Nicol Bolas

8
@MasonWheeler: คุณเป็นใครตัดสินใจว่า " พวกเขาทำผิด "? คุณไม่ได้ใช้ DVCS ดังนั้นคุณไม่มีประสบการณ์กับเวิร์กโฟลว์ DVCS คุณไม่รู้ว่ามันจะเป็นประโยชน์กับโปรแกรมเมอร์หรือไม่เพราะคุณไม่มีประสบการณ์ ดังนั้นคุณมีอำนาจอะไรที่จะบอกว่ามัน "ผิด" เพียงเพราะ SVN ไม่อนุญาต มันก็เหมือนกับการบอกว่าคลาสฟังก์ชั่นเสมือนจริงและแม่แบบนั้นผิดเพราะ C ไม่มี
Nicol Bolas

20

ไม่มีอะไรยากเกินไปเกี่ยวกับการรวม SVN ... อีกต่อไป ... ถ้าคุณทำตามปรัชญาที่ถูกต้อง

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

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

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

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

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

  • ใช้ SVN เวอร์ชันล่าสุด (1.6 ขึ้นไปในความคิดของฉัน) มีระบบอัตโนมัติและการตรวจสอบที่เพิ่มมากขึ้นสำหรับคุณ
  • ใช้โครงสร้าง "ลำต้นสาขาแท็ก" เริ่มต้นและใช้ปรัชญา (ไม่ผูกมัดกับแท็ก) SVN จะไม่ตรวจสอบอะไรให้คุณ หากคุณใช้แท็กเป็นสาขา (นั่นคือสถานะที่ฉันพบว่าที่เก็บโครงการใน) มันยังสามารถใช้งานได้ แต่คุณต้องสอดคล้องกัน
  • รู้ว่าสาขาใดและเมื่อใดที่จะสร้างพวกเขา เหมือนกันกับแท็ก
  • ทำให้สาขาย่อยทันสมัยอยู่เสมอด้วยสาขาต้นทาง (โดยปกติแล้วจะเป็นลำตัว แต่คุณสามารถแยกสาขาออกจากสาขาใดก็ได้ในทางเทคนิค) นี่เป็นข้อบังคับถ้าคุณต้องการให้ SVN ทำการผสานอัตโนมัติ SVN 1.8 ช่วยป้องกันคุณจากการรวมอัตโนมัติหากสิ่งต่าง ๆ ไม่ทันสมัยและหากคุณมีการแก้ไขค้างอยู่ในสำเนาการทำงานของคุณ (พฤติกรรมนี้ดูเหมือนว่าจะหายไปอีกครั้งใน 1.8.5)
  • ทำ "เหมาะสม" มุ่งมั่น พวกเขาควรจะมีการปรับเปลี่ยนในแนวคิดที่เฉพาะเจาะจงมาก มากที่สุดเท่าที่เป็นไปได้พวกเขาควรมีการเปลี่ยนแปลงเล็กน้อย คุณไม่ต้องการให้คอมมิทเดียวมีการแก้ไขเกี่ยวกับบั๊กอิสระสองตัว ถ้าคุณได้รับการแก้ไขแล้วทั้งสองและพวกเขากำลังอยู่ในไฟล์เดียวกันคุณควรจัดเก็บการเปลี่ยนแปลงของหนึ่งในข้อผิดพลาดเพื่อให้คุณสามารถกระทำเพียงการเปลี่ยนแปลงของอื่น ๆ ก่อนแล้วกระทำชุดที่สองของการเปลี่ยนแปลง โปรดทราบว่า TortoiseSVN อนุญาตให้ทำได้อย่างง่ายดายผ่าน "เรียกคืนหลังจากคอมมิชชัน"
    • การทำเช่นนั้นทำให้สามารถย้อนกลับชุดการเปลี่ยนแปลงที่เป็นอิสระและทำให้สามารถผสานชุดดังกล่าวเข้ากับสาขาอื่นได้ ใช่ SVN ช่วยให้คุณสามารถรวมการแก้ไขที่เลือกโดยเชอร์รี่
  • หากคุณใช้สาขาย่อย (แยกสาขาออกไปให้แตกสาขาใหม่นั้น) ให้เคารพลำดับชั้น หากคุณอัปเดตสาขาย่อยด้วยลำตัวหรือในทางกลับกันคุณจะรู้สึกเจ็บปวด การผสานควรได้รับการเรียงซ้อนลงหรือเพิ่มตามลำดับชั้น
    • หลังจากการทดลองไม่กี่เดือนฉันสามารถรับรองได้ว่านี่อาจเป็นส่วนที่สำคัญที่สุด พยายามสร้างกิ่งย่อยสองอันจากลำต้นเดียวกันและรวมบิตระหว่างกิ่งย่อยหรือบางครั้งระหว่างกิ่งย่อยย่อยจากทั้งสองฝั่ง สิ่งนี้สามารถเดินทางขึ้น SVN (หรือผู้ใช้) สามารถใช้งานได้หากคุณรวมการแก้ไขเฉพาะ การรวมอัตโนมัติอาจมีปัญหากับมัน
    • ฉันมีปัญหาโดยเฉพาะเมื่อทำการซิงโครไนซ์สาขาย่อย A กับลำตัวแล้วพยายามรวมบางอย่างจากสาขาย่อยเข้ากับสาขาย่อย B. SVN ดูเหมือนจะคิดว่าการแก้ไข B และสิ่งนี้นำไปสู่ความขัดแย้งมากมาย
  • มากที่สุดรวมจากรากของสาขา มิฉะนั้น SVN จะติดตามการผสานทำสำหรับโฟลเดอร์ย่อยและเมื่อคุณทำพยายามที่จะผสานอัตโนมัติจากรากคุณอาจได้รับคำเตือนเกี่ยวกับการแก้ไขที่ขาดหายไปได้ผสานรวม สามารถแก้ไขได้โดยการรวมสิ่งเหล่านี้จากรูท แต่ควรหลีกเลี่ยงความสับสน
  • ระวังสาขาที่คุณให้ไว้ หากคุณใช้ Switch เพื่อให้สำเนางานของคุณชี้ไปยังสาขาต่างๆตลอดเวลาตรวจสอบให้แน่ใจว่าคุณกำลังทำอะไรอยู่
    • มันไม่ดีโดยเฉพาะอย่างยิ่งถ้าคุณไม่อยากเปลี่ยนแปลงในที่สาขา ฉันยังไม่ชัดเจนในเรื่องนั้น แต่ขึ้นอยู่กับว่าคุณกำจัดมัน / โอนไปยังสาขาที่ถูกต้อง (การคืนค่าการผสาน) คุณจะได้รับสิ่งที่ยุ่งเหยิง สามารถแก้ไขได้ แต่คุณจะต้องรวมการแก้ไขด้วยการแก้ไขเพื่อหลีกเลี่ยงหรือแก้ไขข้อขัดแย้งที่อาจเกิดขึ้นทันทีหรือคุณจะต้องแก้ไขข้อขัดแย้งที่ซับซ้อนมากขึ้นหลังจากการรวมอัตโนมัติ
  • อย่าให้กิ่งไม้แตะต้องไว้นานเกินไป ที่จริงแล้วมันไม่ได้เป็นเรื่องของเวลา แต่มีการแก้ไขกี่ครั้งในสาขาและลำตัวและมีการเปลี่ยนแปลงมากน้อยเพียงใด ผสานระหว่างสองสาขาการรวม 3 ทางได้รับการเปรียบเทียบกับการแก้ไขล่าสุดทั่วไประหว่างสาขาเสมอ ยิ่งมีการเปลี่ยนแปลงระหว่างกันมากขึ้นเท่าใดการเปลี่ยนการรวมอัตโนมัติก็จะล้มเหลวมากขึ้น แน่นอนว่านี่เป็นสิ่งที่แย่กว่านั้นถ้าคุณเปลี่ยนโครงสร้างของรหัสในระหว่างนี้ (ย้ายหรือเปลี่ยนชื่อไฟล์)

หากคุณไม่ปฏิบัติตามข้างต้นคุณอาจมีความขัดแย้งกัน พวกเขามักจะแก้ปัญหาได้ แต่ไม่สนุกอย่างมากที่จะใช้เวลา

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

ดังนั้นทั้งหมดแล้วทั้งหมดคือการรวม SVN เข้าด้วยกันหรือไม่? ฉันเดาว่าไม่. ไม่ได้อยู่ในความห่วงใยแน่นอน มันไม่ดีเหรอ? ฉันไม่คิดอย่างนั้น มันจะถ่มน้ำลายกลับมาที่ใบหน้าของคุณเมื่อคุณใช้ในทางที่ผิดและไม่คิดว่าเกี่ยวกับสิ่งที่คุณทำ

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


ความขัดแย้งของต้นไม้ - ใช่ SVN มีปัญหากับสิ่งเหล่านี้แม้ว่า TBH จะทำเช่นนั้นในทุก ๆ SCM Git มีฮิวริสติกลองและลองดูว่าไฟล์ที่ถูกเปลี่ยนชื่อหรือย้ายนั้นเหมือนกันหรือไม่ (ไม่!) จะทำให้ถูกต้องเสมอ ฉันคิดว่า SVN ควรใช้ความพยายามในการแก้ไขข้อขัดแย้งเหล่านี้เพื่อให้เข้าใจง่ายขึ้น
gbjbaanb

@gbjbaanb: มันเสนอ "Move Move" ตามที่ Mercurial ทำ แต่ก็ไม่ได้มีการวิเคราะห์พฤติกรรม คุณต้องบอกว่าไฟล์ใดที่ถูกลบและถูกเพิ่มเข้ามาเหมือนกัน ปรับปรุงห้องอย่างแน่นอน
leokhorn

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

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

5

ตัวแบบข้อมูลภายในมีความแตกต่างกันโดยพื้นฐาน

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

ใน SVN เวอร์ชันแรกหากคุณต้องรวมสาขาBเข้ากับสาขาAอีกครั้งคุณต้องระบุช่วงการแก้ไขสาขาที่Bคุณต้องการผสานด้วยตนเองเพื่อหลีกเลี่ยงการรวมการแก้ไขเดียวกันสองครั้ง นักพัฒนาที่ฉลาดจะใช้ข้อความยืนยันเช่น 'ผสานใน B: 1234'

SVN 1.5 "แก้ไข" สิ่งนี้ แต่มันก็ไม่ได้เปลี่ยนวิธีการผสานถูกนำไปใช้เป็นพื้นฐาน เพียงเพิ่มข้อมูลเมตาบางส่วนในสาขาAทำให้ SVN ทราบว่าการแก้ไข 1234 ได้รับการรวมเข้าด้วยกันทำให้ SVN สามารถเลือกช่วงการแก้ไขที่ถูกต้องโดยอัตโนมัติ

แต่วิธีนี้เป็นวิธีแก้ปัญหาสำหรับรูปแบบข้อมูลที่พื้นฐานไม่สนับสนุนการติดตามสิ่งที่ถูกผสาน

การผสานสองกิ่งเป็นตัวอย่างที่ค่อนข้างง่าย แต่การถ่ายภาพสถานการณ์ที่ซับซ้อนกว่านี้

  1. สร้างสาขาAจากtrunkและทำคอมมิทที่นี่
  2. สร้างสาขาBจากAและทำคอมมิทที่นี่
  3. ทำคอมมิทtrunkและA
  4. รวมBเข้ากับtrunk
  5. รวมAเข้ากับB
  6. รวมAเข้ากับtrunk
  7. รวมBเข้ากับtrunk(สิ่งนี้ไม่ควรทำอะไรจริง ๆ )

การจัดการสิ่งนี้อย่างถูกต้องโดยใช้แบบจำลองข้อมูลเมตาจะซับซ้อนมาก (ฉันไม่รู้ว่า SVN จัดการกับสถานการณ์นี้ได้อย่างถูกต้องจริงหรือไม่และฉันไม่รู้สึกอยากทดสอบเลย)

การจัดการสถานการณ์นี้ในคอมไพล์นั้นง่ายมาก

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

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

ดังนั้นเมื่อรวมกันในสาขาที่มีการผสานบางส่วนมันเป็นเรื่องง่ายมากที่จะตรวจสอบสิ่งที่ได้รับการผสานแล้วและสิ่งที่ไม่ได้

ฉันไม่เคยมีประสบการณ์กับ Mercurial แต่ฉันสงสัยว่าผลงานภายในของมันคล้ายกับคอมไพล์

โดยพื้นฐานแล้วสำหรับ SVN มันเป็นเป้าหมายการออกแบบเพื่อทำให้การแตกกิ่งก้านสาขาในราคาถูก แต่ในคอมไพล์มันเป็นเป้าหมายการออกแบบเพื่อให้การรวมราคาถูก

ในที่สุดครั้งสุดท้ายที่ฉันใช้ SVN มันไม่สามารถจัดการการรวมที่ไฟล์ถูกเปลี่ยนชื่อในสาขาหนึ่งและแก้ไขในอื่น


1

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


การคาดการณ์เกี่ยวกับการเชื่อมต่อที่ช้าการทำงานจากเซิร์ฟเวอร์ระยะไกลนอกสถานที่ทำให้เกิดข้อผิดพลาดในการเชื่อมต่อที่ลดลงเช่นกันเมื่อทำการอัปเดตขนาดใหญ่> <ไม่สนุกเลย
jxramos

-1

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

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

ดังนั้นหากคุณมีสาขา 2.0 และสาขา 3.0 และพบข้อบกพร่องใน 2.0 คุณสามารถแก้ไขได้ใน 2.0 และนำชุดการแก้ไขที่แก้ไขได้และผสานเฉพาะการแก้ไขเหล่านั้นเข้ากับสาขา 3.0 ฉันไม่เชื่อว่า SVN มีวิธีการอื่นนอกเหนือจากการใช้ความแตกต่างสำหรับการแก้ไขแต่ละครั้งและการใช้งาน

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


นอกจากนี้ฉันคิดว่า Mercurial มีฟังก์ชั่นที่คล้ายคลึงกัน
Earlz

2
จริงๆแล้วคุณสามารถทำสิ่งเดียวกันใน SVN ได้ ฉันทำมันตลอดเวลา คำสั่ง SVN ผสานสามารถดึงการแก้ไข (หรือช่วงของการแก้ไข) จากสาขาที่แตกต่างกันและนำไปใช้กับสำเนาการทำงานของคุณและจากนั้นคุณกระทำมัน
Mason Wheeler

2
@MasonWheeler โปรดจำไว้ว่าความเชื่อมั่นต่อต้าน svn จำนวนมากถูกส่งไปยังเวอร์ชันก่อนหน้า 1.5 (เมื่อ svn ได้รับการติดตามผสาน) และแน่นอนว่ามันเป็นเรื่องไร้สาระแบบบ
อยแบนด์

3
@MasonWheeler เห็นstackoverflow.com/a/4215199/69742ที่โพสต์เดือดลงไป DVCS ติดตามการเปลี่ยนแปลงชุดไม่รุ่น ชุดการเปลี่ยนแปลงนั้นง่ายต่อการรับและรวม ... รุ่นไม่มากเพราะต้องใช้บริบท
Earlz

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