मैं कैसे ठीक से एक धक्का धक्का मजबूर करूँ?


1271

मैंने एक रिमोट नंगे "मुख्य" रेपो की स्थापना की है और इसे अपने कंप्यूटर पर क्लोन किया है। मैंने कुछ स्थानीय परिवर्तन किए, अपने स्थानीय रिपॉजिटरी को अपडेट किया, और परिवर्तनों को वापस मेरे रिमोट रेपो में धकेल दिया। उस बिंदु तक चीजें ठीक थीं।

अब, मुझे रिमोट रेपो में कुछ बदलना था। फिर मैंने अपने स्थानीय रेपो में कुछ बदला। मैंने महसूस किया कि रिमोट रेपो में बदलाव की जरूरत नहीं थी। इसलिए मैंने git pushअपने स्थानीय रेपो से लेकर अपने रिमोट रेपो तक की कोशिश की , लेकिन मुझे एक त्रुटि मिली:

आपको इतिहास को खोने से रोकने के लिए, गैर-तेज़-फ़ॉरवर्ड अपडेट को फिर से पुश करने से पहले दूरस्थ परिवर्तनों को मर्ज करने से अस्वीकार कर दिया गया था। विवरण के लिए 'नोट git push --helpफॉर फास्ट-फॉरवर्ड' सेक्शन देखें।

मुझे लगा कि शायद ए

git push --force

मेरी स्थानीय प्रति को दूरस्थ एक में परिवर्तन को धकेलने और उसे समान बनाने के लिए बाध्य करेगा। यह अपडेट को बाध्य करता है , लेकिन जब मैं रिमोट रेपो पर वापस जाता हूं और एक कमिट करता हूं, तो मैं ध्यान देता हूं कि फाइलों में पुराने बदलाव हैं (पहले जो मुख्य रिमोट रेपो था)।

जैसा कि मैंने एक उत्तर में टिप्पणियों में उल्लेख किया है :

[I] ने जबरदस्ती करने की कोशिश की, लेकिन जब परिवर्तनों को बचाने के लिए मास्टर सर्वर पर वापस जा रहा था, तो मुझे पुराना मंचन मिला। इस प्रकार, जब मैं प्रतिबद्ध करता हूं तो रिपॉजिटरी समान नहीं होती हैं। और जब मैं फिर से git पुश का उपयोग करने की कोशिश करता हूं, तो मुझे वही त्रुटि मिलती है।

मैं इस समस्या को कैसे हल कर सकता हूं?


4
आप जल्द ही (git1.8.5, Q4 2013) अधिक सावधानी से करgit push -force पाएंगे ।
वॉन सीपीसी


6
जैसा कि मैंने अपने स्वयं के उत्तर में विस्तार से बताया , git push --forceवास्तव में पुश को मजबूर करने का एक और वैध तरीका है, और शाखाओं को और git push origin master --forceसाथ ही गिट के डिफ़ॉल्ट के साथ धक्का देगा push.default config settings, हालांकि जिन शाखाओं को विशेष रूप से धक्का दिया जाता है, वे 2.0 से पहले के 2.0 के पूर्व के संस्करणों के बीच भिन्न होते हैं।

2
git push --forceइन दिनों ठीक काम करता है,
एफडब्ल्यूआईडब्ल्यू

git push --force-with-leaseऔर भी बेहतर काम करता है :), यह शाखा को अपडेट करने से इंकार कर देगा जब तक कि यह वह स्थिति नहीं है जो आप अपेक्षा करते हैं। (देखें developer.atlassian.com/blog/2015/04/force-with-lease )
spoorcc

जवाबों:


2304

बस करो:

git push origin <your_branch_name> --force

या यदि आपके पास एक विशिष्ट रेपो है:

git push https://git.... --force

यह आपकी पिछली प्रतिबद्धताओं को हटा देगा और आपके वर्तमान को धक्का देगा।

यह उचित नहीं हो सकता है, लेकिन अगर कोई इस पृष्ठ पर ठोकर खाता है, तो सोचा कि वे एक सरल समाधान चाहते हैं ...

