2015-04-25 8 views
7

मैं Stackoverflow पर लिंक का एक बहुत कुछ करने की कोशिश की/कहीं और ठीक से'गिट रीसेट - हार्ड मास्टर' और 'गिट रीसेट - हार्ड मूल/मास्टर`' के बीच क्या अंतर है?

git reset --hard option

के व्यवहार को समझने के लिए मुझे पता है कि:

  • यदि यह छोड़ दिया जाता है या अगर यह origin है, रीसेट पर किया जाता है origin
  • पर सबसे हालिया प्रतिबद्धता यदि कोई SHA1 हैश प्रदान किया गया है, तो संबंधित प्रतिबद्धता पर रीसेट किया जाता है।

मैं क्या समझ में नहीं आता निम्न मान रहे हैं:

  1. origin
  2. HEAD
  3. origin/master
  4. origin/branch

सभी वे यानी एक ही व्यवहार है लगता है एक बिंदु master पर नवीनतम प्रतिबद्धता।

कृपया बताएं कि ऊपर दिए गए सभी 4 मूल्य विकल्प का महत्व क्या है।

मैं यह भी जानना चाहूंगा कि मैं एक विशिष्ट शाखा में हूं या नहीं, मैं उस शाखा पर अंतिम प्रतिबद्धता को कैसे रीसेट कर सकता हूं? उदाहरण के लिए यदि मैं v1.2 पर हूं, origin/v1.2 अभी भी मुझे master पर नवीनतम प्रतिबद्धता पर ले जाता है।

उत्तर

10

सबसे पहले आपको यह समझने की आवश्यकता है कि शाखा और टैग नाम केवल हैश मानों के संकेतक हैं, जो एक ही प्रतिबद्धता का प्रतिनिधित्व करते हैं, यदि आप कहते हैं कि 4 विकल्प हैं जो समान व्यवहार करते हैं, तो पहला तार्किक उत्तर इसलिए है क्योंकि वे एक ही करने के लिए सभी बिंदु प्रतिबद्ध

  • origin मैं इस बारे में निश्चित नहीं हूँ, लेकिन मैं origin यह द्वारा आत्म origin/HEAD जो मैं अपने GitHub सेटिंग्स पर निर्भर जाने योग्य मानते हैं का समाधान हो जाएगा लगता है, GitHub में आप एक 'डिफ़ॉल्ट सेट शाखा ', origin/headorigin/[default_branch] को हल करेगा, आपके मामले में मैं इसे मास्टर मानता हूं, इसलिए यही कारण है कि origin/master

  • HEAD हमेशा कहते हैं करने के लिए वर्तमान के लिए प्रतिबद्ध है, एक तुम पर खड़े हैं, तो एक git reset --hard HEAD permenantly ट्रैक किए गए फ़ाइलों में सभी परिवर्तनों को हटा देगा और फ़ाइलों को परिवर्तन का मंचन किया, लेकिन हैश प्रतिबद्ध परिवर्तन नहीं।

  • origin/master पिछले है अपने पिछले के बाद से दूरदराज के मास्टर शाखा में प्रतिबद्ध लाने/खींच, हर बार जब आप master के लिए प्रतिबद्ध, अपने स्थानीय master अपडेट है और अपने origin/master भी अद्यतन किया जाता है, किसी और अपने रेपो master करना होगा धक्का अगर कोई विचार नहीं है कि एक अद्यतन है, जब तक कि आप git fetch नहीं करते हैं तो आपका origin/master आपके master से आगे बढ़ जाएगा, या यहां तक ​​कि यहां तक ​​कि अलग हो सकता है। इसलिए
    एक git reset --hard origin/master चल यदि आप वर्तमान में कर रहे हैं master शाखा पर हैं और masterorigin/master

  • origin/branch साथ सिंक में है मुझे यकीन है यह क्या प्रतिनिधित्व करता नहीं हूँ वहाँ डिफ़ॉल्ट रूप से कोई origin/branch है, क्योंकि वैसा ही प्रभाव पड़ेगा, मेरा अनुमान है कि आप एक शाखा branch बुलाया बनाया है और एक ही में होना अपने गुरु के रूप में प्रतिबद्ध, आप अपने सभी शाखाओं को देखने के लिए एक git branch करने का प्रयास कर सकते हैं पुष्टि करने के लिए, मैं तुम्हें एक मिल जाएगा बुलाया अनुमान लगा रहा हूँ होता branch

,210

