अधिकांश सामान्य मर्क्यूरियल कमांड के समतुल्य Git?


89

मैं Mercurial का उपयोग कर रहा हूं, लेकिन Git का त्वरित प्रदर्शन करना चाहता हूं।

Git समकक्ष क्या हैं:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

3
मैं कम से कम लोकप्रिय DVCSes के बीच सभी समतुल्य आदेशों को दर्शाने वाली एक तालिका को देखने के लिए उत्सुक होगा, अगर किसी को यहाँ एक उत्तर के साथ आने के दौरान कोई भी होता है। मुझे त्वरित Google खोज में एक नहीं मिला।
मार्क रस्साकॉफ़

जवाबों:


104

गिट-एचजी रोसेट्टा पत्थर खराब नहीं है

वहाँ उल्लेख नहीं दोनों के बीच कुछ अन्य गोत्र हैं। जब मैं दूसरे रास्ते पर गया (git -> hg) तो यह सूची मेरे ही ब्लॉग पोस्ट से क्राइब की गई थी।

एचजी .hgignore , वाक्यविन्यास: ग्लिट, जीआईटी के समान व्यवहार है।

Git .git/config , ~/.gitconfig, उपयोग Git-config मूल्यों को संशोधित करने के
एचजी .hg/hgrc , ~/.hgrc, उपयोगhg help -c config

जीआईटी git commit -v<br> एचजी hg diff | less; hg commit

जीआईटी gitk<br> एचजी hg view, or thg from [TortoiseHg][1]

Git git gui<br> Hg Mercurial केवल परिवर्तन hg recordकमांड का चयन करने के लिए GUI जहाज नहीं करता है ।

Git git rebase<br> Hg hg rebase । के लिए git rebase --interactiveवहाँ एचजी histedit , या मर्क्युरियल कतार

जीआईटी git push URL ; git remote add origin URL<br> एचजी hg push URL; $EDITOR .hg/hgrc ; [paths] default = URL

जीआईटी gitk, git log origin/master..HEAD<br> एचजी hg outgoing

जीआईटी git format-patch RANGE<br> एचजी hg email -m filename -o

Git git add . ; नोट डॉट
Hg hg add ; नहीं डॉट की जरूरत है।

जीआईटी git checkout REVISION-KEY<br> एचजी hg update CHANGESET


बस रिक्त स्थान को भरने के लिए, Mercurial से कुछ सबसे उपयोगी कमांड:

एचजी hg record
गिट git add -p; git commit

Hg hg inc [URL]
Git कोई वास्तविक समकक्ष नहीं है। आप केवल इसके बराबर कर सकते हैंhg pull; hg log -r .:

Hg hg out URL
Git कृपया यदि आप जानते हैं कि कैसे जोड़ते हैं।

मर्ज संघर्ष समाधान के लिए, hg resolveMercurial में कमांड के पास कुछ विकल्प हैं जो व्यवहार को बदलते हैं:

एचजी hg resolve -m FILE (फाइल को संघर्ष समस्या को मैन्युअल रूप से ठीक करके हल किया गया है के रूप में चिह्नित करता है)
Git git add FILE

hg resolve -u FILEफ़ाइल को अस्थिर करने के लिए Hg फ़ाइल को अनसुलझे
Git git reset HEAD FILE के रूप में चिह्नित करता है

Hg hg resolve -l (सूचियों को हल किए गए / अनसुलझे संघर्षों के साथ सूचीबद्ध करता है)
Git git status - वे फाइलें जो सफाई से विलीन हो जाती हैं, उन्हें स्वचालित रूप से अनुक्रमणिका में जोड़ दिया जाता है, जिनके टकराव नहीं होते हैं

एचजी hg resolve FILE (किसी मर्ज के बाद, फिर से मर्ज करने का प्रयास फाइल)
Git नहीं के लिए बराबर फिर से विलय है कि मैं के बारे में पता।


4
शायद यह एक विकी होना चाहिए।
कीयो

1
Gitk के लिए Mercurial, hgview (ध्यान दें कि यह "hg view" कमांड से अलग है) के लिए एक ग्राफिकल क्लोन है
टोनिस्ब्रियन

1
एक छोटा सुझाव: Hg और Git टेक्स्ट को चारों ओर स्वैप करना (जैसा कि यह Mercurial उपयोगकर्ताओं के लिए Git है)
क्रिस S

1
हालांकि hg recordबहुत उपयोगकर्ता के अनुकूल नहीं है, hg crecord( क्रेकॉर्ड एक्सटेंशन से ) एक शाप आधारित पाठ यूआई है जो उपयोग करने के लिए बेहद आसान है।
डेनिल्सन सा मैया

