ฉันเป็นคนโค่นล้มเพราะเหตุใดฉันจึงควรพิจารณาหรือไม่พิจารณา Mercurial หรือ Git หรือ DVCS อื่น ๆ


300

ฉันพยายามเข้าใจถึงประโยชน์ของระบบควบคุมรุ่นแจกจ่าย (DVCS)

ฉันพบว่าการโค่นล้ม Re-educationและบทความนี้โดยMartin Fowlerมีประโยชน์มาก

Mercurial และ DVCS อื่น ๆ โปรโมตวิธีใหม่ในการทำงานกับโค้ดด้วยเซ็ตการแก้ไขและการคอมมิชชันท้องถิ่น มันป้องกันการรวมนรกและปัญหาการทำงานร่วมกันอื่น ๆ

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

Mercurial อนุญาตให้คุณมีผู้หมวด

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

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

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

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

UPDATE (วันที่ 12 มกราคม) : ตอนนี้ฉันเชื่อว่ามันคุ้มค่าที่จะลอง

UPDATE (12 มิ.ย. ) : ฉันจูบ Mercurial และฉันชอบมัน รสชาติของเชอร์รี่ท้องถิ่นของเขามุ่งมั่น ฉันจูบ Mercurial เพื่อลอง ฉันหวังว่าเซิร์ฟเวอร์ SVN ของฉันจะไม่สนใจ มันรู้สึกผิดมาก มันให้ความรู้สึกที่ถูกต้อง ไม่ได้หมายถึงฉันรักคืนนี้

UPDATE FINAL (29 กรกฎาคม) : ฉันมีสิทธิ์ที่จะตรวจสอบอีริกซิงค์หนังสือเล่มต่อไป 'เรียกว่าการควบคุมเวอร์ชันโดยตัวอย่าง เขาโน้มน้าวใจฉัน ฉันจะไป Mercurial


8
ฉันก็สนใจสิ่งนี้เช่นกัน การโค่นล้มเหมาะกับวิธีที่ฉันได้รับการสอนให้คิดเกี่ยวกับการควบคุมเวอร์ชัน (มาจาก CVS และไม่ชอบ) อย่างไรก็ตามในขณะที่ฉันต้องใช้ Mercurial และ Git เพื่อลองแก้ไขข้อบกพร่องบางอย่างสำหรับโครงการโอเพนซอร์สฉันยังไม่ได้รับการแปลง
Berin Loritsch

29
+1 สำหรับคำถาม ทุกวันนี้มันได้กลายเป็นลัทธิขนส่งสินค้าที่ดีขึ้นเร็วขึ้นง่ายขึ้นเป็นธรรมชาติมากขึ้นและปราศจากปัญหาและมีความเงางามกว่า 90% เมื่อเทียบกับส่วนกลาง ยกเว้นว่ามันไม่จำเป็น เป็นเครื่องมือที่แตกต่างกันและแต่ละคนอาจมีข้อได้เปรียบในบริบทและข้อเสียบางอย่างในบริบทอื่น
Joonas Pulakka

17
@Sharpie: มีการใช้ทั้งสองsvn, gitและhgสำหรับปีที่ผ่านมาฉันรักตระหนักดีถึงข้อดีและข้อเสียของพวกเขา ในขณะที่gitแน่นอนที่มีประสิทธิภาพมากที่สุดของเหล่านี้มันเป็นสิ่งสำคัญที่จะยอมรับว่ามีประสิทธิภาพมากขึ้นไม่ได้โดยอัตโนมัติหมายความถึงการที่ดีขึ้น Emacs มีประสิทธิภาพมากกว่าตัวแก้ไขข้อความจาวาสคริปต์ที่ทำงานในเว็บเบราว์เซอร์ แต่น่าแปลกที่ฉันกำลังเขียนความคิดเห็นนี้ลงในโปรแกรมแก้ไขข้อความเบราว์เซอร์จาวาสคริปต์ทันที! ความเรียบง่ายแม้ความโง่เขลามีคุณค่าในบริบทจำนวนมาก การใช้การรวมศูนย์svnและบางอย่างเช่นgit-svnในพื้นที่ให้สิ่งที่ดีที่สุดทั้งสองโลก
Joonas Pulakka

9
@Sharpie: มันดีสำหรับคุณที่คุณชอบ แต่มืออาชีพของชายคนหนึ่งก็คือการต่อต้านของอีกคน บางคนพิจารณาความชัดเจนของพื้นที่เก็บข้อมูลส่วนกลางที่มีลำตัวบัญญัติที่มีค่าเดียวอย่างไม่น่าเชื่อ นี่คืองานนำเสนอเกี่ยวกับวิธีที่Google เก็บรักษาซอร์สโค้ดของทุกโครงการในปี 2000 ในหีบรหัสเดียวที่มีบรรทัดโค้ดหลายร้อยล้านบรรทัดโดยมีนักพัฒนาซอฟต์แวร์มากกว่า 5,000 คนเข้าถึงที่เก็บเดียวกัน คุณต้องการให้เซิร์ฟเวอร์มากกว่า 5,000 เครื่องและประวัติโครงการ 2,000 รายการบนโต๊ะของทุกคนหรือไม่ -)
Joonas Pulakka