छोटा झंडा

यह भी ध्यान दें कि इसके -fलिए छोटा है --force, इसलिए

git push origin <your_branch_name> -f

काम भी करेगा।


58
आप git push origin +masterइसके बजाय का उपयोग कर सकते हैं , जो आपको उन सभी को मजबूर किए बिना कई रीस्पेक को धक्का देने की अनुमति देता है।
निकरिम

5
इस बात से अवगत रहें कि यदि आप गलती से बस कर देते हैं git push --force, तो हो सकता है कि आप मास्टर ब्रांच (आपके पुश डिफॉल्ट व्यवहार के आधार पर) में गड़बड़ी कर दें .. जो कि चूसना हो सकता है .. थोड़ा सा ..: D
Jeewes

9
@ गेट्स 2.0 के साथ शुरू होने वाले जीव्स, का डिफ़ॉल्ट व्यवहार git push --forceमूल रूप से वर्तमान में चेक-आउट शाखा को उसके रिमोट-काउंटर भाग में धकेलने के लिए है, इसलिए यदि आपके पास मास्टर शाखा की जाँच की गई है, तो यह समान है git push origin master --force। यदि आप matchingसेटिंग का उपयोग कर रहे हैं तो यह अलग होगा push.default, जो कि 2.0 से पहले Git संस्करणों के लिए डिफ़ॉल्ट है। सभी स्थानीय शाखाओं को दूरस्थ लोगों के लिए matchingधक्का देता है जिनका एक ही नाम है, इसलिए बलपूर्वक धक्का देना निश्चित रूप से वह नहीं हो सकता है जो आप करना चाहते हैं ...

@Jeewes लेकिन Git 2.0 के साथ, डिफ़ॉल्ट सुरक्षित है, या कम से कम यह अधिक खतरनाक नहीं git push origin master --forceहै।

2
पुश -f अच्छा है, लेकिन मास्टर के लिए पुन: तैयार नहीं किया गया है क्योंकि अधिकांश कॉर्पोरेट रिपॉजिटरी में-मास्टर के लिए अक्षम है। merge -s oursमेरे लिए काम किया
Mihai

247

और अगर push --forceआप काम नहीं करते हैं तो आप कर सकते हैं push --delete। इस उदाहरण पर 2 nd लाइन देखें:

git reset --hard HEAD~3  # reset current branch to 3 commits ago
git push origin master --delete  # do a very very bad bad thing
git push origin master  # regular push

मगर सावधान...

कभी भी एक सार्वजनिक इतिहास पर वापस मत जाओ!

दूसरे शब्दों में:

  • कभी भी forceएक सार्वजनिक भंडार पर धक्का न दें ।
  • ऐसा न करें और न ही ऐसा कुछ करें जो किसी के टूटने का कारण बन सके pull
  • रेपो में कभी भी इतिहास resetया किसी को पहले से ही खींचा हुआ नहीं हो सकता है।rewrite

बेशक इस नियम के लिए असाधारण रूप से दुर्लभ अपवाद हैं, लेकिन ज्यादातर मामलों में इसे करने की आवश्यकता नहीं है और यह हर किसी के लिए समस्याएं पैदा करेगा।

इसके बजाय उल्टा करें।

और हमेशा ध्यान रखें कि आप सार्वजनिक रेपो में क्या करते हैं । वापस लाया जा रहा:

git revert -n HEAD~3..HEAD  # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master  # regular push

वास्तव में, दोनों HEADs ( रिवर्ट से और बुराई रीसेट से ) एक ही फाइल में होंगे।


अद्यतन जानकारी और अधिक तर्कों को जोड़ने के लिए संपादित करें push --force

पुश के बजाय पट्टे के साथ बल पर विचार करें, लेकिन फिर भी वापस लौटना पसंद करें

एक और समस्या तब push --forceहो सकती है जब कोई व्यक्ति आपके करने से पहले किसी भी चीज़ को धक्का दे, लेकिन आपके द्वारा पहले ही लाने के बाद। यदि आप अपने विद्रोही संस्करण को बल देते हैं तो आप काम को दूसरों से बदल देंगे ।

