मर्क्यूरियल और गिट के बीच अंतर क्या है?


727

मैं कुछ समय के लिए विंडोज पर (msysGit के साथ) git का उपयोग कर रहा हूं और मुझे वितरित स्रोत नियंत्रण का विचार पसंद है। अभी हाल ही में मैं मर्क्यूरियल (hg) को देख रहा हूं और यह दिलचस्प लग रहा है। हालाँकि, मैं hg और git के बीच के अंतर के बारे में अपना सिर नहीं लपेट सकता।

क्या किसी ने जीआईटी और एचजी के बीच एक साथ-साथ तुलना की है? मुझे यह जानने में दिलचस्पी है कि एक प्रशंसक चर्चा में कूदने के बिना hg और git में क्या अंतर है।

जवाबों:


345

ये लेख मदद कर सकते हैं:

संपादित करें : मशहूर हस्तियों के लिए Git और Mercurial की तुलना एक प्रवृत्ति है। यहाँ एक और है:


1
"गेट बनाम मर्क्यूरियल प्लीज रिलैक्स" गंभीरता से पुराना है, हालांकि यह सवाल जितना पुराना है। हो सकता है कि यह प्रश्न हटा दिया जाए और अब फिर से खोला जाए कि दोनों टूल में 3+ साल की सुविधाएँ जोड़ी गई हैं।
gman

238

मैं मर्क्यूरियल पर काम करता हूं, लेकिन बुनियादी तौर पर मेरा मानना ​​है कि दोनों प्रणालियां समान हैं। वे दोनों एक ही सार के साथ काम करते हैं: स्नैपशॉट्स (परिवर्तन) की एक श्रृंखला जो इतिहास बनाती है। प्रत्येक परिवर्तनकर्ता जानता है कि यह कहां से आया है (माता-पिता का परिवर्तन) और कई बच्चे परिवर्तन कर सकते हैं। हाल ही में hg-git एक्सटेंशन Mercurial और Git के बीच एक दो-तरफ़ा पुल प्रदान करता है और इस बिंदु को दिखाता है।

इस इतिहास ग्राफ को बदलने के लिए Git का एक मजबूत ध्यान केंद्रित है (सभी परिणामों के साथ जो जोर देता है) जबकि मर्क्यूरियल इतिहास के पुनर्लेखन को प्रोत्साहित नहीं करता है, लेकिन यह वैसे भी करना आसान है और ऐसा करने के परिणाम ठीक वही हैं जो आपको उनसे होने की उम्मीद करनी चाहिए (वह है) , अगर मैं आपके पास पहले से मौजूद एक बदलाव को संशोधित कर दूं, तो आपका ग्राहक इसे नए रूप में देखेगा यदि आप मुझ से खींचते हैं)। तो मर्क्यूरियल में गैर-विनाशकारी आदेशों के प्रति पूर्वाग्रह है

हल्के वजन वाली शाखाओं के लिए, तब से मर्क्यूरियल ने कई शाखाओं के साथ रिपॉजिटरी का समर्थन किया है ..., हमेशा मुझे लगता है। कई शाखाओं के साथ गिट रिपॉजिटरी बिल्कुल वैसी ही हैं: एक एकल रिपॉजिटरी में विकास के कई अलग-अलग किस्में। इसके बाद Git इन स्ट्रैंड्स में नाम जोड़ता है और आपको इन नामों को दूरस्थ रूप से क्वेरी करने की अनुमति देता है। बुकमार्क मर्क्युरियल के लिए विस्तार स्थानीय नाम कहते हैं, और मर्क्युरियल 1.6 के साथ, आप इन बुकमार्क्स चारों ओर ले जाने के लिए जब आप / पुल धक्का कर सकते हैं ..

मैं लिनक्स का उपयोग करता हूं, लेकिन जाहिर तौर पर TortoiseHg विंडोज पर तेजी से और Git के बराबर (खराब विंडोज फाइल सिस्टम के बेहतर उपयोग के कारण) बेहतर है। Http://github.com और http://bitbucket.org दोनों ही ऑनलाइन होस्टिंग प्रदान करते हैं, Bitbucket में सेवा बढ़िया और उत्तरदायी है (मैंने जीथब को आजमाया नहीं है)।

मैंने मर्क्यूरियल को चुना क्योंकि यह साफ और सुरुचिपूर्ण लगता है - मुझे शेल / पर्ल / रूबी लिपियों द्वारा रखा गया था जो मुझे गिट के साथ मिला था। git-instaweb.shफ़ाइल पर एक नज़र लेने की कोशिश करें यदि आप जानना चाहते हैं कि मेरा क्या मतलब है: यह एक शेल स्क्रिप्ट है जो रूबी स्क्रिप्ट उत्पन्न करता है , जो मुझे लगता है कि एक वेबसर्वर चलाता है। शेल स्क्रिप्ट पहली रूबी स्क्रिप्ट लॉन्च करने के लिए एक और शेल स्क्रिप्ट उत्पन्न करती है। अच्छे उपाय के लिए, थोड़ा सा पर्ल भी है ।