21
-1 สำหรับการอ้างอิง Katy Perry ;)
Amadiere

คำตอบ:


331

หมายเหตุ: โปรดดู"แก้ไข"สำหรับคำตอบของคำถามปัจจุบัน


ก่อนอื่นอ่านการโค่นล้ม Re-educationโดย Joel Spolsky ฉันคิดว่าคำถามส่วนใหญ่ของคุณจะได้รับคำตอบที่นั่น

ข้อเสนอแนะอื่น Linus Torvalds' พูดคุยเกี่ยวกับ Git: http://www.youtube.com/watch?v=4XpnKHJAok8 อีกคนหนึ่งอาจตอบคำถามส่วนใหญ่ของคุณและเป็นคำถามที่ให้ความบันเทิง

BTW สิ่งที่ฉันคิดว่าค่อนข้างตลก: แม้แต่ Brian Fitzpatrick และ Ben Collins-Sussman ผู้สร้างการโค่นล้มดั้งเดิมสองคนกล่าวใน Google Talk ครั้งเดียวว่า "ขอโทษที่" หมายถึงการโค่นล้มด้อยกว่า Mercurial (และ DVCSs โดยทั่วไป)

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

  • คุณไม่ได้พึ่งพาเซิร์ฟเวอร์และการเชื่อมต่อซึ่งหมายถึงเวลาที่เร็วกว่า
  • ไม่เป็นทาสของสถานที่ที่คุณสามารถเข้าถึงอินเทอร์เน็ต (หรือ VPN) เพียงเพื่อให้สามารถกระทำการ
  • ทุกคนมีการสำรองข้อมูลทุกอย่าง (ไฟล์ประวัติ) ไม่ใช่แค่เซิร์ฟเวอร์ ความหมายทุกคนสามารถเป็นเซิร์ฟเวอร์
  • คุณสามารถกระทำจูงใจหากคุณต้องการโดยไม่ต้อง messing รหัสอื่น ความมุ่งมั่นเป็นของท้องถิ่น คุณไม่ได้เหยียบนิ้วเท้าของกันและกันขณะที่กระทำ คุณจะไม่ทำลายงานสร้างหรือสภาพแวดล้อมของผู้อื่นโดยการทำ
  • ผู้ที่ไม่มี "กระทำการเข้าถึง" สามารถกระทำ (เนื่องจากการยอมรับใน DVCS ไม่ได้หมายความถึงการอัปโหลดรหัส) การลดอุปสรรคสำหรับการมีส่วนร่วมคุณสามารถตัดสินใจที่จะดึงการเปลี่ยนแปลงของพวกเขาหรือไม่ในฐานะผู้รวม
  • มันสามารถเสริมกำลังการสื่อสารตามธรรมชาติได้เพราะ DVCS ทำให้สิ่งนี้สำคัญ ... ในการโค่นล้มสิ่งที่คุณมี แต่เป็นการแข่งขันซึ่งบังคับให้สื่อสาร แต่โดยการขัดขวางการทำงานของคุณ
  • ผู้ร่วมให้ข้อมูลสามารถรวมทีมและจัดการการผสานของตัวเองซึ่งหมายถึงการทำงานที่น้อยลงสำหรับผู้รวมระบบในท้ายที่สุด
  • ผู้มีส่วนร่วมสามารถมีสาขาของตัวเองโดยไม่กระทบต่อผู้อื่น (แต่สามารถแบ่งปันได้หากจำเป็น)

เกี่ยวกับคะแนนของคุณ:

  • การรวมนรกไม่มีอยู่ใน DVCSland; ไม่จำเป็นต้องได้รับการจัดการ ดูจุดถัดไป
  • ใน DVCS ทุกคนหมายถึง "สาขา" ซึ่งหมายถึงมีการรวมการเปลี่ยนแปลงทุกครั้งที่มีการดึง กิ่งไม้ที่มีชื่อเป็นอีกสิ่งหนึ่ง
  • คุณสามารถใช้การรวมอย่างต่อเนื่องหากคุณต้องการ ไม่จำเป็นต้องมี IMHO ทำไมต้องเพิ่มความซับซ้อนให้ทำการทดสอบเป็นส่วนหนึ่งของวัฒนธรรม / นโยบายของคุณ
  • Mercurial นั้นเร็วกว่าในบางสิ่ง git นั้นเร็วกว่าในบางสิ่ง ไม่ได้ขึ้นอยู่กับ DVCS โดยทั่วไป แต่สำหรับการใช้งานเฉพาะ AFAIK
  • ทุกคนจะมีโครงการเต็มรูปแบบไม่เพียง แต่คุณเท่านั้น สิ่งที่แจกจ่ายเกี่ยวข้องกับการที่คุณสามารถคอมมิท / อัพเดตโลคัลการแชร์ / การรับจากภายนอกคอมพิวเตอร์ของคุณเรียกว่าการกด / การดึง
  • อ่านการโค่นล้มการศึกษาอีกครั้ง DVCS นั้นง่ายกว่าและเป็นธรรมชาติมากกว่า แต่ก็แตกต่างกันอย่าพยายามคิดว่า cvs / svn === ฐานของเวอร์ชันทั้งหมด

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