git push --force-with-lease1.8.5 git में पेश किया गया ( प्रश्न पर @VonC टिप्पणी के लिए धन्यवाद ) इस विशिष्ट मुद्दे को संबोधित करने की कोशिश करता है। मूल रूप से, यह एक त्रुटि लाएगा और धक्का नहीं देगा यदि रिमोट आपके नवीनतम भ्रूण के बाद से संशोधित किया गया था।

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

और जब से हम git --pushउदाहरणों के बारे में बात कर रहे हैं ...

कोई जबरदस्ती क्यों करना चाहेगा?

@linquize टिप्पणियों पर एक अच्छा पुश बल उदाहरण लाया: संवेदनशील डेटा । आपने गलत तरीके से लीक हुए डेटा को धक्का नहीं दिया है। यदि आप पर्याप्त उपवास कर रहे हैं, तो आप शीर्ष पर एक धक्का मजबूर करके इसे "ठीक" कर सकते हैं *

*डेटा अभी भी रिमोट पर किया जाएगा जब तक कि आप भी एक ऐसा कलेक्ट कचरा , या यह किसी भी तरह से साफ । अन्य लोगों द्वारा इसे फैलाने की स्पष्ट क्षमता भी है जो इसे पहले से ही प्राप्त कर चुके हैं, लेकिन आपको इसका विचार है।


1
समस्या, @rogerdpack, अगर यह संभव नहीं है। यह है। लेकिन यह एक बड़ी आपदा तक का योग कर सकता है। जितना अधिक कोई इसे करता है (बल धक्का) और जितना कम आप सार्वजनिक रेपो से अपडेट (पुल) करते हैं, उतना बड़ा आपदा होता है। जैसा कि आप जानते हैं कि यह दुनिया को नष्ट कर सकता है !!! 111 कम से कम दुनिया में उस विशेष भंडार का समावेश है।
cregox

3
आप संवेदनशील डेटा है, तो बल धक्का
linquize

3
@ कवास: मुझे लगता है कि उनका मतलब है कि यदि आप रिपॉजिटरी से संवेदनशील डेटा को हटाने की कोशिश कर रहे हैं, तो आप इतिहास को फिर से लिखना चाहते हैं । यदि आप वापस करते हैं, तो संवेदनशील डेटा पहले की प्रतिबद्धताओं में अभी भी है। उस ने कहा, अगर किसी और ने पहले ही भंडार से खींच लिया है, तो इतिहास को फिर से लिखने से आपको संवेदनशील डेटा तक पहुंचने से रोकने में मदद नहीं मिलेगी - यह उस बिंदु पर पहले ही बहुत देर हो चुकी है।
स्टुअर्ट गोलोडेट्ज

3
git push origin master --delete # do a very very bad bad thing git push origin master # regular pushयह वास्तव में मेरी समस्या को पूरी तरह से हल करता है (केवल मेरे और मेरे दोस्त के साथ रेपो पर)। शायद यह सार्वजनिक रेपो के लिए गलत है लेकिन एक निजी के लिए यह एक जीवन रक्षक है।
कर सकते हैं Poyrazoğlu

1
यह स्वचालित रूप से कुछ रेपो प्रबंधकों, उर्फ ​​ऑटो-स्क्वैश आदि के साथ होता है, जो कमिटमेंट को कम करने के लिए एक फीचर शाखा को खत्म करने के बाद धकेलता है, यह आम और अपेक्षित है।
फ्लावर्सस्केप

18

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

आपको जो त्रुटि मिल रही है, उसके बारे में आपने git pullअपने स्थानीय रेपो और फिर git pushमुख्य रेपो से कोशिश की है? आप वर्तमान में क्या कर रहे हैं (अगर मैं इसे अच्छी तरह से समझ गया हूं) धक्का देने के लिए मजबूर कर रहा हूं और फिर "मुख्य" रेपो में अपने बदलाव खो रहा हूं। आपको पहले स्थानीय स्तर पर परिवर्तनों का विलय करना चाहिए।


