अगर मैं उन्हें सही ढंग से समझता हूं (और मैं प्रत्येक पर एक विशेषज्ञ से बहुत दूर हूं) तो वे मौलिक रूप से प्रत्येक का एक अलग दर्शन है। मैंने पहली बार 9 महीने के लिए मर्क्यूरियल का इस्तेमाल किया था। अब मैंने 6 के लिए git का उपयोग किया है।
hg संस्करण नियंत्रण सॉफ्टवेयर है। यह मुख्य लक्ष्य सॉफ्टवेयर के एक टुकड़े के संस्करणों को ट्रैक करना है।
git एक टाइम बेस्ड फाइल सिस्टम है। फ़ाइल सिस्टम में एक और आयाम जोड़ना लक्ष्य है। अधिकांश में फ़ाइलें और फ़ोल्डर हैं, गिट समय जोड़ता है। यह एक VCS के रूप में अपने डिजाइन के एक अनुत्पादक के रूप में भयानक काम करने के लिए होता है।
Hg में, पूरे प्रोजेक्ट का एक इतिहास है जिसे वह हमेशा बनाए रखने की कोशिश कर रहा है। डिफ़ॉल्ट रूप से मेरा मानना है कि hg पुश और पुलिंग करते समय सभी उपयोगकर्ताओं द्वारा सभी ऑब्जेक्ट में सभी परिवर्तन चाहता है।
Git में वस्तुओं का एक पूल है और ये ट्रैकिंग फाइलें (शाखाएं / प्रमुख) जो यह निर्धारित करती हैं कि उन वस्तुओं में से कौन सा सेट किसी विशेष अवस्था में फाइलों के पेड़ का प्रतिनिधित्व करता है। जब धक्का देने या खींचने से केवल उन विशेष शाखाओं के लिए आवश्यक वस्तुओं को भेजा जाता है जिन्हें आप धक्का दे रहे हैं या खींच रहे हैं, जो सभी वस्तुओं का एक छोटा सा उप-समूह है।
जहां तक गिट की बात है तो "1 प्रोजेक्ट" नहीं है। आपके पास एक ही रेपो में 50 परियोजनाएं हो सकती हैं और देखभाल नहीं होगी। हर एक को एक ही रेपो और लाइव फाइन में अलग से प्रबंधित किया जा सकता है।
एचजी की शाखाओं की अवधारणा मुख्य परियोजना से बाहर की शाखाएं हैं या शाखाओं से दूर शाखाएं आदि। Git की ऐसी कोई अवधारणा नहीं है। Git में एक शाखा सिर्फ पेड़ की एक अवस्था है, सब कुछ git में एक शाखा है। कौन सी शाखा आधिकारिक है, वर्तमान है, या नवीनतम का कोई अर्थ नहीं है।
मुझे नहीं पता कि इसका कोई मतलब है। अगर मैं चित्र खींच सकता हूँ hg इस तरह लग सकता है जहाँ प्रत्येक कमिट a हैo
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
एक एकल वृक्ष जिसकी जड़ें और शाखाएँ निकलती हैं। जबकि git ऐसा कर सकता है और अक्सर लोग इसका उपयोग उस तरीके से करते हैं जो लागू नहीं होता है। एक git तस्वीर, अगर ऐसी कोई चीज है, तो आसानी से ऐसा दिख सकता है
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
वास्तव में कुछ मायनों में यह भी समझ में नहीं आता है कि शाखाओं को दिखाने के लिए।
एक बात जो चर्चा के लिए बहुत ही भ्रामक है, वह और मस्त दोनों एक "शाखा" कहा जाता है, लेकिन वे दूर एक ही चीजें नहीं हैं। मर्क्यूरियल में एक शाखा तब आती है जब विभिन्न रिपोज के बीच संघर्ष होते हैं। Git में एक शाखा जाहिरा तौर पर hg में एक क्लोन के समान है। लेकिन एक क्लोन, जबकि यह समान व्यवहार दे सकता है निश्चित रूप से समान नहीं है। मुझे क्रोम बनाम रेपो का उपयोग करके git बनाम hg में इन पर विचार करने पर विचार करें जो कि बड़ा है।
$ 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 क्लोन वास्तव में git-new-workdir के समान है। वे दोनों लगभग पूरी तरह से नया काम कर रहे हैं जैसा कि आपने टाइप किया था cp -r project project-clone
। यह गिट में एक नई शाखा बनाने जैसा नहीं है। यह अधिक भारी वजन है। अगर hg में git की ब्रांचिंग का सच बराबर है तो मुझे नहीं पता कि यह क्या है।
मैं कुछ स्तर एचजी पर समझते हैं और Git सकता है इसी तरह की बातें करते हैं करने में सक्षम हो। यदि ऐसा है तो वर्कफ़्लो में अभी भी एक बड़ा अंतर है जो वे आपको ले जाते हैं। 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 शाखाएं बनाई गई, प्रत्येक को एक शाखा कहा जाता है जिसे मास्टर कहा जाता है। (मुझे यकीन है कि 2 के बजाय उन 1 पंक्ति को बनाने के लिए कुछ रास्ता है)
अब एक पर काम करने के लिए मैं बस करता हूं
git checkout fix-game-save-bug
और काम करना शुरू करें। प्रतिबद्ध चीजें, आदि भी एक परियोजना में शाखाओं के बीच स्विच करना जितना बड़ा क्रोम लगभग तात्कालिक है। मैं वास्तव में नहीं जानता कि एचजी में ऐसा कैसे करें। यह मेरे द्वारा पढ़े गए किसी भी ट्यूटोरियल का हिस्सा नहीं है।
एक अन्य बड़ा अंतर। 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 के पास यह भी तय करने की आज्ञा है कि आप जिस फ़ाइल को चरण में कॉपी करना चाहते हैं, उसी फ़ाइल में कौन सी विशेष लाइनें हैं ताकि आप उन कमिट्स को अलग-अलग भी विभाजित कर सकें। आप ऐसा क्यों करना चाहते हो? क्योंकि जैसा कि अलग-अलग होता है, दूसरे लोग केवल वे ही खींच सकते हैं जो वे चाहते हैं या अगर कोई मुद्दा था तो वे केवल उस प्रतिबद्ध को वापस कर सकते हैं जिसके पास मुद्दा था।