ส่วนกลาง

ข้อความแสดงแทน

เผยแพร่ในทางปฏิบัติทั่วไป

ข้อความแสดงแทน

แจกจ่ายให้เต็มที่

ข้อความแสดงแทน

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

ตอนนี้เป็นเวิร์กโฟลว์ทั่วไปสำหรับโครงการโอเพนซอร์ส (เช่นโครงการที่มีการทำงานร่วมกันจำนวนมาก) โดยใช้ DVCS:

ข้อความแสดงแทน

Bitbucket.orgค่อนข้างคล้าย GitHub สำหรับ Mercurial รู้ว่าพวกเขามีที่เก็บส่วนตัวไม่ จำกัด พร้อมพื้นที่ไม่ จำกัด หากทีมของคุณมีขนาดเล็กกว่าห้าคุณสามารถใช้งานได้ฟรี

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


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

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

เกี่ยวกับ "การรวมนรก" คุณพูดว่า "เว้นแต่ว่าเรากำลังทดลอง" ฉันพูดว่า "แม้ว่าคุณกำลังทดลอง + การบำรุงรักษา + ทำงานใน v2.0 ที่ปรับปรุงใหม่ในเวลาเดียวกัน " อย่างที่ฉันพูดก่อนหน้านี้การรวมนรกไม่มีอยู่เพราะ:

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

ข้อความแสดงแทน

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

เกี่ยวกับการทำงานของเซ็ตการแก้ไขและการเพิ่มประสิทธิภาพ ฉันจะพยายามที่จะแสดงให้เห็นว่ามันมีตัวอย่างผมชอบที่จะให้: สวิทช์โครงการ MooTools จาก SVN ของพวกเขาแสดงในกราฟเครือข่าย GitHub

ก่อน

ข้อความแสดงแทน

หลังจาก

ข้อความแสดงแทน

สิ่งที่คุณเห็นคือนักพัฒนาสามารถจดจ่อกับงานของตัวเองในขณะที่ให้คำมั่นโดยไม่กลัวการทำลายรหัสของผู้อื่นพวกเขากังวลเกี่ยวกับการทำลายรหัสของผู้อื่นหลังจากการกด / ดึง (DVCSs: กระทำครั้งแรกแล้วกด / ดึง ) แต่เนื่องจากการผสานกันอย่างชาญฉลาดที่นี่พวกเขามักจะไม่ทำ ... แม้ว่าจะมีความขัดแย้งผสาน (ซึ่งหายาก) คุณใช้เวลาเพียง 5 นาทีหรือน้อยกว่าในการแก้ไข

คำแนะนำของฉันสำหรับคุณคือมองหาคนที่รู้วิธีใช้ mercurial / git และบอกให้เขาอธิบายให้คุณฟัง ด้วยการใช้เวลาประมาณครึ่งชั่วโมงกับเพื่อน ๆ ในบรรทัดคำสั่งในขณะที่ใช้งาน Mercurial กับเดสก์ท็อปและบัญชี Bitbucket ของเราแสดงให้พวกเขาเห็นว่าจะผสานได้อย่างไรแม้จะสร้างความขัดแย้งให้พวกเขาเห็นวิธีแก้ไขในเวลาที่ไร้สาระ พลังที่แท้จริงของ DVCS

สุดท้ายฉันขอแนะนำให้คุณใช้ mercurial + bitbucket แทน git + gitub ถ้าคุณทำงานกับ windows folks Mercurial นั้นเรียบง่ายกว่าเดิม แต่ git นั้นมีประสิทธิภาพมากกว่าสำหรับการจัดการพื้นที่เก็บข้อมูลที่ซับซ้อนมากขึ้น (เช่นrebit git )

การอ่านที่แนะนำเพิ่มเติมบางประการ:


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

17
คำตอบที่ดี. เพียงบันทึกด้านข้าง: ในขณะที่ Spolsky อาจมีจุดที่ดีโปรดจำไว้ว่าเขาพยายามขายผลิตภัณฑ์โดยใช้คะแนนเหล่านั้นเป็นวัสดุการขายซึ่งทำให้พวกเขาลำเอียงเล็กน้อย
Martin Wickman

