दूरस्थ फ़ाइलों को अधिलेखित करने के लिए "जोर धक्का" बल


766

मैं अपनी स्थानीय फ़ाइलों को धक्का देना चाहता हूं, और मर्ज संघर्षों से निपटने के लिए बिना रिमोट रेपो पर उन्हें रखना चाहता हूं। मैं बस चाहता हूं कि मेरा स्थानीय संस्करण रिमोट पर प्राथमिकता दे।

मैं इसे Git के साथ कैसे कर सकता हूं?


106
git push origin --forceआपके लिए काम नहीं किया ?


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

@ मायके जो किसी कारण से मेरे लिए काम करती है ... आश्चर्य है कि ओपी के साथ क्या हुआ था

एक संभावित कारण, बल पुश काम नहीं करता है, कि यह स्पष्ट रूप से दूरस्थ रेपो पर स्पष्ट रूप से अक्षम किया गया है (यह सुनिश्चित करने के लिए कि मुहावरेदार और / या घातक योगदानकर्ताओं के कारण कुछ भी नहीं मिलता है): config receive.denyNonFastforwardsयह पता लगाने के लिए उपयोग करें।
फ्रैंक नॉक

जवाबों:


1085

आपको अपने स्थानीय संशोधन को दूरस्थ रेपो में उपयोग करने के लिए बाध्य करने में सक्षम होना चाहिए

git push -f <remote> <branch>

(जैसे git push -f origin master)। छोड़ना <remote>और <branch>उन सभी स्थानीय शाखाओं को बल देना होगा जो निर्धारित की हैं --set-upstream

बस चेतावनी दी जाती है, अगर अन्य लोग इस भंडार को साझा कर रहे हैं तो उनका संशोधन इतिहास नए के साथ संघर्ष करेगा। और अगर परिवर्तन के बिंदु के बाद उनके पास कोई स्थानीय कमिट है, तो वे अमान्य हो जाएंगे।

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

अद्यतन 2 : दर्शकों की बढ़ती संख्या के कारण मैं कुछ अतिरिक्त जानकारी जोड़ना चाहूंगा कि जब आपका upstreamबल धक्का का अनुभव करे तो क्या करें ।

कहो कि मैंने आपके रेपो का क्लोन बना लिया है और इस तरह कुछ कमेंट्स जोड़े हैं:

            डी ---- ई विषय
           /
ए ---- बी ---- सी विकास

लेकिन बाद में developmentशाखा को एक हिट के साथ किया जाता है rebase, जिसके कारण मुझे एक त्रुटि प्राप्त होगी जैसे कि मैं चलाता हूं git pull:

वस्तुओं को खोलना: 100% (3/3), किया।
<रेपो-लोकेशन> से
 * शाखा विकास -> FETCH_HEAD
ऑटो-विलय <फ़ाइलें>
CONFLICT (सामग्री): <स्थानों> में मर्ज संघर्ष
स्वचालित मर्ज विफल; संघर्ष को ठीक करें और फिर परिणाम करें।

यहां मैं संघर्षों को ठीक कर सकता हूं और commit, लेकिन यह मुझे एक बहुत ही कुरूप प्रतिबद्ध इतिहास के साथ छोड़ देगा:

       सी ---- डी ---- ई ---- एफ विषय
      / /
ए ---- बी -------------- सी 'विकास

यह उपयोग करने के लिए मोहक लग सकता है git pull --forceलेकिन सावधान रहें क्योंकि यह आपको फंसे हुए कामों के साथ छोड़ देगा:

            डी ---- ई विषय

ए ---- बी ---- सी 'विकास

तो शायद सबसे अच्छा विकल्प एक करना है git pull --rebase। इसके लिए मुझे पहले की तरह किसी भी तरह के संघर्ष को हल करने की आवश्यकता होगी, लेकिन मैं उपयोग करने के बजाय प्रत्येक चरण के लिए git rebase --continue। अंत में प्रतिबद्ध इतिहास बेहतर दिखाई देगा:

            डी '--- ई' विषय
           /
ए ---- बी ---- सी 'विकास

अद्यतन 3: आप --force-with-leaseविकल्प का उपयोग "सुरक्षित" बल पुश के रूप में भी कर सकते हैं , जैसा कि उनके उत्तर में कपकेक ने उल्लेख किया है :

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

git push <remote> <branch> --force-with-lease

आप --force-with-leaseनिम्नलिखित में से किसी को पढ़कर कैसे उपयोग करें, इसके बारे में अधिक जानकारी जान सकते हैं :


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

128

आप जोर जबरदस्ती करना चाहते हैं

दूरस्थ रूप से अधिलेखित करने के लिए आप मूल रूप से अपनी स्थानीय शाखा को आगे बढ़ाने के लिए क्या करना चाहते हैं।

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

git push <remote> <branch> -f
git push origin master -f # Example

git push <remote> -f
git push origin -f # Example

git push -f

git push <remote> <branch> --force-with-lease

यदि आप प्रत्येक कमांड का अधिक विस्तृत विवरण चाहते हैं, तो नीचे मेरे लंबे उत्तर अनुभाग देखें।

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

ब्योरे को आगे बढ़ाने वाला बल

दूरस्थ और शाखा को निर्दिष्ट करना

आप विशिष्ट शाखाओं और रिमोट को पूरी तरह से निर्दिष्ट कर सकते हैं। -fध्वज के लघु संस्करण है--force

git push <remote> <branch> --force
git push <remote> <branch> -f

