Last chance! 50% off DataCamp Premium
Sale ends in
आपने एक डेवलपर के रूप में यह अनुभव किया होगा: आपको अभी अहसास हुआ कि आपकी पिछली कमिट में कोड में समस्या थी। इस गलती को पलटने के लिए, आप कुछ कमांड चलाते हैं और अपना लोकल इतिहास फिर से लिखते हैं। जब आप सब कुछ साफ करने के लिए git push --force चलाते हैं, तो आपके टीममेट्स बताते हैं कि कुछ कमिट्स गायब हैं या आपकी पाइपलाइन में बिल्ड फेल हो रहे हैं।
इस लेख में, मैं समझाऊंगा कि git push --force असल में क्या करता है, इसे कब इस्तेमाल करना चाहिए, और गलतियों से कैसे बचना है। यदि आप Git के साथ शुरुआत कर रहे हैं, तो मैं हमारे Introduction to Git कोर्स को लेने की सलाह देता/देती हूं ताकि आप वर्ज़न कंट्रोल के बारे में सीख सकें। साथ ही, मुझे Git Cheat Sheet उपयोगी संदर्भ लगता है, जिसे आप डाउनलोड कर सकते हैं—इसमें सबसे आम Git शब्दावली और कमांड्स एक जगह हैं।
मान लीजिए आप पुश करने से पहले अपनी लोकल कमिट हिस्ट्री साफ कर रहे हैं। मर्ज करने से पहले हिस्ट्री दुरुस्त करने के लिए आप git rebase -i main चलाते हैं। लोकल में सब कुछ परफेक्ट दिखता है, तो आप एक साधारण git push से अपनी रिमोट ब्रांच अपडेट करने की कोशिश करते हैं। लेकिन सामान्य सफलता संदेश की जगह Git आपको एक त्रुटि दिखा देता है।
एक और स्थिति यह हो सकती है जब आप गलती से संवेदनशील डेटा कमिट कर दें—जैसे कोई API कुंजी या पासवर्ड—और उसे रिमोट पर पुश कर दें। लोकल इतिहास फिर से लिखकर आप उस समस्या वाली कमिट को हटाते हैं, लेकिन सामान्य पुश रिमोट रिपॉज़िटरी को अपडेट नहीं करता और संवेदनशील डेटा वहीं रह जाता है। इसके बदले आपको एक त्रुटि संदेश मिलता है।
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'origin'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.,
hint: 'git pull ...') before pushing again.
यह “non-fast-forward” त्रुटि Git का सेफ्टी नेट है—एक चेतावनी कि आपके इतिहास की कोई बात सर्वर पर मौजूद कंटेंट से मेल नहीं खाती। इस बिंदु पर, इस त्रुटि को बायपास करने के लिए git push --force चलाना आकर्षक लग सकता है।
यदि आप ब्रांच पर अकेले काम कर रहे हैं तो यह ठीक चल सकता है। लेकिन साझा प्रोजेक्ट्स में यह आसानी से भ्रम पैदा कर सकता है या किसी और का काम मिटा सकता है।
आम तौर पर, Git केवल तभी आपको बदलाव पुश करने देता है जब आपकी लोकल ब्रांच में रिमोट पर मौजूद सब कुछ—आपकी नई कमिट्स सहित—शामिल हो। लेकिन कभी-कभी आप git rebase, squashing या संवेदनशील डेटा हटाने के जरिए अपनी कमिट हिस्ट्री फिर से लिख सकते हैं। ऐसा करने पर आपकी लोकल ब्रांच रिमोट ब्रांच से अलग हो जाएगी। तब जब आप नई कमिट पुश करने की कोशिश करते हैं, Git त्रुटि दिखाता है, जो रिमोट ब्रांच को काम के नुकसान से बचाता है।
git push --force इस्तेमाल करने पर आप Git से सेफ्टी चेक छोड़कर रिमोट ब्रांच को अपनी लोकल ब्रांच की सामग्री से ओवरराइट करने के लिए कहते हैं।
यह कुछ इस तरह दिखता है:
git push --force origin main
यह रिमोट की main ब्रांच को आपकी लोकल main से मैच कर देगा और आपके लोकल में न होने वाली कमिट्स को हटा देगा।
अब अपनी Git ब्रांच को उस साझा किताब के एक अध्याय की तरह समझें जिसे आपकी टीम साथ में लिख रही है। एक सामान्य पुश अध्याय के अंत में नए पैराग्राफ जोड़ने जैसा है। जबकि git push --force अधिक शक्तिशाली है—यह मौजूदा अध्याय को फाड़कर आपकी संस्करण से पूरी तरह बदल देता है।
git push --force का जोखिम यह है कि यदि सहयोगियों ने अपनी बदलाव उन कमिट्स पर आधारित किए हैं जिन्हें आपने अभी मिटा दिया, तो उनका काम खो सकता है। अगला सेक्शन --force कमांड के साथ काम करते समय बरतने वाली सावधानियों पर है।
यदि आप main या develop जैसी साझा ब्रांच पर जबरन पुश करते हैं, तो संभवतः निम्नलिखित होगा:
हमारा CI/CD for Machine Learning कोर्स देखें ताकि आप CI/CD वर्कफ़्लोज़ बनाना समझ सकें। मैं हमारे Introduction to Data Versioning with DVC कोर्स की भी सलाह देता/देती हूं, जिससे आप डेटा वर्ज़निंग और कोड वर्ज़निंग के बीच का अंतर सीखेंगे।
इसे इस तरह समझें: आप और आपका एक टीममेट feature ब्रांच पर हैं। आप अपनी लोकल हिस्ट्री साफ करते हैं, फिर git push --force चलाते हैं। कुछ मिनट बाद, आपका टीममेट अपने बदलाव पुश करता है। उन्हें Git में त्रुटियां दिखती हैं। जब वे पुल करते हैं, तो उन्हें मर्ज कॉन्फ्लिक्ट्स और बिगड़ी हुई कमिट हिस्ट्री मिलती है। इस बीच, आपकी CI पाइपलाइन मिसिंग कमिट्स के कारण फेल हो जाती है। अब, आपका टीममेट ब्रांच की उलझन सुलझाने में समय गंवाता है और डिप्लॉयमेंट में देरी हो जाती है।
एक ही फोर्स पुश यह सब करा सकता है।
ऐसी समस्याओं से बचने के लिए, मैं git push --force-with-lease इस्तेमाल करने की सलाह देता/देती हूं। यह कमांड रिमोट ब्रांच पर पुश करते समय एक सेफ्टी चेक जोड़ता है ताकि अनपेक्षित कमिट्स से बचा जा सके।
git push --force-with-lease origin main
--force-with-lease को “कूदने से पहले देख लेना कि रास्ता साफ है या नहीं” की तरह समझें। कुछ करने से पहले यह सुनिश्चित करता है कि किसी और ने ब्रांच में बदलाव न किए हों। यदि सब कुछ वैसा ही है जैसा आपने आखिरी बार देखा था, तो आपका इतिहास अपडेट हो जाता है। लेकिन अगर ऐसी नई परिवर्तन हैं जिनके बारे में आपको पता नहीं था, तो Git आपको रोक देता है और पहले स्थिति की समीक्षा करने को कहता है। इस तरह यह कमांड हमेशा सहयोगियों को अनजाने ओवरराइट से बचाता है।
यदि कुछ कमिट्स खो जाएं, तो घबराएं नहीं—आप उन्हें फिर भी रिकवर कर सकते हैं। Git वर्तमान कमिट में होने वाले परिवर्तनों, जिसमें रीराइट्स भी शामिल हैं, का हमेशा रिकॉर्ड रखता है और उसे reflog में स्टोर करता है।
खोई हुई कमिट्स ऐसे रिकवर करें:
अपनी ब्रांच हिस्ट्री देखने के लिए git reflog चलाएं।
git reflog
आपको अपनी कमिट्स कुछ इस तरह दिख सकती हैं:
abc1234 HEAD@{1}: push: force push
def5678 HEAD@{2}: commit: add new feature
जिस कमिट हैश को आप रिकवर करना चाहते हैं उसे पहचान लेने पर, नीचे दिया कमांड चलाकर उस विशेष कमिट पर जाएं।
git checkout def5678
फाइलें सुरक्षित रूप से रिकवर करने के लिए, एक नई git ब्रांच बनाएं।
git checkout -b recovery-branch
अब रिकवर की गई कमिट्स को ब्रांच पर पुश करें:
git push origin recovery-branch
ध्यान रखें कि reflog डेटा केवल लोकल मशीनों पर मौजूद होता है। इसलिए, यदि आपके किसी भी टीममेट ने उन्हें अपने लोकल वातावरण में स्टोर नहीं किया, तो आप खोई कमिट्स रिकवर नहीं कर पाएंगे।
Git में सहयोग और ब्रांचों के साथ काम करने के बारे में और जानने के लिए मैं हमारे Intermediate Git कोर्स की सलाह देता/देती हूं।
गलतियां होने की संभावना घटाने के लिए, ये कुछ अच्छी आदतें अपनाएं:
--force की जगह --force-with-lease को प्राथमिकता दें: यह तरीका ज्यादा सुरक्षित है—यह जांचता है कि आपकी आखिरी फ़ेच के बाद रिमोट ब्रांच बदली तो नहीं है। इससे आपके टीममेट्स को अनजाने ओवरराइट से बचाने में मदद मिलेगी।
साझा ब्रांचों पर फोर्स-पुश करने से बचें: main, master, develop या release जैसी साझा ब्रांचों पर कभी फोर्स-पुश न करें। बाधा से बचने के लिए केवल अपनी फीचर ब्रांचों पर, जहां योगदानकर्ता आप ही हों, फोर्स पुश करें।
फोर्स-पुश करने से पहले टीम को सूचित करें: यदि आपको किसी साझा ब्रांच पर फोर्स-पुश करना ही पड़े, तो अपनी टीम को पहले बता दें। इससे वे अपना काम सुरक्षित कर सकेंगे और नुकसान से बचा जा सकेगा।
प्रोटेक्टेड ब्रांचों का उपयोग करें: GitHub, GitLab और Bitbucket जैसे प्लेटफ़ॉर्म्स पर आप अपनी ब्रांचों के लिए प्रोटेक्शन सक्षम कर सकते हैं। इससे डायरेक्ट एडिट्स सीमित होते हैं और महत्वपूर्ण ब्रांचों पर अनजाने फोर्स पुश से बचाव होता है।
यदि आप निजी रिपोज़ मैनेजमेंट के बारे में और जानना चाहते हैं, तो हमारा Introduction to GitHub Concepts कोर्स देखे—GitHub पर सहयोग करते समय पुल रिक्वेस्ट की समीक्षा कैसे करें, यह समझने के लिए।
git push --force आपका रिपो इतिहास फिर से लिखने का एक उपयोगी तरीका देता है—चाहे आप कमिट्स साफ करना चाहें या संवेदनशील डेटा हटाना। इस कमांड का उपयोग हमेशा सावधानी से करें ताकि आपकी टीम का वर्कफ़्लो न टूटे।
जहां भी संभव हो, --force-with-lease का उपयोग करें। यह आपको ज्यादा नियंत्रण देता है बिना दूसरों के काम को जोखिम में डाले। थोड़ी सावधानी और संचार के साथ, आप अपनी Git हिस्ट्री साफ रख सकते हैं बिना टीम के लिए परेशानी खड़ी किए।
Git में विशेषज्ञ बनने के लिए हमारे Git Fundamentals और GitHub Foundations स्किल ट्रैक्स देखें।
डेटा एनालिटिक्स, बिज़नेस इंटेलिजेंस और डेटा साइंस में व्यावहारिक अनुभव रखने वाला डेटा साइंस तकनीकी लेखक। मैं SQL, Python, Power BI, Databricks और डेटा इंजीनियरिंग पर व्यावहारिक, उद्योग-केंद्रित सामग्री लिखता/लिखती हूँ, जो वास्तविक दुनिया की एनालिटिक्स कार्य से जुड़ी होती है। मेरी लेखनी तकनीकी गहराई और व्यावसायिक प्रभाव के बीच पुल का काम करती है, जिससे पेशेवरों को डेटा को आत्मविश्वासपूर्ण निर्णयों में बदलने में मदद मिलती है.
यह रिमोट ब्रांच पर कमिट्स को ओवरराइट कर सकता है, जिससे टीममेट्स का काम खो सकता है या उलझे हुए मर्ज कॉन्फ्लिक्ट्स का सामना करना पड़ सकता है।
रिमोट ब्रांच आपकी पिछली फ़ेच के बाद बदली नहीं है, यह सुनिश्चित करने और अनजाने ओवरराइट से बचने के लिए --force के बजाय git push --force-with-lease का उपयोग करें।
git push --force तब जरूरी हो सकता है जब आपने लोकल कमिट्स को रीबेस किया हो, इतिहास से संवेदनशील डेटा हटाया हो, या किसी फीचर ब्रांच को मर्ज करने से पहले कमिट हिस्ट्री साफ की हो।
git push --force को पलटने के लिए git reflog चलाकर पिछली कमिट ढूंढें, फिर उस कमिट को चेकआउट करके सुधारी हुई ब्रांच को फोर्स-पुश करें।
--force-with-lease का उपयोग करें, साझा ब्रांचों पर फोर्स-पुश से बचें, टीम से संवाद करें, और अपने Git होस्टिंग प्लेटफ़ॉर्म पर महत्वपूर्ण ब्रांचों को प्रोटेक्ट करें।
DataCamp के साथ सीखें
कोर्स
कोर्स
कोर्स