5
ฉันอ่านหน้าการศึกษาอีกครั้งและไม่พบว่าเกี่ยวข้องกับหลายสาเหตุ ฉันจะแก้ไขคำถามด้วยมุมมองส่วนตัวของฉันในหัวเรื่อง

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

6
@Pierre ของ DVCS ดูแลการรวมการเปลี่ยนแปลงซอฟต์แวร์จากโปรแกรมเมอร์แต่ละตัว แต่ไม่ได้ทำการรวบรวมซอฟต์แวร์จริงหรือผ่านการทดสอบหน่วยที่มีอยู่ คุณยังคงต้องใช้ซอฟต์แวร์อื่นในการทำเช่นนี้เมื่อใดก็ตามที่มีการเปลี่ยนแปลงแหล่งที่มาและทางออกที่ดีที่สุดที่เรามีในวันนี้คือใช้ CI-engine (และทำอย่างถูกต้อง)

59

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

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

DVCS คือการโค่นล้ม Bittorrent คือ ftp

(ในทางเทคนิคไม่ใช่กฎหมาย) บางทีถ้าคุณคิดอย่างนั้นคุณอาจเข้าใจว่าทำไมมันถึงก้าวกระโดดครั้งใหญ่

สำหรับฉันแล้วสวิตช์ของเราไปยังคอมไพล์ส่งผลทันที

  • การสำรองข้อมูลของเราทำได้ง่ายกว่า (เพียงแค่ "อัพเดตแบบระยะไกลคอมไพล์" และคุณก็เสร็จสิ้น)
  • ทำขั้นตอนเล็ก ๆ ง่ายขึ้นเมื่อทำงานโดยไม่ต้องเข้าถึงที่เก็บส่วนกลาง คุณทำงานและซิงโครไนซ์เมื่อคุณกลับมาที่เครือข่ายที่โฮสต์ที่เก็บส่วนกลาง
  • เร็วกว่าฮัดสันสร้าง เร็วกว่ามากในการใช้ git pull กว่าการอัพเดต

ดังนั้นให้พิจารณาว่าทำไม bittorrent ดีกว่า ftp และพิจารณาตำแหน่งของคุณอีกครั้ง :)


หมายเหตุ: มีการกล่าวถึงว่ามีกรณีการใช้งานโดยที่ ftp เร็วกว่าและดีกว่า bittorrent นี่เป็นความจริงในแบบเดียวกับที่ไฟล์สำรองที่คุณโปรดปรานรักษาไว้นั้นใช้งานได้เร็วกว่าระบบควบคุมเวอร์ชัน


ฉันเกือบตัดสินใจแล้วว่าจะลองกับโครงการจริง

ความคิดที่ดี. อย่าลืมเข้าไปด้วยความคิดของ "ฉันชอบสิ่งนี้จริงๆ!" แทนที่จะเป็น "ฉันไม่ต้องการทำสิ่งนี้!" มีอะไรมากมายให้เรียนรู้ หากคุณเลือกคอมไพล์ GitHub มีความช่วยเหลือออนไลน์ที่ดีมากมาย หากคุณเลือก hg Joel ได้เขียนเนื้อหาออนไลน์ที่ดี หากคุณเลือก bzr Canonical น่าจะมีเนื้อหาออนไลน์ที่ดีมากมาย อื่น ๆ ?

3
อืมที่อนุมานว่าคุณคิดว่า BitTorrent ดีกว่า FTP ...
Murph

2
@Murph ฉันทำและ Blizzard ทำเช่นนั้น (ที่ฉันเชื่อว่าเราสามารถเห็นด้วยรู้วิธีจัดการกับการซิงโครไนซ์ออนไลน์ขนาดใหญ่ได้อย่างไร) wowwiki.com/Blizzard_Downloader

2
@Murph คุณเริ่มต้นเซิร์ฟเวอร์ฝนตกหนักบนเซิร์ฟเวอร์และไคลเอนต์ฝนตกหนักบนไคลเอนต์ ไม่ยาก. ควรซื้อคุณทันทีว่าเฉพาะไฟล์ที่มีการเปลี่ยนแปลงเท่านั้นที่จำเป็นต้องได้รับการอัปเดต นอกจากนี้คุณยังได้พิจารณาว่า rsync ใดบ้างแทนที่จะเป็น ftp อาจซื้อให้คุณสำหรับการอัพเดทที่เพิ่มขึ้น?

46

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

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

  • เหตุผลที่แท้จริงที่มีพื้นที่เก็บข้อมูลในท้องถิ่นเป็นฆาตกรก็คือว่าคุณมีการควบคุมทั้งหมดกว่าประวัติกระทำของคุณก่อนที่จะได้รับการผลักดันให้พื้นที่เก็บข้อมูลหลัก

เคยแก้ไขข้อบกพร่องและจบลงด้วยสิ่งที่ชอบ:

r321 Fixed annoying bug.
r322 Argh, unexpected corner case to annoying bug in r321!
r323 Ok, really fixed corner case in r322
r324 Oops, forgot to remove some debugging code related to r321
...

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

