dvcs - "โคลนไปที่สาขา" เป็นเวิร์กโฟลว์ทั่วไปหรือไม่


9

ฉันเพิ่งพูดคุย dvcs กับเพื่อนร่วมงานเนื่องจากสำนักงานของเราเริ่มพิจารณาเปลี่ยนจาก TFS (เราเป็นร้าน MS) ในกระบวนการฉันสับสนมากเพราะเขาบอกว่าแม้ว่าเขาจะใช้ Mercurial เขาไม่เคยได้ยินคำสั่ง "สาขา" หรือ "ชำระเงิน" และข้อกำหนดเหล่านี้ไม่คุ้นเคยกับเขา หลังจากสงสัยว่ามันเป็นไปได้อย่างไรที่เขาไม่ทราบเกี่ยวกับพวกเขาและอธิบายว่า dvcs ทำงานอย่างไร "แทนที่" ในไฟล์ภายในเครื่องของคุณเขาค่อนข้างสับสน

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

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


7
นี่คือการหยุดพักจากเวิร์กโฟลว์ CVS และ SVN จำไว้ว่า"เป็นค้อนทุกอย่างดูเหมือนเล็บ"

1
@JarrodRoberson - เฉพาะในกรณีที่คุณบังคับตัวเองให้gitทำงาน ด้วยhgวิธีนี้มักจะเป็นเวิร์กโฟลว์แรกที่สอนและยังคงมีประโยชน์มาก
Mark Booth

คำตอบ:


3

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

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

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

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

http://mercurial.selenic.com/wiki/StandardBranchingอธิบายรายละเอียดเพิ่มเติมนี้ นอกจากนี้ยังควรกล่าวถึงด้วยว่าตั้งแต่ Mercurial 1.8 เป็นไปได้ที่จะสร้างบุ๊กมาร์ก ( hg bookmark) - ชื่อที่ใช้แล้วทิ้งสำหรับสาขาที่มีอายุสั้น สามารถผลักดันบุ๊กมาร์กย้ายไปมาและลบได้


2
ฉันไม่ได้ใช้ Mercurial มากนัก แต่ Git ไม่มีปัญหานี้ ฉันสามารถแยกสาขาทั้งวันในพื้นที่รวมเข้าด้วยกันเพื่อพัฒนาสาขาผลักดันและไม่มีใครต้องดูชื่อสาขาของฉัน
Andrew T Finnell

3
@AndrewFinnell: มันไม่เหมาะกับคำถามจริงๆ แต่ฉันอยากจะบอกว่ามันไม่จำเป็นต้องเป็นปัญหา แต่ก็มีข้อดีบางอย่างสำหรับวิธีการตั้งชื่อสาขาในงาน Mercurial ตัวอย่างเช่นคุณสามารถดูได้ว่าสาขาใดที่ได้ทำการส่งมอบซึ่งเป็นประโยชน์ในการรู้
benj

1
@AndrewFinnell - ชื่อสาขาเป็นสิ่งที่ฉันจริงๆพลาดในมีได้ใช้พวกเขาในgit hgนอกจากนี้ต้องจำไว้อย่างชัดเจนgit branchทุกครั้งที่ฉันต้องการสร้างสาขาเป็นที่น่ารำคาญเมื่อเทียบกับhgการสร้างสาขาที่ไม่มีชื่อโดยอัตโนมัติ
Mark Booth

คุณยังสามารถใช้ส่วนขยายของแถบที่ให้มาเพื่อลบสาขาของคุณใน hg การปรับเปลี่ยนประวัติศาสตร์ Mercurial สนับสนุนที่ดีกว่าวันนี้ผ่านการใช้งานของ "ขั้นตอนที่"
dukeofgaming

2

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

  • หากไม่มีใครทำการเปลี่ยนแปลงในระหว่างการกระทำของคุณมันจะไม่ดูเหมือนสาขาใน DAG (กราฟ acyclic กำกับ)
  • หากมีคนอื่นทำการเปลี่ยนแปลงในระหว่างการกระทำของคุณมันจะมีลักษณะเหมือนสาขาใน DAG ซึ่งไม่มีชื่อเท่านั้น

จำปุ่ม "fork" ใน Bitbucket / github ได้หรือไม่การฟอร์กถือได้ว่าเป็นความหมายของการแตกแขนงและปุ่ม "fork" ทำหน้าที่เป็นโคลนของพื้นที่เก็บข้อมูลนั้นในบัญชีของคุณ

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

บอกเพื่อนร่วมงานของคุณเพื่อเรียนรู้วิธีแยกสาขามันง่ายมากที่นี่มีการสอน:

D:\>mkdir lol

D:\>cd lol

D:\lol>hg init

D:\lol>hg branch
default

D:\lol>touch lol

D:\lol>hg add lol

D:\lol>hg commit -m "lol"

D:\lol>hg branch lol
marked working directory as branch lol
(branches are permanent and global, did you want a bookmark?)

D:\lol>hg branches
default                        0:35d562fafaf2

D:\lol>echo "lol" > lol

D:\lol>hg commit -m "New lol branch"

D:\lol>hg branches
lol                            1:9384f923e78d
default                        0:35d562fafaf2 (inactive)

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg update lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg merge lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

D:\lol>hg commit -m "lol merge"

D:\lol>hg branch
default

D:\lol>hg update lol
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

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

โดยส่วนตัวแล้วฉันไม่ชอบวิธีนี้และชอบที่จะทำสาขาและปิดพวกเขาหากจำเป็น นี่คือวิธีที่คุณทำ:

D:\lol>hg branches
default                        2:46420aca1612
lol                            1:9384f923e78d (inactive)

D:\lol>hg branch
lol

D:\lol>hg commit --close-branch -m "Obai, glorious lol branch"

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branch
lol

D:\lol>hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branches --closed
default                        2:46420aca1612
lol                            3:4b79c577e029 (closed)

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


0

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

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


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