मुझे वह ब्लॉग पोस्ट पसंद है जो जेम्स बॉन्ड और मैकगाइवर के साथ मर्क्यूरियल और गिट की तुलना करता है - मर्क्यूरियल किसी भी तरह से गिट की तुलना में कम महत्वपूर्ण है। यह मुझे लगता है, कि Mercurial का उपयोग करने वाले लोग इतनी आसानी से प्रभावित नहीं होते हैं। यह परिलक्षित होता है कि कैसे प्रत्येक प्रणाली लिनुस को "सबसे अच्छे मर्ज एवर!" के रूप में वर्णित करती है । Git में आप एक असंबद्ध भंडार के साथ विलय कर सकते हैं:

git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit

वे आज्ञाएँ मेरी आँख के लिए काफी रहस्यमय लगती हैं। मर्क्यूरियल में हम करते हैं:

hg pull --force <project-to-union-merge>
hg merge
hg commit

ध्यान दें कि मर्क्यूरियल कमांड कैसे सादे हैं और विशेष नहीं हैं - एकमात्र असामान्य चीज --forceध्वज है hg pull, जिसकी आवश्यकता है क्योंकि मर्क्यूरियल गर्भपात करेगा अन्यथा जब आप एक असंबंधित भंडार से खींचते हैं। यह इस तरह के अंतर हैं जो मर्क्यूरियल मुझे अधिक सुरुचिपूर्ण लगते हैं।


21
ध्यान दें कि TortoiseHg, Nautilus, लिनक्स पर सूक्ति फ़ाइल प्रबंधक के साथ भी काम करता है।
ओनली

4
रूबी लिपि तभी उत्पन्न होती है जब वह http वेबर, रूबी वेबसर्वर है।
वैकल्पिक

4
Git की तरह, Mercurial आपकी फ़ाइलों का स्नैपशॉट संग्रहीत करता है जब आप प्रतिबद्ध होते हैं। मैं इस बात से सहमत नहीं हूं कि नाम केवल Git की तरह एक अनुमानी के साथ ट्रैक किया जा सकता है, मॉडल में ऐसा कुछ भी नहीं है जो एक स्नैपशॉट में अतिरिक्त जानकारी जोड़ने का प्रस्ताव रखता है, उदाहरण के लिए, जानकारी का नाम बदलें। हम मर्क्यूरियल में करते हैं।
मार्टिन गिस्लर

63
git के साथ एक असंबंधित परियोजना को मिलाना (खींचना), आप बस कर सकते हैं git pull <url-of-project>:। आपके द्वारा उद्धृत किया गया मेल git (2005) के शुरुआती दिनों से है
knittl

5
knittl: आह, अच्छा, मुझे यह सुनकर खुशी हुई कि Git कम आर्कन हो रहा है। फिर भी, मुझे लगता है कि उदाहरण से पता चलता है कि सिस्टम कैसे अलग है जो हम सोचते हैं कि यह ठंडा है और Git मेरे लिए मर्क्यूरियल (लेकिन कोई और अधिक शक्तिशाली नहीं) की तुलना में अधिक निम्न-स्तर महसूस करता है।
मार्टिन गेइस्लर

73

Git एक प्लेटफॉर्म है, मर्क्यूरियल एक एप्लिकेशन है। Git एक संस्करणित फाइलसिस्टम प्लेटफ़ॉर्म है, जो बॉक्स में DVCS ऐप के साथ शिप करने के लिए होता है, लेकिन प्लेटफ़ॉर्म ऐप के लिए सामान्य है, यह अधिक जटिल है और इसमें केंद्रित ऐप की तुलना में मोटे किनारों हैं। लेकिन इसका मतलब यह भी है कि git का VCS बेहद लचीला है, और गैर-स्रोत-नियंत्रण चीजों की एक बड़ी गहराई है जो आप git के साथ कर सकते हैं।

यही अंतर का सार है।

Git को जमीन से सबसे अच्छा समझा जाता है - भंडार प्रारूप से। स्कॉट चाकोन की गिट टॉक इसके लिए एक उत्कृष्ट प्राइमर है। यदि आप यह जानने की कोशिश करते हैं कि बिना हुड के नीचे क्या हो रहा है, तो आप कुछ बिंदु पर भ्रमित हो जाएंगे (जब तक आप केवल बहुत ही बुनियादी कार्यक्षमता से चिपके नहीं)। यह बेवकूफ लग सकता है जब आप चाहते हैं कि आपके दैनिक प्रोग्रामिंग दिनचर्या के लिए एक डीवीसीएस है, लेकिन गिट की प्रतिभा यह है कि रिपॉजिटरी प्रारूप वास्तव में बहुत सरल है और आप गिट के पूरे ऑपरेशन को काफी आसानी से समझ सकते हैं।

कुछ और तकनीकी-उन्मुख तुलनाओं के लिए, सबसे अच्छा लेख जो मैंने व्यक्तिगत रूप से देखा है वे हैं डस्टिन सॉलिंग्स ':

उसने वास्तव में दोनों DVCS का बड़े पैमाने पर उपयोग किया है और उन दोनों को अच्छी तरह से समझता है - और पसंद को समाप्त कर दिया है।