1
@ ozzy432836 मैंने वर्षों से एचजी का उपयोग नहीं किया है, लेकिन मुझे लगता है कि वे संकल्प समकक्ष हैं। एफडब्ल्यूआईडब्ल्यू की डिफ़ॉल्ट कार्रवाई hg resolveउन कारणों में से एक है जो मैं पसंद करता हूं। hg resolveयदि आप इसे बिना किसी तर्क के पास कर देते हैं, तो डिफ़ॉल्ट रूप से आपके अच्छे से हल किए गए मर्ज को नष्ट कर देता है!
ऋचीक

48

नोट: Git और Mercurial के बीच सबसे बड़ा अंतर सूचकांक या स्टेजिंग क्षेत्र की स्पष्ट उपस्थिति है ।

Git उपयोगकर्ता के लिए Mercurial से :

Git एकमात्र ऐसा डिस्ट्रीब्यूटेड एससीएम है जो इंडेक्स या स्टेजिंग क्षेत्र की अवधारणा को उजागर करता है। अन्य इसे लागू और छिपा सकते हैं, लेकिन किसी अन्य मामले में उपयोगकर्ता को पता नहीं है और न ही इससे निपटना है।

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

यदि आप सूचकांक से निपटने में असहज महसूस करते हैं, तो आप बेहतर के लिए स्विच कर रहे हैं ;-)


चाल है, आपको वास्तव में पूरी तरह से गिट का फायदा उठाने के लिए सूचकांक को समझने की आवश्यकता है। मई 2006 का यह लेख हमें फिर याद दिलाता है (और यह अब भी सच है):

"यदि आप सूचकांक से इनकार करते हैं, तो आप वास्तव में खुद को इनकार करते हैं।"

अब, उस लेख में कई कमांड शामिल हैं जो अब उपयोग करने के लिए सरल हैं (इसलिए इसकी सामग्री पर बहुत अधिक भरोसा नहीं करते हैं;)), लेकिन सामान्य विचार बना रहता है:

आप एक नई सुविधा पर काम कर रहे हैं और एक फ़ाइल पर मामूली संशोधन करना शुरू करते हैं।

# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile

इस बिंदु पर, आपकी अगली प्रतिबद्धता वर्तमान शाखा में 2 मामूली संशोधनों को लागू करेगी

# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work

$ git commit

केवल इस बिंदु पर मचान क्षेत्र (सूचकांक) में जोड़े गए परिवर्तनों को रिकॉर्ड करता है, न कि वर्तमान में आपके कार्य निर्देशिका में दिखाई देने वाले प्रमुख परिवर्तन।

$ git branch newFeature_Branch
$ git add myFile

अगली प्रतिबद्धताओं में नई शाखा 'newFrature_Branch' में अन्य सभी बड़े बदलाव दर्ज किए जाएंगे।

अब, अंतःक्रियात्मक रूप से या यहाँ तक कि एक विभाजन को जोड़ने पर भी मरक्यूरियल के साथ उपलब्ध सुविधाएँ हैं, ' hg record' कमांड या अन्य एक्सटेंशन के माध्यम से : आपको स्थापित करने की आवश्यकता होगी RecordExtension, या CrecordExtension
लेकिन यह मर्क्यूरियल के लिए सामान्य वर्कफ़्लो का हिस्सा नहीं है।

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


tonfa (प्रोफ़ाइल में: "Hg dev, pythonist": आंकड़े ...) टिप्पणियों में,

सूचकांक में मौलिक रूप से "git-ish" कुछ भी नहीं है, hg एक सूचकांक का उपयोग कर सकता है यदि इसे मूल्यवान माना जाता था, वास्तव में mqया shelveपहले से ही इसका हिस्सा है।

ओह यार। चलो हम फिरसे चलते है।

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

सूचकांक वास्तव में सामने है और केंद्र जिस तरह से लिनुस टॉर्वाल्ड्स वीसीएस के साथ काम करता है :

पहला मर्ज करने से पहले ही, Git ने 1 दिन से स्पष्ट सूचकांक अपडेट का उपयोग किया। यह बस कैसे मैं हमेशा काम किया है। मेरे पास गंदे पेड़ हैं, मेरे पेड़ में कुछ बेतरतीब पैच हैं जिन्हें मैं कमिट नहीं करना चाहता, क्योंकि यह अगले संस्करण के लिए एक मेकफाइल अपडेट है

अब सूचकांक का संयोजन (जो केवल Git में देखी गई धारणा नहीं है), और "कंटेंट इज किंग" प्रतिमान इसे बहुत अनूठा और "गिट-ईश" बनाता है :

git एक कंटेंट ट्रैकर है , और एक फ़ाइल नाम का तब तक कोई अर्थ नहीं है जब तक कि उसकी सामग्री से संबंधित न हो। इसलिए, गिट ऐड फाइलनाम के लिए एकमात्र समझदार व्यवहार फ़ाइल की सामग्री के साथ-साथ इसके नाम को सूचकांक में जोड़ना है।

नोट: "सामग्री", यहाँ, इस प्रकार परिभाषित किया गया है :

Git का सूचकांक मूल रूप से बहुत अधिक परिभाषित किया गया है

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