हाँ, मैं एक पुल की कोशिश की, लेकिन मैं उस पुल की वजह से डेटा खो रहा हूँ। मैं अपना मुख्य रिपॉजिट बनाना चाहता हूं क्योंकि मेरा लोकल मुख्य से अपडेट किए बिना है।
स्पाय्रोस

1
उस स्थिति में उपयोग करें git push -f, लेकिन फिर यदि आप अपने मुख्य रेपो को फिर से बदलते हैं, तो आपको अपने स्थानीय रेपो में वापस जाना होगा और git pull, ताकि यह नवीनतम परिवर्तनों के साथ मिल जाए। तब आप अपना काम कर सकते हैं, और फिर से धक्का दे सकते हैं। यदि आप इस "पुश-पुल" वर्कफ़्लो का पालन करते हैं, तो आपको उस तरह की त्रुटि नहीं मिलेगी जिसके बारे में आप शिकायत कर रहे थे।
ubik

हाँ, मैं समझता हूँ कि यह मेरी गलती थी: / मैं कोशिश करूँगा और थोड़े समय में वापस आ
जाऊंगा

1
मजबूर करने की कोशिश की, लेकिन जब परिवर्तनों को बचाने के लिए मास्टर सर्वर पर वापस जा रहा हूं, तो मुझे पुराना मंचन मिलता है। इस प्रकार, जब मैं प्रतिबद्ध करता हूं तो रिपॉजिटरी समान नहीं होती हैं। और जब मैं फिर से git पुश का उपयोग करने का प्रयास करता हूं, तो मुझे वही त्रुटि मिलती है।
स्पाइसरोस

17

यदि मैं अपनी स्थानीय शाखा A पर हूं, और मैं स्थानीय शाखा B को मूल शाखा में धकेलना चाहता हूं तो CI निम्नलिखित सिंटैक्स का उपयोग कर सकता है:

git push --force origin B:C

2
मुझे पता चला कि यहां तक ​​कि मैं अपनी स्थानीय शाखा बी पर हूं, मुझे अभी भी करने की आवश्यकता है git push --force origin B:C। मेरे मामले में, ऐसा लगता है कि git push --force origin Cकेवल स्थानीय मास्टर से दूरस्थ सी शाखा तक धक्का होगा, चाहे जिस शाखा पर मैं वर्तमान में हूं। git version 2.3.8 (Apple Git-58)
वीशी ज़ेंग

12

इस आदेश का उपयोग करें:

git push -f origin master

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

ओह, असुविधा के लिए खेद है, मुझे वही समस्या हो रही थी और यह आदेश इसे हल करता है, मैंने सोचा कि मुझे इसे साझा करना चाहिए।
मुस्तफा एल्सेयेद

12
यह दूसरों की तरह ही है, आपने सिर्फ -fझंडे की स्थिति बदल दी है ...
३ag

11

मैं वास्तव में सिफारिश करेंगे:

दूसरे शब्दों में, मुख्य सर्वर और स्थानीय कंप्यूटर दोनों से एक नंगे रेपो को सुलभ रखना है, जिसमें से एक भी अपस्ट्रीम रेपो है जिसमें / को खींचना / खींचना है।


5

इतिहास को बनाए रखते हुए एक कॉर्पोरेट गिटहब भंडार पर मास्टर की जगह के लिए यह हमारा समाधान था।

push -fकॉर्पोरेट इतिहास पर मास्टर करने के लिए अक्सर शाखा इतिहास को बनाए रखने के लिए अक्षम किया जाता है। इस समाधान ने हमारे लिए काम किया।

git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master

git checkout currentBranch  // move to target branch
git merge -s ours master  // merge using ours over master
// vim will open for the commit message
git checkout master  // move to master
git merge currentBranch  // merge resolved changes into master

desiredOriginएक पीआर बनाने के लिए अपनी शाखा को धक्का दें


3

मेरा भी यही सवाल था, लेकिन आखिरकार समझ में आ गया। आपको सबसे अधिक संभावना है कि निम्नलिखित दो git कमांड चलाएं (git कमिट रिवीजन नंबर के साथ हैश की जगह):

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