78
मैंने अक्सर पढ़ा है कि लोग "प्लेटफ़ॉर्म" का उल्लेख कर रहे हैं, लेकिन यह एक सिद्धांत या सामान्य मिथक है क्योंकि इसमें एक बड़ा उदाहरण रन प्लेट के अलावा कुछ करने का है।
इयान किलिंग

@ इयान - अगर मैं गलत नहीं हूँ तो अप्टाना स्टूडियो ३ अपने आंतरिक अद्यतन प्रणाली के लिए इसका उपयोग करता है।
मैक

22
तो, संक्षेप में: मर्क्यूरियल एक खुला स्रोत वितरित संशोधन नियंत्रण प्रणाली है, और गिट एक जीवन शैली पसंद है।
टिम किटिंग

51

बड़ा अंतर विंडोज पर है। Mercurial को मूल रूप से समर्थित है, Git नहीं। आप github.com को bitbucket.org के साथ बहुत ही समान होस्टिंग प्राप्त कर सकते हैं (वास्तव में इससे भी बेहतर है कि आपको नि: शुल्क निजी भंडार मिलता है)। मैं थोड़ी देर के लिए msysGit का उपयोग कर रहा था लेकिन Mercurial में चला गया और इससे बहुत खुश था।


64
इसलिए "मूल रूप से" सही शब्द नहीं है, लेकिन यह विंडोज़ के तहत अच्छी तरह से समर्थित नहीं है, यह सुनिश्चित करने के लिए है।
इयान केलिंग

14
Windows पर एक बिंदु पर git समर्थित है। लेकिन यूनिकोड फ़ाइलनाम क्रॉस-प्लेटफ़ॉर्म का उपयोग करके देखें और देखें कि आपको क्या दर्द होता है।
क्रेग मैकक्वीन

@ क्रेग: यह एक मंच की कमी है। एक सक्षम मंच आपको एक उपयुक्त स्थान पर स्विच करने की अनुमति देगा। यदि आप utf-8 से चिपके रहते हैं, तो आप ज्यादातर ठीक रहेंगे सिवाय इसके कि मैक OS X में utf-8 का थोड़ा अलग सामान्यीकरण है, हालांकि, मुझे यकीन नहीं है कि अगर विंडोज़ आपको utf-8 का उपयोग करने देता है ...
Arafangion

23
विंडोज यूनिकोड का समर्थन करता है, हालांकि MS ने UTF-8 के बजाय अपने API में UTF-16 के लिए जाना चुना। इसके बावजूद, यह यूनिकोड क्रॉस-प्लेटफॉर्म का समर्थन करने के लिए काफी संभव होगा। एसवीएन ने उस समस्या को काफी अच्छी तरह से हल किया है। लेकिन यह फिलहाल एमएसजीगिट के विकास के लिए उच्च प्राथमिकता नहीं है। code.google.com/p/msysgit/issues/detail?id=80
क्रेग मैकक्वीन

38

यदि आप एक विंडोज डेवलपर हैं जो बेसिक डिस्कनेक्ट किए गए रिवीजन कंट्रोल की तलाश में हैं, तो Hg के साथ जाएं। मुझे Git को समझ से बाहर होना पड़ा जबकि Hg सरल और अच्छी तरह से विंडोज शेल के साथ एकीकृत था। मैंने Hg डाउनलोड किया और इस ट्यूटोरियल (hginit.com) का अनुसरण किया - दस मिनट बाद मेरे पास एक स्थानीय रेपो था और मैं अपने प्रोजेक्ट पर काम करने के लिए वापस आ गया था।


1
मैंने उसी ट्यूटोरियल का अनुसरण किया। यह निश्चित है।
नाथन

22

मुझे लगता है कि "मर्क्यूरियल बनाम गिट" के बारे में सबसे अच्छा विवरण है:

"गिट वेस्ले स्नेप्स है। मर्केलियल डेनजेल वाशिंगटन है"


14
कैसे है कि मदद करने के लिए माना जाता है? इसका मतलब यह है कि git अधिक मार्शल आर्ट प्रकार है?
fmuecke

20

वे लगभग समान हैं। सबसे महत्वपूर्ण अंतर, मेरे दृष्टिकोण से (मेरा मतलब है, कारण है कि मुझे एक डीवीसीएस को दूसरे पर चुनने के लिए मिला है) दो कार्यक्रमों की शाखाओं का प्रबंधन कैसे होता है।

एक नई शाखा शुरू करने के लिए, मर्क्यूरियल के साथ, आप बस रिपॉजिटरी को दूसरी निर्देशिका में क्लोन करते हैं और विकसित करना शुरू करते हैं। फिर, आप खींचते हैं और विलय करते हैं। गिट के साथ, आपको स्पष्ट रूप से उस नई विषय शाखा का नाम देना होगा जिसका आप उपयोग करना चाहते हैं, फिर आप उसी निर्देशिका का उपयोग करके कोडिंग शुरू करते हैं

