2013-08-28 8 views
30

कोई Git आदेश (या आदेशों की एक छोटी अनुक्रम) है अधिलेखित करने के लिए है कि सुरक्षित रूप से और निश्चित रूप से निम्न करेगा:Git आदेश किसी भी शाखा चेकआउट और स्थानीय परिवर्तनों को

  • किसी भी स्थानीय परिवर्तन से छुटकारा पाने,
  • आवश्यक होने पर दिए गए शाखा को मूल से प्राप्त करें,
  • दी गई शाखा चेकआउट करें?

वर्तमान में मैं के साथ अटक कर रहा हूँ:

git fetch -p 
git stash 
git stash drop 
git checkout $branch 
git pull 

लेकिन यह मुझे परेशान कर रहा है, क्योंकि मैं (fetch और pull द्वारा) पासवर्ड के लिए पूछा रहा हूँ दो बार। आम तौर पर जब तक पासवर्ड की आवश्यकता होती है तब तक मैं किसी भी समाधान से खुश रहूंगा।

कुछ नोट:

  • यह एक आवेदन (कोड GitHub पर होस्ट किया गया है) के लिए किन्वासबित तैनाती स्क्रिप्ट का एक हिस्सा है,
  • कोई अंतर नहीं होना चाहिए अगर शाखा पहले से ही से प्राप्त किया गया था मूल या नहीं (यानि नई शाखा की पहली तैनाती को आदर्श रूप से किसी भी अतिरिक्त कदम की आवश्यकता नहीं है),
  • स्क्रिप्ट एक दूरस्थ मशीन पर स्थित है जिसे कई लोगों द्वारा एक्सेस किया जा सकता है, इसलिए कोई प्रमाण-पत्र संग्रहीत नहीं किया जाता है और उपयोगकर्ता/पासवर्ड दर्ज किया जाना चाहिए (लेकिन यदि संभव हो तो केवल एक बार),
  • मुझे किसी भी स्थानीय परिवर्तन की परवाह नहीं है, मैं हमेशा दी गई शाखा की एक प्राचीन प्रतिलिपि चाहता हूं (तैनाती स्क्रिप्ट का अगला हिस्सा स्थानीय परिवर्तन उत्पन्न करता है),
  • मैं हर बार एक ताजा भंडार क्लोन या निर्यात नहीं कर सकता, इसमें बहुत अधिक समय लगता है।
+1

1. 'गिट रीसेट --हार्ड' 2. 'गिट चेकआउट $ शाखा' 3.' गिट पुल मूल $ शाखा ' – g19fanatic

उत्तर

47

आप एक समाधान समान पालन "Force git to overwrite local files on pull"

git fetch --all 
git reset --hard origin/abranch 
git checkout $branch 

कि केवल एक ही लाने शामिल होगा करने के लिए कर सकता है।

+0

मैं इस समाधान का उपयोग कर रहा हूं, लेकिन मैंने अंत में अतिरिक्त 'गिट चेकआउट $ शाखा' जोड़ा, क्योंकि अन्यथा गिट द्वारा लौटाई गई वर्तमान शाखा जानकारी गलत थी। – szeryf

+0

@szeryf ठीक है, मैंने उस जवाब को संपादित किया है। – VonC

+0

@ वॉनसी, धन्यवाद। यह वास्तव में शाखा के साथ मास्टर अधिलेखित है। – psun

17

अंकों की युगल:

  • मेरा मानना ​​है कि git stash + git stash dropgit reset --hard
  • ... या, यहां तक ​​कि छोटे कद के साथ प्रतिस्थापित किया जा सकता है, checkout आदेश को -f जोड़ें:

    git checkout -f -b $branch 
    

    यह किसी भी स्थानीय परिवर्तन को त्याग देगा, जैसे git reset --hard हमें था चेकआउट से पहले एड।

मुख्य प्रश्न के लिए के रूप में: बजाय अंतिम चरण में खींच की, तो आप सिर्फ रिमोट से उपयुक्त शाखा में अपनी स्थानीय शाखा में विलय हो सकता है: git merge $branch origin/$branch, मेरा मानना ​​है कि यह रिमोट हिट नहीं करता। यदि ऐसा है, तो यह क्रेडेंशियल की आवश्यकता को हटा देता है और इसलिए, आपकी सबसे बड़ी चिंता को संबोधित करता है।

+0

-b को पूंजीकृत करने की आवश्यकता हो सकती है। 'गिट चेकआउट -एफ-बी $ शाखा 'स्थानीय शाखा को रीसेट करता है यदि यह पहले से मौजूद है। – xer0x

4

कुछ परिस्थितियों में गिट रीसेट और गिट क्लीन ओवरकिल हो सकता है (और समय की एक बड़ी बर्बादी हो सकती है)।

आप बस की तरह एक संदेश है, तो "निम्नलिखित ट्रैक न किए गए फ़ाइलें ओवरराइट किया जाएगा ..." और आप दूरस्थ/मूल/नदी के ऊपर उन परस्पर विरोधी ट्रैक न किए गए फ़ाइलों को अधिलेखित करना चाहते, तो git checkout -f <branch> सबसे अच्छा विकल्प है।

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

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