शाखा को छोड़ना

जब शाखा को धक्का देने की शाखा को छोड़ दिया जाता है, तो Git आपकी कॉन्फ़िगरेशन सेटिंग्स के आधार पर इसका पता लगाएगा। 2.0 के बाद Git संस्करणों में, एक नए रेपो में वर्तमान में चेक-आउट शाखा को धकेलने के लिए डिफ़ॉल्ट सेटिंग्स होंगी:

git push <remote> --force

2.0 से पहले, नए रिपॉज में कई स्थानीय शाखाओं को पुश करने के लिए डिफ़ॉल्ट सेटिंग्स होंगी। प्रश्न में सेटिंग्स remote.<remote>.pushऔर push.defaultसेटिंग्स हैं (नीचे देखें)।

रिमोट और शाखा को छोड़ना

जब रिमोट और ब्रांच दोनों को छोड़ दिया जाता है, तो बस git push --forceआपके push.defaultGit कॉन्फिग सेटिंग्स द्वारा व्यवहार निर्धारित किया जाता है :

git push --force
  • Git 2.0 के रूप में, डिफ़ॉल्ट सेटिंग, simpleमूल रूप से आपके वर्तमान शाखा को इसके अपस्ट्रीम रिमोट काउंटर-पार्ट पर धकेल देगी। रिमोट शाखा की branch.<remote>.remoteसेटिंग से निर्धारित होता है, और मूल रेपो के लिए अन्यथा चूक करता है।

  • Git संस्करण 2.0 से पहले, डिफ़ॉल्ट सेटिंग, matchingमूल रूप से आपके सभी स्थानीय शाखाओं को रिमोट पर एक ही नाम के साथ शाखाओं में ले जाती है (जो मूल में चूक करता है)।

आप push.defaultपढ़कर git help configया git-config (1) मैनुअल पेज के ऑनलाइन संस्करण के द्वारा अधिक सेटिंग्स पढ़ सकते हैं ।

बल के साथ और अधिक सुरक्षित रूप से धक्का --force-with-lease

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

git push <remote> <branch> --force-with-lease

आप --force-with-leaseनिम्नलिखित में से किसी को पढ़कर कैसे उपयोग करें, इसके बारे में अधिक जानकारी जान सकते हैं :


आप सही हैं, लेकिन यह वास्तव में केवल असाधारण स्थितियों में उपयोग किया जाना चाहिए ।
स्कॉट बेरेवेट्स

1
@ScottBerrevoets " मैं पसंद करूंगा कि मेरे पास जो है उसे धक्का दें और इसे एकीकृत करने के बजाय दूर से अधिलेखित करें। " मैंने ओपी को बिल्कुल वही दिया जो उसने मांगा था।

मुझे पता है, लेकिन ओपी को ऐसा करने के परिणामों के बारे में पता नहीं हो सकता है। आपने तकनीकी रूप से सवाल का जवाब दिया, लेकिन मुझे लगता है कि ऐसा नहीं करने की चेतावनी जगह से बाहर नहीं है।
स्कॉट बेरेवेट्स

1
@ScottBerrevoets मैं कोशिश कर रहा हूं कि कोई मॉडरेटर मेरे उत्तर को विहित में मिला दे, क्योंकि मैं नए --force-with-leaseविकल्प का उल्लेख करता हूं;)


32

एक अन्य विकल्प (किसी भी मजबूर धक्का से बचने के लिए जो अन्य योगदानकर्ताओं के लिए समस्याग्रस्त हो सकता है):

  • अपनी नई प्रतिबद्धताओं को एक समर्पित शाखा में रखें
  • अपने रीसेट masterपरorigin/master
  • अपनी समर्पित शाखा को मर्ज करें master, हमेशा समर्पित शाखा से बने रहें (जिसका अर्थ है masterकि आपके समर्पित शाखा को दर्पण के शीर्ष पर नए संशोधन बनाना )। अनुकरण करने के लिए रणनीतियों के लिए " दूसरे की तरह एक शाखा बनाने के लिए
    " कमांड देखें git merge --strategy=theirs

इस तरह, आप किसी भी चीज़ को मजबूर किए बिना मास्टर को दूरस्थ रूप से धकेल सकते हैं।


परिणाम "पुश -फोर्स" से कैसे भिन्न होता है?
एलेक्सकोवेलस्की

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

1
मेरा सुझाव है कि आप अपने उत्तर में एक शीर्षक जोड़ें: "आप जोर-जबरदस्ती नहीं करना चाहते हैं :) :)
एलेक्सकोवेल्स्की

@alexkovelsky अच्छा बिंदु। मैंने उसी के अनुसार उत्तर संपादित किया है।
वॉनक

4

git push -f थोड़ा विनाशकारी है क्योंकि यह किसी भी दूरस्थ परिवर्तन को रीसेट करता है जो टीम में किसी और के द्वारा किया गया था। एक सुरक्षित विकल्प {गिट पुश --फोर्स-विद-लीज} है।

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



0

कछुआ का उपयोग करके सरल कदम

जीआईटी स्थानीय फाइलों को कमिट करती है और गिट रिपॉजिटरी में धकेल देती है।

कदम :

1) स्टैश चेंज नेम नेम

२) खींच

3) स्टैश पॉप

4) के लिए प्रतिबद्ध 1 या अधिक फ़ाइलें और परिवर्तन वर्णन सेट लेखक और दिनांक प्रतिबद्ध देना

5) धक्का

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.