संक्षेप में, मर्क्यूरियल में प्रत्येक शाखा को अपनी निर्देशिका की आवश्यकता होती है; git में आप आमतौर पर सिंगल डायरेक्टरी में काम करते हैं। मर्क्यूरियल में शाखाओं को बदलने का अर्थ है निर्देशिकाओं को बदलना; git में, इसका अर्थ है git को git चेकआउट के साथ निर्देशिका की सामग्री को बदलने के लिए कहना।

मैं ईमानदार हूं: मुझे नहीं पता कि क्या यह मर्क्यूरियल के साथ भी संभव है, लेकिन जब से मैं आमतौर पर वेब परियोजनाओं पर काम करता हूं, तो हमेशा एक ही निर्देशिका का उपयोग करने के साथ मुझे बहुत कंफर्टेबल लगता है, क्योंकि मुझे फिर से करने की आवश्यकता नहीं है। अपाचे को कॉन्फ़िगर करें और इसे पुनः आरंभ करें और मैं अपनी फाइलसिस्टम को हर बार मैं शाखा में नहीं डालूंगा।

संपादित करें: जैसा कि डेस्टन ने उल्लेख किया है, एचजी ने शाखाओं का नाम दिया है , जिन्हें एक एकल भंडार में संग्रहीत किया जा सकता है और डेवलपर को एक ही काम करने वाली प्रतिलिपि के भीतर शाखाओं को बदलने की अनुमति देता है। git शाखाएं बिल्कुल Mercurial नाम की शाखाओं के समान नहीं हैं, वैसे भी: वे स्थायी होती हैं और शाखाओं को दूर नहीं फेंकती हैं, जैसे git में। इसका मतलब है कि यदि आप प्रयोगात्मक कार्यों के लिए एक नामित शाखा का उपयोग करते हैं, भले ही आप इसे विलय न करने का निर्णय लेते हैं, तो यह भंडार में संग्रहीत किया जाएगा। यही कारण है कि Hg प्रयोगात्मक, कम-चलने वाले कार्यों के लिए क्लोन का उपयोग करने के लिए प्रोत्साहित करता है और लंबे समय से चल रहे कार्यों के लिए नामित शाखाओं, जैसे रिलीज़ शाखाएँ।

कारण है कि नामांकित शाखा पर बहुत सारे एचजी उपयोगकर्ता क्लोन के पूर्ववर्ती हैं, तकनीकी की तुलना में बहुत अधिक सामाजिक या सांस्कृतिक हैं। उदाहरण के लिए, एचजी के अंतिम संस्करणों के साथ, एक नामित शाखा को बंद करना और परिवर्तनों से मेटाडेटा को फिर से निकालना संभव है।

दूसरी तरफ, गिट "नामित शाखाओं" का उपयोग करने के लिए आमंत्रित करता है जो स्थायी नहीं होते हैं और प्रत्येक बदलाव पर मेटाडेटा के रूप में संग्रहीत नहीं होते हैं।

मेरे व्यक्तिगत दृष्टिकोण से, फिर, गिट का मॉडल नामित शाखाओं की अवधारणा से गहराई से जुड़ा हुआ है और एक शाखा के बीच स्विच करता है और दूसरा उसी निर्देशिका को वापस ले लेता है; एचजी नामित शाखाओं के साथ भी ऐसा कर सकता है, लेकिन फिर भी यह क्लोन के उपयोग को प्रोत्साहित करता है, जो मुझे व्यक्तिगत रूप से बहुत पसंद नहीं है।


6
यह कोई अंतर नहीं है; एचजी ने शाखाओं को भी नाम दिया है। हम क्लोन-शाखाओं के बजाय सामान्य विकास के दौरान हर समय उनका उपयोग करते हैं।
डेस्टन

2
AFAIK, Hg में नामित शाखा को प्रत्येक प्रतिबद्ध में मेटाडेटा संग्रहीत किया जाता है; मैं गलत हो सकता हूं, लेकिन मैंने पढ़ा है कि एक बार जब आप एक शाखा बनाते हैं, तो इसका मेटाडेटा प्रत्येक बदलाव में एम्बेड किया जाएगा और इतिहास का हिस्सा बन जाएगा। यह गिट के साथ एक बड़ा अंतर है। "क्लोन त्वरित प्रयोगों के लिए महान हैं, जहां आप एक शाखा का नाम रिकॉर्ड नहीं करना चाहते हैं, और नामित शाखाएं लंबी अवधि की शाखाओं के लिए अच्छी हैं" टिनीलल.com / 2wz39qx मैं अपने पोस्ट के साथ क्या कहना चाह रहा था कि गिट के मानक वर्कफ़्लो आपको आमंत्रित करते हैं एक एकल काम की नकल का उपयोग करने के लिए; एचजी मानक वर्कफ़्लो में क्लोन शामिल हैं, जो मेरी व्यक्तिगत आवश्यकताओं के अनुरूप नहीं हैं।
एरियलडो मार्टिनी

समानताओं / मतभेदों की एक अच्छी व्याख्या के लिए: Git & Hg में शाखाओं में बंटी, देखें: mercurial.selenic.com/wiki/GitConcepts#Branch_model
sampablokuper

