ถ้าฉันเข้าใจพวกเขาอย่างถูกต้อง (และฉันยังห่างไกลจากผู้เชี่ยวชาญในแต่ละคน) พวกเขาพื้นฐานแต่ละคนมีปรัชญาที่แตกต่างกัน ฉันใช้ Mercurial เป็นครั้งแรกเป็นเวลา 9 เดือน ตอนนี้ฉันใช้คอมไพล์สำหรับ 6
hg เป็นซอฟต์แวร์ควบคุมเวอร์ชัน เป้าหมายหลักคือการติดตามซอฟต์แวร์รุ่นต่างๆ
git เป็นระบบไฟล์ตามเวลา เป้าหมายคือการเพิ่มส่วนข้อมูลอื่นลงในระบบไฟล์ ส่วนใหญ่มีไฟล์และโฟลเดอร์ git เพิ่มเวลา มันเกิดขึ้นกับการทำงานที่ยอดเยี่ยมเพราะ VCS เป็นผลพลอยได้จากการออกแบบ
ใน hg มีประวัติของโครงการทั้งหมดที่พยายามรักษาอยู่เสมอ ตามค่าเริ่มต้นฉันเชื่อว่า hg ต้องการการเปลี่ยนแปลงทั้งหมดในวัตถุทั้งหมดโดยผู้ใช้ทั้งหมดเมื่อกดและดึง
ในคอมไพล์มีเพียงกลุ่มของวัตถุและไฟล์ติดตามเหล่านี้ (สาขา / หัว) ที่กำหนดชุดของวัตถุเหล่านั้นที่แสดงถึงต้นไม้ของไฟล์ในสถานะเฉพาะ เมื่อผลักหรือดึง git ส่งเฉพาะวัตถุที่จำเป็นสำหรับสาขาเฉพาะที่คุณกำลังผลักหรือดึงซึ่งเป็นส่วนย่อยเล็ก ๆ ของวัตถุทั้งหมด
เท่าที่เกี่ยวข้องกับคอมไพล์ไม่มี "1 โครงการ" คุณสามารถมี 50 โครงการใน repo เดียวกันและคอมไพล์ไม่สนใจ แต่ละคนสามารถจัดการแยกต่างหากใน repo เดียวกันและอยู่ได้ดี
แนวคิดของสาขาของ Hg นั้นแตกต่างจากโครงการหลักหรือสาขาอื่น ๆ Git ไม่มีแนวคิดดังกล่าว สาขาในคอมไพล์เป็นเพียงสถานะของต้นไม้ทุกอย่างเป็นสาขาในคอมไพล์ สาขาใดเป็นทางการปัจจุบันหรือใหม่ที่สุดไม่มีความหมายในคอมไพล์
ฉันไม่รู้ว่ามันสมเหตุสมผลหรือไม่ ถ้าฉันวาดรูปได้ hg อาจมีลักษณะเช่นนี้ที่แต่ละการกระทำเป็นo
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
ต้นไม้ที่มีรากเดียวและกิ่งไม้หลุดออกมาจากมัน ในขณะที่คอมไพล์สามารถทำได้และบ่อยครั้งที่ผู้คนใช้ในวิธีที่ไม่ได้บังคับใช้ ภาพ git หากมีสิ่งนั้นสามารถมีลักษณะเช่นนี้ได้อย่างง่ายดาย
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
ในความเป็นจริงในบางวิธีมันไม่สมเหตุสมผลที่จะแสดงกิ่งก้านในคอมไพล์
สิ่งหนึ่งที่สับสนมากสำหรับการสนทนาคอมไพล์และ mercurial ทั้งสองมีสิ่งที่เรียกว่า "สาขา" แต่พวกเขาไม่ได้จากระยะไกลสิ่งเดียวกัน สาขา Mercurial เกิดขึ้นเมื่อมีข้อขัดแย้งระหว่าง repos ต่างกัน เห็นได้ชัดว่าสาขาในคอมไพล์คล้ายกับโคลนใน hg แต่การโคลนนิ่งในขณะที่มันอาจให้พฤติกรรมคล้าย ๆ กันนั้นไม่เหมือนกันแน่นอนที่สุด ลองพิจารณาฉันลองใช้ git กับ hg โดยใช้ chromium repo ซึ่งค่อนข้างใหญ่
$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'
real 0m1.759s
user 0m1.596s
sys 0m0.144s
และตอนนี้ใช้ hg ด้วยโคลน
$ time hg clone project/ some-clone/
updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real 0m58.196s
user 0m19.901s
sys 0m8.957
ทั้งสองอย่างนั้นร้อนจัด คือฉันวิ่งสองครั้งและนี่เป็นการวิ่งครั้งที่สอง hg clone เป็นจริงเหมือนกับ git-new-workdir ทั้งของผู้ที่ทำให้ dir cp -r project project-clone
ทำงานใหม่ทั้งหมดเกือบราวกับว่าคุณได้พิมพ์ มันไม่เหมือนกับการสร้างสาขาใหม่ในคอมไพล์ มันหนักกว่ามาก หากมีความจริงเทียบเท่ากับการแตกแขนงของคอมไพล์เป็น hg ฉันไม่รู้ว่ามันคืออะไร
ฉันเข้าใจในระดับ hg และ git บางอย่างอาจจะสามารถทำสิ่งที่คล้ายกัน ถ้าเป็นเช่นนั้นก็ยังมีความแตกต่างอย่างมากในกระบวนการทำงานที่พวกเขานำคุณไปสู่ ในคอมไพล์เวิร์กโฟลว์ทั่วไปคือการสร้างสาขาสำหรับทุกคุณสมบัติ
git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support
นั่นเพิ่งสร้าง 3 สาขาแต่ละสาขาแยกจากสาขาที่เรียกว่ามาสเตอร์ (ฉันแน่ใจว่ามีวิธีในการคอมไพล์เพื่อให้ 1 บรรทัดเหล่านั้นแทน 2)
ตอนนี้ที่จะทำงานกับคนที่ฉันเพิ่งทำ
git checkout fix-game-save-bug
และเริ่มทำงาน มอบสิ่งต่าง ๆ ฯลฯ สลับไปมาระหว่างสาขาแม้ในโครงการใหญ่เท่าโครเมี่ยมเกือบจะทันที จริง ๆ แล้วฉันไม่รู้ว่าจะทำยังไงใน hg มันไม่ได้เป็นส่วนหนึ่งของบทเรียนใด ๆ ที่ฉันได้อ่าน
อีกหนึ่งความแตกต่างที่ยิ่งใหญ่ เวทีของ Git
Git มีความคิดเกี่ยวกับเวทีนี้ คุณสามารถคิดว่ามันเป็นโฟลเดอร์ที่ซ่อนอยู่ เมื่อคุณส่งมอบสิ่งที่อยู่บนเวทีไม่ใช่การเปลี่ยนแปลงในแผนผังการทำงานของคุณ นั่นอาจฟังดูแปลก ๆ หากคุณต้องการที่จะส่งมอบการเปลี่ยนแปลงทั้งหมดในแผนผังการทำงานของคุณคุณจะต้องgit commit -a
เพิ่มไฟล์ที่ถูกแก้ไขทั้งหมดลงในสเตจแล้วยืนยันการเปลี่ยนแปลง
แล้วจุดของเวทีคืออะไร? คุณสามารถแยกการกระทำของคุณได้อย่างง่ายดาย จินตนาการว่าคุณได้แก้ไข joypad.cpp และ gamesave.cpp และคุณต้องการแยกมันออกจากกัน
git add joypad.cpp // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp // copies to stage
git commit -m "fixed game save bug"
Git มีคำสั่งในการตัดสินใจว่าบรรทัดใดในไฟล์เดียวกันที่คุณต้องการคัดลอกไปยังสเตจเพื่อให้คุณสามารถแยกการคอมมิทเหล่านั้นแยกกันได้เช่นกัน ทำไมคุณต้องการทำเช่นนั้น? เพราะในฐานะที่แยกจากกันผู้อื่นสามารถดึงได้เฉพาะสิ่งที่พวกเขาต้องการหรือหากมีปัญหาพวกเขาสามารถย้อนกลับได้เพียงการกระทำที่มีปัญหา