การมีโลคัลโลคัลของที่เก็บซึ่งคุณเป็นเจ้าของแก้ไขสิ่งนี้เนื่องจากคุณสามารถเขียนประวัติอีกครั้งโดยการกลิ้ง "fix it" และ "oops" อย่างต่อเนื่องเพื่อคอมมิตใน "การแก้ไขข้อบกพร่อง" ในตอนท้ายของวันการส่งมอบคอมมิทหนึ่งรายการจะถูกส่งไปยังที่เก็บข้อมูลหลักที่มีลักษณะดังนี้:

r321 Fixed annoying bug.

ซึ่งเป็นวิธีที่ควรจะเป็น

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

  • ทำวานิลลาธรรมดาผสาน นำทุกอย่างในหูดและทั้งหมด

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

เมื่อฉันเรียนรู้วิธีที่ที่เก็บข้อมูลในท้องที่อนุญาตให้ฉันแก้ไขประวัติของฉันเพื่อความมีสติของโปรแกรมเมอร์เพื่อนและตัวฉันในอนาคตของฉันฉันวาง SVN ให้ดี git svnลูกค้าการโค่นล้มของฉันตอนนี้

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


6
ประวัติการเขียนใหม่: นั่นเป็นเพียงเรื่องของ Git หรือไม่? หรือว่า Mercurial ก็ง่ายเช่นกัน? (ถ้าเป็นฉันต้องเริ่มต้นทำมันจริงๆ)
Paul D. Waite

3
สิ่งหนึ่งที่ควรระวังเกี่ยวกับวินัยเคอร์เนลของ Linux เมื่อทำเช่นนี้คืออย่ารีบูท (หรือเขียนประวัติใหม่) สาขาที่คุณเผยแพร่สู่สาธารณะ หากคุณมีสาขาที่เป็นสาธารณะสำหรับการใช้งานระยะสั้น (สำหรับการรวมเข้าไปในสาขาที่ถูกโยนทิ้งบ่อยๆเช่น linux-next หรือสำหรับใครบางคนเพื่อตรวจสอบแล้วทิ้งสำเนาในท้องที่ของพวกเขา) จากนั้นคุณสามารถ rebase สาขาเหล่านั้น ผู้ใช้รายอื่นควรมีความชัดเจนว่าอนุสัญญาสำหรับสาขานั้นคือสามารถถูกลดราคาและไม่ควรรวมเข้ากับสาขาระยะยาวของประชาชนอื่น ๆ
Ken Bloom

4
คุณอาจเข้าถึงอินเทอร์เน็ตได้โดยไม่ต้องเข้าถึงเครือข่ายภายในเต็มรูปแบบ เกิดขึ้นกับฉันบ่อยครั้งเมื่อเดินทาง

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

6
@ พอลฉันเข้าใจว่าใน Mercurial มันสามารถทำได้ แต่มันไม่ใช่ฟังก์ชันพื้นฐานหรือปรัชญา
Benjol

18

คำตอบ dukofgamings น่าจะดีเท่าที่จะได้รับ แต่ฉันต้องการที่จะเข้าใกล้สิ่งนี้จากทิศทางที่แตกต่าง

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


2
ที่จริงฉันจะเสนอเรื่องนี้ต่อต้าน DCVS บริษัท ของฉันเปลี่ยนเป็น Mercurial จาก CVS เมื่อเร็ว ๆ นี้ ผู้คนกำลังลบการเปลี่ยนแปลงของคนอื่น ๆ ในระหว่างการรวมทางบ่อยครั้งกว่าใน CVS
Juozas Kontvainis

@JuozasKontvainis: ฉันไม่รู้ Mercurial เป็นอย่างดี แต่ใน git คุณสามารถไม่อนุญาตการพุชที่มีการรวมที่ไม่มี HEAD ในฐานะผู้ปกครองซึ่งป้องกันผู้ใช้ที่ผลักดันการเปลี่ยนแปลงที่ไม่มีการเปลี่ยนแปลงล่าสุดจากต้นแบบ ฉันแน่ใจว่ามีบางอย่างที่คล้ายกันใน Mercurial
naught101

@ naught101: อันที่จริง บริษัท ของฉันเปิดใช้งานการตั้งค่านั้น สิ่งที่เกิดขึ้นคือโปรแกรมเมอร์ผู้นั้นยอมรับการเปลี่ยนแปลงในพื้นที่จากนั้นพยายามผลัก เขาได้รับการตอบสนองจากเซิร์ฟเวอร์ที่เขาต้องการรวมก่อนที่จะผลัก เขาได้รับการอัปเดตจากเซิร์ฟเวอร์และพยายามที่จะรวมการกระทำ เมื่อมาถึงจุดนี้ฉันไม่รู้ว่าคนเหล่านั้นรวมการกระทำได้อย่างไร แต่ในหลายครั้งที่การผสานกระทำโดยทั่วไปจะลบการเปลี่ยนแปลงที่พวกเขาได้รับจากเซิร์ฟเวอร์
Juozas Kontvainis

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