2
hg में नामित शाखाएं git में शाखाओं की तरह कुछ भी नहीं हैं। एचजी में, एक सच्चा रास्ता है। सभी शाखाएं उस रास्ते से शाखाएं हैं। गिट में कोई एक सच्चा मार्ग नहीं है। उस राज्य में रेपो और पॉइंटर्स के बस अलग-अलग राज्य हैं। प्रत्येक शाखा एक अलग सूचक है। कौन सा पॉइंटर मुख्य उपयोग करने के लिए है। शाखाएँ सभी सहकर्मी हैं।
gman

17

Git और mercurial के बीच एक बड़ा अंतर है ; जिस तरह से प्रत्येक प्रतिबद्ध का प्रतिनिधित्व करते हैं। git स्नैपशॉट के रूप में कमिट्स का प्रतिनिधित्व करता है, जबकि मर्क्यूरियल उन्हें भिन्न के रूप में प्रस्तुत करता है ।

व्यवहार में इसका क्या अर्थ है? खैर, कई ऑपरेशन तेजी से काम करते हैं, जैसे कि किसी अन्य कमिट पर स्विच करना, कमिट्स की तुलना करना आदि, विशेष रूप से अगर ये कमिट दूर हैं।

AFAIK मर्क्यूरियल के दृष्टिकोण का कोई लाभ नहीं है।


29
कम जगह लेने में चेंजेसट (डिफरेंशियल) फायदा है। Git कम्प्रेशन का उपयोग करके कमिट के लिए उपयोग किए जाने वाले स्थान को ठीक करता है, लेकिन इसके लिए एक सामयिक स्पष्ट पुनर्संरचना चरण ("git pack") की आवश्यकता होती है।
क्वार्क

8
इसे अब 'गिट जीसी' कहा जाता है, लेकिन कचरा संग्रह के विभिन्न स्तर हैं, और गिट के हाल के संस्करणों में कुछ स्तरों को स्वचालित रूप से निष्पादित किया जाता है।
फेलिपक

6
वास्तव में मर्क्यूरियल स्नैपशॉट्स का उपयोग करता है
रॉनी

13
मैं 'स्नैपशॉट' और 'डिफरेंट' के बीच के अंतर को समझने में विफल रहता हूं। Hg और git स्टोर दोनों फाइल डेल्टास के समूह के रूप में आते हैं । वे डेल्टास जो भी पिछले संशोधन के आधार पर संबंधित SCM चुनता है। क्या आपको ऐसे नंबर मिले हैं जो बताते हैं कि आपके द्वारा बताए गए कार्यों के लिए वास्तव में तेजी है? किसी अन्य कमेटी को अपडेट करना, अपना अधिकांश समय काम करने वाले डायर को लिखता है, वैसे भी रेपो को पढ़ना नहीं।
केविन

2
'स्नैपशॉट बनाम' अलग-अलग अप्रासंगिक है। हालांकि रेपो को आंतरिक रूप से संग्रहीत किया जाता है, इसका कोई असर नहीं पड़ता कि उपयोगकर्ता क्या देखता है। Git और mercurial दोनों उपयोगकर्ता को 'स्नैपशॉट' के साथ प्रस्तुत करते हैं। कोई कारण नहीं है कि एक रिपॉजिटरी फॉर्मेट को उसी तरह से लागू किया जाए जैसे git को मर्क्यूरियल में नहीं जोड़ा जा सकता है, जैसा कि मेरा मानना ​​है कि बाज़ार ने किया था।
मार्क बूथ

11

कुछ भी तो नहीं। वे दोनों समान करते हैं, दोनों समान रूप से करते हैं। एकमात्र कारण आपको दूसरे पर एक चुनना चाहिए यदि आप एक परियोजना के साथ मदद करते हैं जो पहले से ही एक का उपयोग करता है ..

एक को चुनने के लिए अन्य संभावित कारण किसी एप्लिकेशन या सेवा जो केवल प्रणाली में से एक का समर्थन करता है .. उदाहरण के लिए, मैं बहुत ज्यादा की वजह से Git जानने के लिए चुना है GitHub ..


6
लगता है कि आपका जवाब बहुत व्यावहारिक था। :)
अरफांगियन


11

अगर मैं उन्हें सही ढंग से समझता हूं (और मैं प्रत्येक पर एक विशेषज्ञ से बहुत दूर हूं) तो वे मौलिक रूप से प्रत्येक का एक अलग दर्शन है। मैंने पहली बार 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 के पास यह भी तय करने की आज्ञा है कि आप जिस फ़ाइल को चरण में कॉपी करना चाहते हैं, उसी फ़ाइल में कौन सी विशेष लाइनें हैं ताकि आप उन कमिट्स को अलग-अलग भी विभाजित कर सकें। आप ऐसा क्यों करना चाहते हो? क्योंकि जैसा कि अलग-अलग होता है, दूसरे लोग केवल वे ही खींच सकते हैं जो वे चाहते हैं या अगर कोई मुद्दा था तो वे केवल उस प्रतिबद्ध को वापस कर सकते हैं जिसके पास मुद्दा था।


