आप धक्का तो एक सर्वर के लिए प्रतिबद्ध है, और फिर पुनर्लेखन कि स्थानीय स्तर पर (साथ प्रतिबद्ध git reset
, git rebase
, git filter-branch
, या किसी अन्य इतिहास हेरफेर), और फिर धक्का दिया कि पुनः सर्वर को वापस अप के लिए प्रतिबद्ध है, तो आप किसी और को जो खींच लिया था पेंच होगा। यहाँ एक उदाहरण है; आपने ए को प्रतिबद्ध किया है, और इसे सर्वर पर धकेल दिया है।
- * - * - ए <- गुरु
- * - * - ए <- मूल / गुरु
अब आप ए को फिर से लिखने का फैसला करते हैं, जिस तरह से आपने बताया, रीसेट करना और फिर से कमिट करना। ध्यान दें कि यह एक झूलती हुई प्रतिबद्धता को छोड़ देता है, ए, जो अंततः कचरा एकत्र किया जाएगा क्योंकि यह उपलब्ध नहीं है।
-*-*-ए
\
A '<- गुरु
- * - * - ए <- मूल / गुरु
अगर कोई और, फ्रेड कहते हैं, नीचे खींचता है master
सर्वर से है जब आप ऐसा कर रहे हैं, तो उनके पास ए का संदर्भ होगा, जिसे वे काम करना शुरू कर सकते हैं:
- * - * - ए '<- गुरु
- * - * - ए <- मूल / गुरु
- * - * - AB <- fred / master
अब यदि आप अपने A 'को मूल / गुरु में धकेलने में सक्षम थे, जो एक गैर-फास्ट-फॉरवर्ड बनाता है, तो इसके इतिहास में ए नहीं होगा। इसलिए यदि फ्रेड ने फिर से खींचने की कोशिश की, तो उसे अचानक विलय करना होगा, और ए कमिट को फिर से पेश करना होगा:
- * - * - ए '<- गुरु
- * - * - ए <- मूल / गुरु
- * - * - AB- \
\ * <- फ्रेड / मास्टर
ए'--/
अगर फ्रेड को यह ध्यान में आता है, तो वह एक रिबास कर सकता है, जो फिर से ए को फिर से प्रकट होने से रोक देगा। लेकिन उसे यह नोटिस करना होगा, और ऐसा करने के लिए याद रखना चाहिए; और यदि आपके पास एक से अधिक व्यक्ति हैं, जिन्होंने ए को नीचे खींच लिया है, तो वे सभी को पेड़ में अतिरिक्त ए को कम करने से बचने के लिए रिबेट करना होगा।
इसलिए, आम तौर पर रेपो पर इतिहास को बदलने के लिए यह एक अच्छा विचार नहीं है कि अन्य लोग किस से खींचते हैं। यदि, हालांकि, आपको पता है कि कोई और उस रेपो से नहीं खींच रहा है (उदाहरण के लिए, यह आपका अपना निजी रेपो है, या आपके पास केवल एक अन्य डेवलपर है जो इस परियोजना पर काम कर रहा है जिसे आप आसानी से समन्वयित कर सकते हैं), तो आप जबरन कर सकते हैं रन करके अपडेट करें:
git push -f
या
git push origin +master
ये दोनों एक गैर-फास्ट-फॉरवर्ड पुश के लिए चेक को अनदेखा करेंगे, और अपडेट करेंगे कि आपके नए ए 'संशोधन के लिए सर्वर पर क्या है, ए संशोधन को छोड़ दें ताकि यह अंततः कचरा एकत्र हो जाए।
यह संभव है कि बल धक्का पूरी तरह से receive.denyNonFastForwards
कॉन्फ़िगर विकल्प के साथ अक्षम हो । यह विकल्प साझा किए गए रिपॉजिटरी पर डिफ़ॉल्ट रूप से सक्षम है। उस मामले में, यदि आप वास्तव में, वास्तव में एक धक्का देना चाहते हैं, तो सबसे अच्छा विकल्प शाखा को हटाना और इसे फिर से बनाना है git push origin :master; git push origin master:master
। हालांकि, denyNonFastForwards
विकल्प एक कारण के लिए सक्षम है, जो ऊपर वर्णित है; एक साझा भंडार पर, इसका मतलब है कि अब हर कोई जो इसका उपयोग करता है, यह सुनिश्चित करने की आवश्यकता है कि वे नए इतिहास पर फिर से काम करें।
एक साझा भंडार पर, आम तौर पर शीर्ष पर नए कमिट्स को धकेलना बेहतर होता है जो भी समस्या है उसे ठीक करें; आप उन git revert
कमिट्स को जेनरेट करने के लिए उपयोग कर सकते हैं जो पिछले कमिट्स के बदलावों को पूर्ववत कर देगा।