1
จริง ๆ แล้วมันฟังดูเหมือนว่า: randyfay.com/content/avoiding-git-disasters-gory-storyดีบทความที่ไม่สำคัญเกี่ยวกับสิ่งที่ผิดพลาดกับ repo git ถ้าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่
gbjbaanb

9

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

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

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


2
Git ได้รับการออกแบบมาเพื่อกระจายงานทั่วโลกและสนับสนุนให้ผู้คนทำงานในโครงการของตนเองและสร้างส้อมของตัวเอง มันไม่ได้ออกแบบมาโดยเฉพาะสำหรับการรวมอย่างต่อเนื่องใน "ทีมเล็กและการทำงานร่วมกันสูง" ซึ่งเป็นสิ่งที่ OP ขอ
Martin Wickman

4
คาดเดาสิ่งที่คุณจะได้รับความขัดแย้งที่มีขนาดเล็ก / ง่ายต่อการแก้ไข แต่ถ้าสอง ppl กำลังเปลี่ยนแปลงส่วนเดียวกันของรหัสคุณมีปัญหาในการวางแผนในทีมของคุณและ VCS ใด ๆ ไม่สามารถแก้ไขได้ กระจายหรือไม่
Martin Wickman

4
OP อยู่ในทีมร่วมตั้งอยู่โดยใช้ CI ซึ่งหมายความว่าพวกเขาเช็คอินเล็ก ๆ บ่อยครั้ง (หลายครั้งต่อวัน) เมื่อพิจารณาถึงสิ่งนี้ฉันไม่เห็นเหตุผลว่าทำไมการใช้ dvcs ควรให้ความได้เปรียบโดยเฉพาะและฉันไม่เห็นเหตุผลว่าทำไมการผสานขนาดใหญ่ควรเกิดขึ้นจึงไม่มีการรวมนรก ฉันจะไม่แนะนำ svn สำหรับทีมที่กระจายตัว แต่นั่นไม่ใช่กรณีที่นี่
Martin Wickman

2
@MartinWickman - Mercurial ได้รับการออกแบบเพื่อการคอมมิชชันการแยกและการรวมอย่างรวดเร็วและราคาถูก นั่นฟังดูสมบูรณ์แบบสำหรับการบูรณาการอย่างต่อเนื่อง โดยส่วนตัวแล้วฉันคิดว่าการที่อลิซมีความสามารถในการแยกการเปลี่ยนแปลงของเธอและแนะนำให้บ๊อบดึงพวกเขาและรวมการเปลี่ยนแปลงของเขาเข้ากับสาขานั้นเพื่อตรวจสอบปัญหา - ทั้งหมดโดยไม่ต้องสัมผัสเซิร์ฟเวอร์กลางหรือผลักดันการเปลี่ยนแปลงใด ๆ สำหรับการทำงานเป็นทีมขนาดเล็กและความร่วมมือสูง
philosodad

2
ฉัน $ 0.02 ฉันเคยใช้การโค่นล้ม Mercurial และ Git ตอนนี้สำหรับโครงการต่างๆ การโค่นล้มดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดสำหรับกลุ่มที่มีการบูรณาการอย่างแน่นหนาและทำการรวมกลุ่มอย่างต่อเนื่อง Mercurial เหมาะอย่างยิ่งสำหรับกลุ่มที่อาจสร้างหนึ่งวันต่อวันโดยมีการเปลี่ยนแปลงรหัสมากขึ้นในแต่ละครั้ง (ซึ่งจะสร้างปัญหาการรวมใน SVN) Git ดูเหมือนจะเป็นหนทางสำหรับผู้ที่มีทีมที่สามารถไปหลายวัน / สัปดาห์โดยไม่ต้องกดรหัสเข้าด้วยกันเพื่อสร้างงาน
Brian Knoblauch

8

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

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

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

Git แก้ปัญหาเหล่านี้ได้ (รวมถึงการตรวจจับโดยอัตโนมัติหากไฟล์ถูกย้ายคุณไม่จำเป็นต้องบอกด้วยซ้ำว่าเป็นเรื่องจริง)

ในทางกลับกันคอมไพล์ไม่อนุญาตให้คุณแยกสาขาในแต่ละระดับไดเรกทอรีเช่นการโค่นล้ม

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


จริงมากการทดลองทางเลือกควรเป็นไปโดยอัตโนมัติ

git ใช้ฮิวริสติกบางอย่างเพื่อพิจารณาว่าไฟล์ย้ายได้ดีหรือไม่ แต่สมบูรณ์
gbjbaanb

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

7

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

สิ่งเดียวที่ทำให้ฉันเปลี่ยนได้!


เห็นด้วยการชำระเงินคอมไพล์อย่างรวดเร็ว