"गिट के पास यह भी तय करने की आज्ञा है कि आप उसी फ़ाइल में कौन सी विशेष पंक्तियों को स्टेज पर कॉपी करना चाहते हैं ताकि आप उन कमिट्स को अलग से भी विभाजित कर सकें।" ये आज्ञाएँ क्या हैं?
जेम्स मैकमोहन 3

1
@ नाम:: git add --patchदेखें linux.die.net/man/1/git-add या उपयोग git add -i, जैसे stackoverflow.com/questions/2372583/…
tanascius

@gman: गुरु की जांच करने और checkout -b <name>आपके साथ शाखा लगाने के बजाय आप git branch <name>इसे स्विच किए बिना एक नई शाखा बनाने के लिए उपयोग कर सकते हैं
tanascius

8

वर्जनकंट्रोलब्लॉग पर एक गतिशील तुलना चार्ट है जहां आप कई विभिन्न संस्करण नियंत्रण प्रणालियों की तुलना कर सकते हैं।

यहाँ git, hg और bzr के बीच तुलना तालिका है।


1
मर्क्यूरियल की जानकारी पूरी तरह से सही नहीं है: मर्क्यूरियल में "चाल या नाम बदलने के बाद बुद्धिमान विलय" है। वस्तुतः, इस का मतलब है कि अगर मैं नाम बदलने dir-a/foo.cके लिए dir-b/foo.cऔर काम करते रहना dir-b/foo.cहै, तो पर अपने काम dir-a/foo.cहो जाएगा सही ढंग से अपना काम एक पुल के बाद साथ विलय कर दिया।
मार्टिन गेइस्लर

Git के बारे में जानकारी (यह बेहतर SCM पहल की तुलना, IIRC से आती है ) कुछ स्थानों पर गलत या यहां तक ​​कि असावधान भी है।
जकुब नारबस्की

7

जब शाखाओं (विशेष रूप से अल्पकालिक वाले) के साथ काम करने की बात आती है तो काफी महत्वपूर्ण अंतर होते हैं।

यह इस लेख (BranchingExplained) में समझाया गया है जो Git के साथ Mercurial की तुलना करता है।


7

क्या आपकी परियोजना में कोई विंडोज-आधारित सहयोगी हैं?

क्योंकि अगर वहाँ हैं, Git-for-Windows GUI अजीब, मुश्किल, अमित्र लगता है।

इसके विपरीत, मर्क्यूरियल-ऑन-विंडोज एक नो-ब्रेनर है।


मुझे गिट पसंद है, लेकिन मुझे यहां सहमत होना होगा। Git में मंच और बेहतर प्रलेखन के साथ एक अच्छे कमांड लाइन है। मैं ख़ुशी से एक सकारात्मक खोल के साथ git कमांड का उपयोग करूँगा। हालाँकि विंडोज़ पर tortoiseHG बहुत अच्छा है, यह कई अलग-अलग टूल (तुलना से परे) के साथ एकीकृत होता है और इसमें सब-रेपो के लिए पूर्ण समर्थन होता है, और कई hg प्लगइन्स जैसे स्ट्रिप / mq
कीओ

कम से कम एक बहुत अच्छा विंडोज (और OS X + लिनक्स) Git GUI उपलब्ध है।
मोट

7

बिटबुकेट.ट के मर्क्यूरियल और जीथब के गिट के बीच नोटिस करने के लिए एक चीज है, मर्क्यूरियल में उतने निजी रिपोजिटरी हो सकते हैं, लेकिन जीथब आपको एक पेड अकाउंट में अपग्रेड करना होगा। तो, इसीलिए मैं बिटकॉइन के लिए जाता हूं जो मर्क्यूरियल का उपयोग करता है।


5

शायद ही कभी पिछले साल मैंने अपने उपयोग के लिए गिट और एचजी दोनों का मूल्यांकन किया था, और एचजी के साथ जाने का फैसला किया। मुझे लगा कि यह एक क्लीनर समाधान की तरह दिखता है, और उस समय अधिक प्लेटफार्मों पर बेहतर काम किया। यह ज्यादातर टॉस-अप था, हालांकि।

हाल ही में, मैंने git-svn और एक सबवर्सन क्लाइंट के रूप में कार्य करने की क्षमता के कारण git का उपयोग करना शुरू किया। इसने मुझे जीत लिया और मैं अब पूरी तरह से स्विच कर चुका हूं। मुझे लगता है कि यह थोड़ा अधिक सीखने की अवस्था है (विशेषकर यदि आपको इनसाइड्स के चारों ओर प्रहार करने की आवश्यकता है), लेकिन यह वास्तव में एक शानदार प्रणाली है। मैं उन दो तुलनात्मक लेखों को पढ़ने जा रहा हूं जो जॉन ने अभी पोस्ट किए हैं।


4
Hgsubversion पर एक नज़र डालें: bitbucket.org/durin42/hgsubversion । वर्तमान में इसे मर्क्यूरियल के विकास संस्करण की आवश्यकता है, लेकिन वे मर्क्यूरियल 1.3 के लिए एक रिलीज करेंगे, जो 1 जुलाई को होने वाली है।
मार्टिन गेइस्लर