तो तुम सच में करना चाहिए के रूप में सूचकांक को देखने जा रहा है सामग्री

सामग्री "फ़ाइल नाम" या अलग-अलग भागों के रूप में "फ़ाइल सामग्री" नहीं है। आप वास्तव में दोनों को अलग नहीं कर सकते
अपने स्वयं के फ़ाइलनामों का कोई मतलब नहीं है (उनके पास फ़ाइल सामग्री भी है), और अपने आप फ़ाइल सामग्री समान रूप से संवेदनहीन है (आपको यह जानना होगा कि उस तक कैसे पहुंचा जाए)।

मैं जो कहना चाहता हूं, वह यह है कि मौलिक रूप से आपको इसकी सामग्री के बिना फ़ाइल नाम देखने की अनुमति नहीं है। पूरी धारणा पागल है और मान्य नहीं है। इसकी "वास्तविकता" के लिए कोई प्रासंगिकता नहीं है।

से पूछे जाने वाले प्रश्न , मुख्य लाभ हैं:

  • एक अच्छा दानेदारता के साथ
  • आप अपने पेड़ में एक लंबे समय के लिए एक uncommited संशोधन रखने में मदद करते हैं
  • एक प्रतिबद्ध के लिए कई छोटे चरणों को पूरा करने, जाँच क्या आप के साथ किया था git diff, और के साथ एक छोटा कदम मान्य git addया git add -u
  • मर्ज संघर्ष के उत्कृष्ट प्रबंधन की अनुमति देता है: git diff --base, git diff --ours, git diff --theirs
  • git commit --amendयदि सूचकांक को इस बीच संशोधित नहीं किया गया है तो केवल लॉग संदेश में संशोधन करने की अनुमति देता है

मुझे व्यक्तिगत रूप से लगता है कि यह व्यवहार डिफ़ॉल्ट नहीं होना चाहिए, आप चाहते हैं कि लोग ऐसा कुछ परीक्षण करें या कम से कम संकलित करें

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


1
सूचकांक में मौलिक रूप से "git-ish" कुछ भी नहीं है, hg एक सूचकांक का उपयोग कर सकता है यदि इसे मूल्यवान समझा जाता है, वास्तव में mq या शेल्व पहले से ही इसका हिस्सा है। मुझे लगता है कि इस व्यवहार को डिफ़ॉल्ट नहीं होना चाहिए, आप चाहते हैं कि लोग ऐसा कुछ परीक्षण करें या कम से कम संकलित करें।
टोनफा

2
Git अनुक्रमणिका में क्या है, इसके बारे में देखें stackoverflow.com/questions/4084921/…
VONC

मर्क्यूरियल में आपकी आखिरी कमिट (पुश से पहले) गिट्स इंडेक्स की तरह काम करती है। आप इसे संशोधित कर सकते हैं, इसे वापस ले सकते हैं, प्रतिबद्ध संदेश बदल सकते हैं या इसे सार्वजनिक करने के चरण में बदलकर इसे अंतिम रूप दे सकते हैं।
रुस्लान Yushchenko

12

मर्क्युरियल:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

Git समकक्ष:

git init
git add -A
git commit -am "comment" # -a is not necessary along with the above add -A
git status

1
मैं और मुझे लगता है कि अधिकांश git उपयोगकर्ता) git add -uसे अधिक का उपयोग करते हैं -A; नई ट्रैक की गई फ़ाइलों के लिए -u सभी ट्रैक की गई फ़ाइलों के लिए परिवर्तन करेगा।
u0b34a0f6ae

3
लेकिन addremove नई अनपेक्षित फ़ाइलों को जोड़ता है :)
tonfa

3
मैं इससे सहमत नहीं है कि साथ git statusके बराबर है hg status। मैं Hg में नया हूँ और Gg के समान ही hg की स्थिति प्राप्त करने में कामयाब नहीं हुआ हूँ।
लियो लेपोल्ड हर्ट्ज़ '

1

यह लगभग समान है, Addremove के बिना:

git init # Start a project in the current directory
git status # Displays both changes and added/removed files
git commit -m "comment" # commit any uncommited changes

हालाँकि, ये कमांड्स हैं जिनका उपयोग आप अकेले काम करते समय करेंगे। आप में मिल साफ है जब आप के साथ अन्य लोगों के काम के साथ अपने परिवर्तन मर्ज करना चाहते सामान git pullऔर git pushसंबंधित आदेश, और।


और इसे बंद करने के लिए, "git show" ("git diff" के रूप में ही उपयोग करें) मेरा मानना ​​है कि यह देखने के लिए कि आपने पिछले कमिट से क्या बदला है।
PHLAK

2
"गिट शो" (कोई आर्ग के साथ) आपको अंतिम प्रतिबद्ध में परिवर्तन दिखाता है । "git diff" आपको अंतिम प्रतिबद्ध होने के बाद के बदलाव दिखाता है ।
डस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.