+1 สำหรับการชี้ให้เห็นการกระโดดข้ามกิ่งไม้ / ชุดการเปลี่ยนแปลงค่อนข้างเร็ว
dukeofgaming

3

แทนที่จะแขวนบนแนวคิดที่ว่า "โดยการใช้แนวทางปฏิบัติที่ดีที่สุดคุณไม่จำเป็นต้องใช้ DVCS" ทำไมไม่คิดว่าเวิร์กโฟลว์ SVN เป็นเวิร์กโฟลว์เดียวโดยมีแนวปฏิบัติที่ดีที่สุดชุดหนึ่งและเวิร์กโฟลว์ GIT / Hg เป็นเวิร์กโฟลว์ที่แตกต่างกัน ด้วยแนวทางปฏิบัติที่ดีที่สุดชุดอื่น

git bisect (และความหมายทั้งหมดในที่เก็บหลักของคุณ)

ใน Git git bisectซึ่งเป็นหลักการที่สำคัญมากคือการที่คุณสามารถพบข้อบกพร่องโดยใช้ ในการทำเช่นนี้คุณจะใช้เวอร์ชันล่าสุดที่คุณใช้ซึ่งเป็นที่รู้จักในการทำงานและเวอร์ชันแรกที่คุณรันนั้นเป็นที่รู้จักว่าล้มเหลวและคุณดำเนินการ (ด้วยความช่วยเหลือของ Git) เพื่อค้นหาปัญหาที่ก่อให้เกิดข้อผิดพลาด ในการทำเช่นนี้ประวัติการแก้ไขทั้งหมดของคุณจะต้องปราศจากข้อผิดพลาดอื่น ๆ ที่อาจรบกวนการค้นหาบั๊กของคุณ (เชื่อหรือไม่ว่านี่ใช้งานได้จริงในทางปฏิบัติและผู้พัฒนาเคอร์เนล Linux ทำสิ่งนี้ตลอดเวลา)

เพื่อให้บรรลุgit bisectความสามารถคุณพัฒนาคุณลักษณะใหม่ในตัวเองสาขาคุณลักษณะ , rebase มันและทำความสะอาดประวัติความเป็นมา (เพื่อให้คุณไม่ได้เป็นที่รู้จักในการแก้ไขไม่ทำงานใด ๆ ในประวัติของคุณ - เพียงพวงของการเปลี่ยนแปลงที่คุณได้รับในแต่ละครึ่ง เพื่อแก้ไขปัญหา) จากนั้นเมื่อคุณสมบัติเสร็จสิ้นคุณจะรวมมันไว้ในสาขาหลักที่มีประวัติการทำงาน

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

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

gitworkflowsหน้าคนเป็นแนะนำที่ดีในขั้นตอนการทำงานที่ Git ถูกออกแบบมาสำหรับ นอกจากนี้ทำไม Git ดีกว่า Xกล่าวถึงขั้นตอนการทำงานคอมไพล์

โครงการกระจายขนาดใหญ่

เหตุใดเราจึงต้องการผู้แทนในทีมที่มีความร่วมมือสูงกับแนวปฏิบัติที่ดีและนิสัยการออกแบบที่ดี

เพราะในโครงการอย่างลีนุกซ์มีผู้คนมากมายที่มีส่วนร่วมในพื้นที่ซึ่งเป็นการยากที่จะร่วมมือกันเป็นทีมขนาดเล็กที่ใช้ห้องประชุมร่วมกัน (ฉันสงสัยว่าสำหรับการพัฒนาผลิตภัณฑ์ขนาดใหญ่เช่น Microsoft Windows ที่แม้ว่าทุกคนจะอยู่ในอาคารเดียวกันทีมก็ใหญ่เกินไปที่จะรักษาระดับของการทำงานร่วมกันที่ทำให้ VCS ส่วนกลางทำงานโดยไม่ต้องมีผู้แทน)


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

@Pierre นั่นเป็นเหตุผลที่เหมาะสมที่จะแบ่งโครงการออกเป็นองค์ประกอบแยกต่างหาก เนื่องจาก Linux เป็นเคอร์เนลเสาหินซึ่งหมายความว่า (โดยพื้นฐาน) ว่าไดรเวอร์อุปกรณ์ทั้งหมดจะต้องได้รับการพัฒนาในพื้นที่เก็บข้อมูลเดียวกันแม้ว่าแต่ละโปรแกรมจะเป็นโครงการแยกต่างหาก ในขณะเดียวกันพวกเขาต้องการความคล่องตัวสำหรับสถาปนิกที่มีประสบการณ์มากขึ้นในการเปลี่ยนแปลงที่หลากหลายซึ่งสัมผัสไดรเวอร์ทั้งหมดเหล่านี้ดังนั้นการแบ่งพวกเขาออกเป็นที่เก็บอื่น ๆ จะเป็นความเจ็บปวด ดังนั้นคอมไพล์ (และผู้หมวด) จึงเหมาะสมกับพวกเขาเป็นอย่างดีสำหรับการจัดการข้อกังวลต่าง ๆ
Ken Bloom