4

मैं वर्तमान में एसवीएन से डीवीसीएस (अपने निष्कर्षों के बारे में ब्लॉगिंग करते हुए, मेरा पहला वास्तविक ब्लॉगिंग प्रयास ...) पर प्रवास करने की प्रक्रिया में हूं, और मैंने थोड़ा शोध (= googling) किया है। जहाँ तक मैं देख सकता हूँ आप दोनों पैकेजों के साथ अधिकांश काम कर सकते हैं। ऐसा लगता है कि git में कुछ और बेहतर या बेहतर उन्नत सुविधाएँ हैं, मुझे लगता है कि TortoiseHg के साथ विंडोज़ के साथ एकीकरण कुछ हद तक बेहतर है। मुझे पता है कि गित चीता भी है (मैंने दोनों की कोशिश की), लेकिन मर्क्यूरियल सॉल्यूशन केवल अधिक मजबूत लगता है।

यह देखकर कि वे दोनों ओपन-सोर्स (राइट?) हैं, मुझे नहीं लगता कि या तो महत्वपूर्ण विशेषताओं का अभाव होगा। अगर कुछ महत्वपूर्ण है, तो लोग इसके लिए कहेंगे, लोग इसे कोड करेंगे।

मुझे लगता है कि सामान्य प्रथाओं के लिए, Git और Mercurial पर्याप्त से अधिक हैं। उनके पास दोनों बड़ी परियोजनाएं हैं जो उनका उपयोग करती हैं (गिट -> लिनक्स कर्नेल, मर्क्यूरियल -> मोज़िला नींव परियोजनाएं, दोनों पाठ्यक्रम के अन्य लोगों के बीच), इसलिए मुझे नहीं लगता कि वास्तव में किसी चीज की कमी है।

यह कहा जा रहा है, मैं इस बारे में अन्य लोगों के बारे में क्या कहता हूं, मुझे इसमें दिलचस्पी है, क्योंकि यह मेरे ब्लॉगिंग के लिए एक महान स्रोत बना देगा;


1
हां, वे दोनों ओपन-सोर्स प्रोजेक्ट हैं।
मार्टिन गेइस्लर


3

मुझे लगता है कि यह उत्तर का एक हिस्सा नहीं है, लेकिन उस नोट पर, मुझे यह भी लगता है कि नेटबीन्स और एक्लिप्स जैसे प्लेटफार्मों के लिए स्थिर प्लगइन्स की उपलब्धता एक हिस्सा है जिसमें उपकरण कार्य के लिए बेहतर फिट है, या बल्कि, कौन सा उपकरण "आप" के लिए सबसे उपयुक्त है। यही है, जब तक कि आप वास्तव में इसे सीएलआई-वे नहीं करना चाहते।

दोनों ग्रहण (और इसके आधार पर सब कुछ) और नेटबीन्स में कभी-कभी रिमोट फाइल सिस्टम (जैसे एसएसएच) और फाइलों के बाहरी अपडेट के साथ समस्या होती है; जो अभी तक एक और कारण है कि आप जो भी चुनना चाहते हैं वह "मूल रूप से" काम करता है।

मैं इस प्रश्न का उत्तर अभी खुद देने की कोशिश कर रहा हूं .. और मैंने उम्मीदवारों को Git या Mercurial करने के लिए उकसाया है .. इस विषय पर उपयोगी जानकारी प्रदान करने के लिए आप सभी को बिना धार्मिक जाने के लिए धन्यवाद देता हूं।


2
+1, क्योंकि "सहज" अनुभव उन लोगों की तुलना में अधिक महत्वपूर्ण है जो इन चीजों के साथ काम नहीं करते हैं। आईडीई के लिए एक ठोस प्लगइन बहुत अंतर करता है।
e


2

यदि आप Mercurial और Git के प्रदर्शन की तुलना में रुचि रखते हैं, तो इस लेख पर एक नज़र डालें । निष्कर्ष यह है:

Git और Mercurial दोनों अच्छी संख्या में बदल जाते हैं लेकिन गति और भंडार आकार के बीच एक दिलचस्प व्यापार बंद कर देते हैं। जोड़ और संशोधनों के साथ मर्क्यूरियल तेज है और एक ही समय में रिपोजिटरी ग्रोथ को नियंत्रण में रखता है। गिट भी तेज है, लेकिन इसका रिपॉजिटरी संशोधित फ़ाइलों के साथ बहुत तेज़ी से बढ़ता है जब तक कि आप दोहराते नहीं हैं - और वे रिपॉजिट बहुत धीमे हो सकते हैं। लेकिन पैक्ड रिपॉजिटरी मर्क्यूरियल की तुलना में बहुत छोटी है।


2

व्यापारिक वेबसाइट में दो प्रणालियों के बीच समानता और अंतर का एक बड़ा विवरण है, जो शब्दावली और अंतर्निहित अवधारणाओं के अंतर को समझाता है। एक लंबे समय के उपयोगकर्ता के रूप में, इसने वास्तव में मेरी मर्क्यूरियल मानसिकता को समझने में मदद की।