विजुअल तरीके यह सब देखने के लिए, आप git log --graph --decorate --all चलाने की कोशिश कर सकता है या मैं gitk की तरह एक दृश्य उपकरण पसंद करते हैं, यदि आप स्थापित द्विआधारी आप gitk --all चल पाएंगे सभी शाखाओं को एक दूसरे

+1

'origin' के सापेक्ष को देखने के लिए कर सकते हैं 'gitrevisions (7)' में ' 'प्रविष्टि द्वारा समझाया जाए; यह पूरी तरह से 'refs/remotes/orig/HEAD' तक फैलता है। 'उत्पत्ति/मास्टर' 'refs/remotes/origin/master' तक फैलता है, और इसी तरह 'मूल/शाखा'' रेफ/रिमोट/मूल/शाखा 'तक विस्तारित होगा (जैसा कि आपने कहा था, यह मौजूद है)। – chepner

4

master, HEAD, origin/something और हो सकता है कुछ टैग, क्यों नहीं, एक ही करने के लिए सभी बिंदु प्रतिबद्ध हो सकता है, लेकिन वे निश्चित रूप से एक ही बात नहीं कर रहे हैं।

origin आमतौर पर remote repository का नाम होता है।

आप अपने रिमोट देख सकते हैं और git remote -v के साथ नए कॉन्फ़िगर कर सकते हैं।

इसे आजमाएं (-v के साथ) और यह शायद समझ में आ जाएगा।

remote/somebranch रिमोट रिपोजिटरी पर कुछ शाखाओं के प्रमुख को इंगित करता है।

origin/master पर master के प्रमुख को इंगित करता है।

क्या यह master जैसा ही है?

हां और नहीं। यदि आप अपनी मास्टर शाखा खींचते हैं, तो कुछ काम करें और इस बीच कोई और master पर चलता है और origin पर जाता है, तो वे अलग-अलग होंगे।

जब आप एक git fetch origin, तो, origin/master अतिरिक्त प्रतिबद्ध होगा करना (आगे हो जाएगा)।

HEAD बस "वर्तमान प्रतिबद्धता" है। इसे . के रूप में सोचें।

this question

देखें फिर, यह एक ही हो सकता है master के रूप में, लेकिन यदि आप किसी अन्य शाखा की जाँच या प्रतिबद्ध या एक रिबेस के बीच में हैं, ठीक है, यह नहीं है।

तो जिस पर किसी और काम कर रहा है एक ताजा भंडार पर इस कोशिश:

$ git checkout master 
$ git log -1 --format="%H" HEAD 
123abc 
$ git log -1 --format="%H" origin/master 
123abc 

वे एक ही कर रहे हैं!

$ git diff origin/master 

बेशक उनकी सामग्री एक जैसी है।

$ echo "foo" > foo 
$ git add foo 
$ git commit -m "Foo the thingy" 
$ git log -1 --format="%H" HEAD 
321bca 
$ git log -1 --format="%H" origin/master 
123abc 

आह, देखो, अब वे अलग-अलग हैं!

$ git push origin master 
$ git log -1 --format="%H" HEAD 
321bca 
$ git log -1 --format="%H" origin/master 
321bca 

और अब वे नहीं हैं! हमने अपनी नवीनतम प्रतिबद्धता को धक्का दिया है और वे दोनों एक ही इंगित करते हैं।

$ git checkout -b newbranch 
$ echo "baz" > baz 
$ git add baz 
$ git commit -m "Baz the thingy with the stuff" 
$ git branch -a 
    master 
* new_branch 
    origin/master 
$ git log -1 --format="%H" 
789def 
$ git log -1 --format="%H" master 
321bca 
git log -1 --format="%H" origin/master 
321bca 
git log -1 --format="%H" origin/new_branch 
unknown revision or path not in the working tree. 

बेशक नहीं। हम origin को new_branch धक्का दिया नहीं किया है, यह केवल हमारे स्थानीय मशीन

git checkout 123abc 

हम सिर्फ 123abc बाहर जाँच कर ली है, master की पुरानी सिर पर है। यह अब किसी भी शाखा का मुखिया नहीं है, लेकिन हम इसे वही देख सकते हैं।

Note: checking out 123abc. You are in 'detached HEAD' state, etc 
$ git checkout -b old_master 
$ git branch -a 
    master 
* new_branch 
    origin/master 
    old_master 

अब अनुमान लगाएं कि उनका SHA1 क्रमशः क्या होगा?

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