คุณอาจสนใจอ่านสิ่งที่ Martin Fowler พูดเกี่ยวกับ SVN กับ Git และเวิร์กโฟลว์ Mercurial martinfowler.com/bliki/VersionControlTools.html
Ken Bloom

2
ฉันทำการแบ่งส่วนย่อยบน SVN เป็นประจำเพื่อค้นหาข้อบกพร่อง ความแตกต่างเพียงอย่างเดียวกับ Git คือมันไม่ได้เป็นไปโดยอัตโนมัติทั้งหมด แต่สิ่งนี้เพียงอย่างเดียวคงไม่เพียงพอที่เราจะเปลี่ยน
ซาเวียร์โนเดต

1
ความเกี่ยวข้องของ gis bisect สำหรับทีมขนาดเล็กเกือบจะเป็นศูนย์ ฉันได้รับมันสำหรับเคอร์เนลที่มีการเปลี่ยนแปลงหลายร้อยจากคนที่แตกต่างกันถูกรวมเข้าด้วยกันและทำลายสิ่งต่าง ๆ แต่เมื่อคุณมีทีม 5 คุณมักจะกำจัดทั้งหมด แต่ 2-3 แพทช์ผู้ร้ายที่อาจเกิดขึ้นได้อย่างรวดเร็ว เข้าสู่ระบบ
blucz

2

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


แต่คุณสามารถตั้งค่าพื้นที่เก็บข้อมูลส่วนกลางด้วย DVCS (และคุณสามารถควบคุมการอนุญาตเช่นเดียวกับ CVCS อย่างแน่นหนาดังนั้นประโยชน์คืออะไร
naught101

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

1

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

DVCS

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

CVCS

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

ความแตกต่างอื่น ๆ

ความแตกต่างอื่น ๆ ระหว่างsvnและgit/ hgเช่นการปรับเปลี่ยน vs ชุดการแก้ไขเป็นเรื่องเล็กน้อย เป็นไปได้มากที่จะสร้าง DVCS ตามการแก้ไข (เนื่องจากมีการโค่นล้ม) หรือ CVCS ตามการเปลี่ยนแปลง (ตาม Git / Mercurial มีอยู่)

ฉันจะไม่แนะนำเครื่องมือใด ๆ เพราะส่วนใหญ่ขึ้นอยู่กับรูปแบบการทำงานที่คุณ (และทีมของคุณ) รู้สึกสบายใจที่สุด
ส่วนตัวฉันไม่มีปัญหากับการทำงานกับ CVCS

  • ฉันไม่กลัวการตรวจสอบสิ่งต่าง ๆ เนื่องจากฉันไม่มีปัญหาที่จะทำให้มันเข้าสู่สภาวะที่ไม่สมบูรณ์ แต่สามารถรวบรวมได้
  • เมื่อผมมีประสบการณ์ผสานนรกมันก็อยู่ในสถานการณ์ที่มันจะเกิดขึ้นทั้งในsvnและ/git hgตัวอย่างเช่น V2 ของซอฟต์แวร์บางตัวถูกดูแลโดยทีมอื่นโดยใช้ VCS ที่แตกต่างกันในขณะที่เรากำลังพัฒนา V3 ในบางครั้งการแก้ไขข้อผิดพลาดจะต้องนำเข้าจาก V2 VCS ​​ไปยัง V3 VCS ซึ่งโดยทั่วไปหมายถึงทำการเช็คอินที่ใหญ่มากบน V3 VCS (ด้วยการแก้ไขข้อบกพร่องทั้งหมดในเซ็ตการแก้ไขเดียว) ฉันรู้ว่ามันไม่เหมาะ แต่เป็นการตัดสินใจของฝ่ายบริหารในการใช้ระบบ VCS ที่แตกต่างกัน

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

@philosodad: หากผู้อื่นดึงรหัสจากที่เก็บของฉันโดยไม่ทราบสถานะของรหัสนั้นก็ยังสามารถทำให้เกิดความเสียหาย ความแตกต่างเพียงอย่างเดียวคือความรับผิดชอบของใคร และรหัสของฉันไม่สามารถใช้ได้เสมอ ยังคงขึ้นอยู่กับว่าระบบของฉันได้รับการกำหนดค่าสำหรับการเข้าถึงจากภายนอกหรือไม่
Bart van Ingen Schenau

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

1
@philosodad: ฉันคิดว่าฉันเริ่มเข้าใจดีขึ้นและดีขึ้น: ทุกคนสามารถทำให้เป็นระเบียบได้เช่นเดียวกับใน CVCS แต่ไม่ใช่ความผิดของคุณอีกต่อไปเพราะคุณไม่ได้ผลักดันพวกเขา :-)
Bart van Ingen Schenau

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