2

यदि आप SVN से माइग्रेट कर रहे हैं, तो Mercurial का उपयोग करें क्योंकि इसका सिंटैक्स SVN उपयोगकर्ताओं के लिए अधिक समझने योग्य है। इसके अलावा, आप या तो गलत नहीं कर सकते। लेकिन उनमें से एक का चयन करने से पहले जीआईटी ट्यूटोरियल और एचजीआईएनटी देखें



1

कुछ लोग सोचते हैं कि वीसीएस सिस्टम को जटिल बनाना पड़ता है। वे क्षेत्र पर खोज की शर्तों और अवधारणाओं को प्रोत्साहित करते हैं। वे शायद सोचते होंगे कि इस विषय पर कई पीएचडी दिलचस्प होंगे। उनमें से शायद वे हैं जिन्होंने गिट डिजाइन किया।

मर्क्यूरियल को एक अलग मानसिकता के साथ डिज़ाइन किया गया है। डेवलपर्स को वीसीएस के बारे में अधिक परवाह नहीं करनी चाहिए, और उन्हें इसके बजाय अपने मुख्य कार्य पर अपना समय बिताना चाहिए: सॉफ्टवेयर इंजीनियरिंग। मर्क्यूरियल उपयोगकर्ताओं को किसी भी गैर-वसूली योग्य गलतियों को किए बिना सिस्टम का उपयोग करने और खुशी से दुरुपयोग करने की अनुमति देता है।

किसी भी पेशेवर उपकरण को स्पष्ट रूप से डिज़ाइन और सहज सीएलआई के साथ आना चाहिए। मर्क्यूरियल उपयोगकर्ता बिना किसी अजीब विकल्प के सरल कमांड जारी करके अधिकांश काम कर सकते हैं। गेट डबल डैश में, पागल विकल्प आदर्श हैं। यदि आप सीएलआई व्यक्ति हैं (और किसी भी स्वाभिमानी सॉफ्टवेयर इंजीनियर को होना चाहिए) तो मर्क्यूरियल का पर्याप्त लाभ होता है।

एक उदाहरण देने के लिए, मान लीजिए कि आप गलती करते हैं। आप कुछ फ़ाइलों को संपादित करना भूल गए। पूर्ववत करने के लिए आप बस मर्क्यूरियल में कार्रवाई करते हैं:

$ hg rollback

फिर आपको एक संदेश मिलता है कि सिस्टम आपके अंतिम लेन-देन को पूर्ववत कर रहा है।

Git में आपको टाइप करना होगा:

$ git reset --soft HEAD^

तो ठीक है मान लीजिए कि आपके पास एक विचार है कि रीसेट किस बारे में है। लेकिन इसके अलावा आपको यह जानना होगा कि "--soft" और "-हार्ड" रीसेट क्या हैं (कोई सहज अनुमान?)। ओह और अंत में '^' चरित्र को मत भूलना! (अब रिची का नाम क्या है ...)

3 पार्टी टूल्स जैसे kdiff3 और मेल्ड के साथ मर्क्यूरियल का एकीकरण बहुत बेहतर है। अपने पैच उत्पन्न करें ज्यादा उपद्रव के बिना अपनी शाखाओं को मर्ज करें। मर्क्यूरियल में एक सरल http सर्वर भी शामिल है जिसे आप टाइप करके सक्रिय करते हैं

hg serve

और दूसरों को अपने भंडार को ब्राउज़ करने दें।

लब्बोलुआब यह है, Git वह करता है जो मर्क्यूरियल करता है, बहुत अधिक जटिल तरीके से और एक दूर हीन CLI के साथ। यदि आप अपनी परियोजना के VCS को वैज्ञानिक-अनुसंधान क्षेत्र में बदलना चाहते हैं तो Git का उपयोग करें। यदि आप वीसीएस की नौकरी पाना चाहते हैं तो मर्क्यूरियल का उपयोग करें, इसके बारे में ज्यादा ध्यान दिए बिना अपने वास्तविक कार्यों पर ध्यान केंद्रित करें।


1
वास्तव में आप कमांड को git में बदल सकते हैं , जो CLI को उपयोग करने के लिए कम जटिल बनाता है। इस SuperUser (StackExchange) प्रश्न में इनका एक समूह है ।
स्पिकाइ

1
सचमुच, आप कुछ सामान्य कार्यों से निपटने के लिए शेल स्क्रिप्ट भी लिख सकते हैं। आखिरकार आपको एहसास होता है कि आप एक वीसीएस से निपटने के लिए एक रैपर सीएलआई का निर्माण कर रहे हैं जिसमें एक बुरी तरह से डिज़ाइन किया गया और काउंटर-सहज सीएलआई है। और यह केवल इतना ही नहीं है। Git संदिग्ध प्रयोज्य के साथ अवधारणाओं का एक बहुत बड़ा गुच्छा पेश करता है जिसे उपयोगकर्ता अंततः प्रलेखन और सीएलआई संदेशों के साथ सहज महसूस करने के लिए सीखने और समझने के लिए मजबूर होता है।
कोस्टास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.