2009-10-27 11 views
32

अपने प्रयोगों में मैंक्या Git के बीच का अंतर --hard रीसेट और Git --merge

git reset --hard 

और

git reset --merge 

उपयोग के बीच किसी भी कार्यात्मक अंतर ढूँढने में सक्षम नहीं किया गया है रीसेट या तो

--hard    reset HEAD, index and working tree 
--merge    reset HEAD, index and working tree 

मैं नियमित रूप से इतना understan --hard विकल्प का उपयोग निर्देश किसी भी संकेत नहीं देते डी कैसे काम करता है। --merge और --hard विकल्पों के बीच क्या अंतर है?

चीयर्स, ऑली

शायद एक उदाहरण यहाँ मदद मिलेगी, के निम्न क्रम का उपयोग करते हैं: अगर मैं

git reset --merge 123abc 

कोशिश मैं

error: Entry 'file_one' not uptodate. Cannot merge. 
fatal: Could not reset index file to revision '123abc' 
मिल अब

cd git_repo 
touch file_one 
git add file_one 
git commit -m "commit one" # sha1 of 123abc 
echo "one" >> ./file_one 
git commit -a -m "commit two" # sha1 of 234bcd 
echo "two" >> ./file_one 
git add . # populate index with a change 
echo "three" >> ./file_one # populate working area with a change 

कारण यह है कि file_one जा रहा है मैं

git add . 
git reset --merge 123abc 

इस बार यह काम करता है, फिर भी, मैं git reset --hard रूप में एक ही परिणाम प्राप्त करने के दोनों कार्य क्षेत्र और सूचकांक

इसे ठीक करने के में परिवर्तन किया है। सूचकांक खाली है, कार्यक्षेत्र खाली है, file_one खाली है, क्योंकि यह पहली प्रतिबद्धता के बाद था।

कोई व्यक्ति इस अंतर को दर्शाने वाले चरणों के साथ आ सकता है?

उत्तर

26

git reset manpage से:

 
--hard Matches the working tree and index to that of the tree being 
       switched to. Any changes to tracked files in the working tree since 
       <commit> are lost. 

--merge 
       Resets the index to match the tree recorded by the named commit, and 
       updates the files that are different between the named commit and 
       the current commit in the working tree. 

git reset --mergegit reset --hard के सुरक्षित संस्करण करने के लिए है, जब अपने परिवर्तनों और किसी और परिवर्तन एक साथ मिश्रित कर रहे हैं, चारों ओर हमारे परिवर्तन ले जाने के लिए कोशिश कर रहा।

+1

मैंने उन दस्तावेज़ों को पढ़ा है, लेकिन कहना है कि मैं उनमें से अधिक समझ नहीं पा रहा हूं। "सूचकांक पेड़ नामित द्वारा दर्ज मिलान करने के लिए प्रतिबद्ध रीसेट करता है" मेरे समझ है कि सूचकांक रीसेट --merge ऑपरेशन के बाद खाली हो गया है है, इस टिप्पणी कुछ और इंगित करता है। "और नामित प्रतिबद्धता और काम करने वाले पेड़ में वर्तमान प्रतिबद्धता के बीच अलग-अलग फ़ाइलों को अपडेट करता है" इन फ़ाइलों में किए गए अपडेट कहां हैं, वे इंडेक्स में नहीं दिखते हैं, क्या वे स्वचालित रूप से प्रतिबद्ध होते हैं? – opsb

+1

'गिट रीसेट के बाद - 'आपके पास इंडेक्स == है, लेकिन यह केवल उन फ़ाइलों को अपडेट करता है जो काम में हैं, वे हैंड (वर्तमान प्रतिबद्धता) और (नामित प्रतिबद्ध) के बीच अलग हैं, आपके स्थानीय परिवर्तनों को संरक्षित करते हैं । –

+0

उदाहरण के ऊपर मैंने पाया है कि जब मैं कार्यक्षेत्र में परिवर्तन करता था तो मैं एक गिट रीसेट नहीं कर सकता था। क्या यह वास्तव में ऊपर दिखाए गए लोगों से अलग-अलग चरणों का उपयोग कर संभव है? – opsb

3
जाहिर है के अनुसार

:

http://www.kernel.org/pub/software/scm/git/docs/git-reset.html

--hard - काम कर पेड़ और पेड़ जा रहा है की है कि सूचकांक मेल करने लगे। <commit> के बाद से काम कर रहे पेड़ में ट्रैक की गई फ़ाइलों में कोई भी परिवर्तन खो गया है।

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

7

यह सहायक होता है जब आप काम करने वाले पेड़ में बदलाव के साथ खींचते हैं, और पाते हैं कि विलय की उम्मीद नहीं है (आप उम्मीद कर रहे थे कि काम उन फ़ाइलों को प्रभावित नहीं करेगा जिन पर आप काम कर रहे थे)। इस बिंदु पर, यदि आप git reset --hard ORIG_HEAD करते हैं, तो आप अपने स्थानीय परिवर्तनों सहित सब कुछ निकाल देते हैं। यदि आप git reset --merge ORIG_HEAD करते हैं, तो आप अपने स्थानीय परिवर्तनों को रखेंगे।

8

लेख "Git undo, reset or revert?" विभिन्न उपयोगों, जब ORIG_HEAD के साथ प्रयोग किया सार रखते हैं:

# Reset the latest successful pull or merge 
$ git reset --hard ORIG_HEAD 

# Reset the latest pull or merge, into a dirty working tree 
$ git reset --merge ORIG_HEAD 

manojlds के answer से उल्लेख किया है, और blog post द्वारा सचित्र, बाद विशेष रूप से उपयोगी है जब आप एक त्रुटि दिखाई संदेश की तरह:

fatal: You have not concluded your merge. (`MERGE_HEAD` exists) 

धागा "[PATCH] refuse to merge during a merge" भी विवरण है कि बिंदु:

git reset --merge HEAD 

यह बल्कि अलग मामले ऐसे हैं जिनमें worktree में कुछ अप्रतिबद्ध परिवर्तन के साथ एक साफ मर्ज किया भरता है, लेकिन फिर अप्रतिबद्ध परिवर्तनों को खोने के बिना फिर से मर्ज अभी नहीं करना चाहते।
बदलाव के अभाव में, आप बस --hard का प्रयोग करेंगे, लेकिन यहाँ आप जबकि उन पर विलय, क्या 'git checkout -m' चलती HEAD के लिए करता है के समान शाखा टिप ले जाना चाहते हैं।

संबंधित मुद्दे