Git: Branches Delete करना, Merge करना, और एक ख़राब Push को Undo करना

August 2, 2026 · विज़िटर

ये तीन चीज़ें हमेशा सामने आती रहती हैं, और न जाने क्यों commands एक बार से दूसरी बार तक ठीक से याद नहीं रहते। तो यहाँ ये ठीक से लिख दिए गए हैं।

Branch Delete करना

git branch -d feature-x

यह safe वर्ज़न है — Git पहले जाँचता है, और मना कर देता है अगर feature-x में ऐसे commits हों जो आपके मौजूदा branch में कभी नहीं पहुँचे। अगर आपको यक़ीन है, तो आप इसे override कर सकते हैं: (1)

git branch -D feature-x

लेकिन यह सिर्फ़ local पर delete करता है। अगर वह branch remote पर भी मौजूद है (जैसे GitHub पर), तो आपको उसे वहाँ अलग से delete करना होगा:

git push origin --delete feature-x

एक बात जानने लायक़ है: branch delete करने से उसके commits असल में delete नहीं होते। वे बस unreferenced हो जाते हैं और repository में तब तक पड़े रहते हैं जब तक Git का garbage collector आख़िरकार उन्हें साफ़ नहीं कर देता, जिसमें काफ़ी वक़्त लग सकता है। तो git branch -D दिखने से कहीं ज़्यादा माफ़ कर देने वाला है — अगर आपने ग़लत branch delete कर दिया, तो आमतौर पर वापस लौटने का कोई रास्ता बचा रहता है (इसके बारे में नीचे reflog वाले हिस्से में और बताया गया है)। मैं इसे एक योजना के तौर पर भरोसा नहीं करूँगा, लेकिन यह जानना अच्छा है कि यह मौजूद है।

Branches को Merge करना

सामान्य तरीक़ा यह है: उस branch पर checkout करें जिसमें आप merge करना चाहते हैं, फिर दूसरी branch को उसमें merge करें।

git checkout main
git merge feature-x

इसके बाद क्या होता है यह इस पर निर्भर करता है कि आपके branch off करने के बाद से main आगे बढ़ा है या नहीं। अगर नहीं बढ़ा, तो Git बस main pointer को आगे खिसकाकर feature-x से मिला देता है — यह एक fast-forward है, इसमें कोई merge commit शामिल नहीं होता। अगर इस बीच main आगे बढ़ चुका है, तो Git एक असली merge commit बनाता है जो दोनों histories को आपस में जोड़ता है। (2)

कभी-कभी आप वह merge commit तब भी चाहते हैं जब fast-forward मुमकिन होता — यह history में एक साफ़ निशान छोड़ देता है कि एक feature branch मौजूद था और उसे merge किया गया, न कि बदलाव चुपचाप घुल-मिल गया। इसके लिए:

git merge --no-ff feature-x

अगर दोनों तरफ़ से एक ही lines छुई गई हों, तो Git रुक जाता है और conflict को सुलझाने के लिए आप पर छोड़ देता है:

git status

यह उन फ़ाइलों की सूची देगा जो conflicted हैं। हर एक को खोलें, आपको आपस में टकराने वाले बदलावों के इर्द-गिर्द <<<<<<<, =======, और >>>>>>> markers दिखेंगे — जो असल में रहना चाहिए उसे चुनें, markers को हटाएँ, फिर:

git add resolved-file.txt
git commit

और अगर यह इतना उलझ जाए कि इसकी क़ीमत ही न रह जाए, तो आप पूरी चीज़ से बस पीछे हट सकते हैं:

git merge --abort

इससे सब कुछ ठीक वैसे ही वापस आ जाता है जैसे merge शुरू करने से पहले था।

एक ख़राब Push को Undo करना

यही वह स्थिति है जिसमें लोग घबरा जाते हैं, और सच कहूँ तो यह घबराहट अक्सर बेवजह होती है — लेकिन यहाँ यह मायने रखता है कि आप किस fix तक पहुँचते हैं।

अगर थोड़ी भी संभावना हो कि किसी और ने पहले ही वह branch pull कर लिया है, तो history को मत छेड़ें। इसके बजाय एक नया commit जोड़ें जो पुराने को undo कर दे:

git revert <bad-commit-sha>
git push

यह उबाऊ, लेकिन हमेशा-safe विकल्प है। यह कुछ भी rewrite नहीं करता — यह बस ऊपर एक commit जोड़ देता है जो ग़लती को रद्द कर देता है, ताकि बिना किसी को अपनी तरफ़ से कुछ ख़ास किए, सबकी history sync में बनी रहे। (3)

अगर वह branch सचमुच सिर्फ़ आपकी है और अभी तक किसी ने उसे pull नहीं किया, तो आप उसे rewind करके फिर से rewrite कर सकते हैं: (4)

git reset --hard <last-good-commit-sha>
git push --force-with-lease

बस आदत के तौर पर ही सही, plain --force की जगह --force-with-lease इस्तेमाल करें। यह फ़र्क़ दिखने से कहीं ज़्यादा मायने रखता है: --force-with-lease यह जाँचता है कि आपके आख़िरी fetch के बाद से किसी और ने उस branch पर push तो नहीं किया, और अगर किया है तो मना कर देता है। plain --force कुछ भी नहीं जाँचता — यह बिना किसी चेतावनी के किसी और के काम को ख़ुशी-ख़ुशी overwrite कर देगा (5)।

और अगर आप अपने terminal को घूरते हुए यह याद करने की कोशिश कर रहे हैं कि आख़िरी अच्छा commit था क्या — तो यहाँ git log काम नहीं आएगा, क्योंकि यह सिर्फ़ वही commits दिखाता है जो आपकी मौजूदा जगह से पहुँच में हों, और इसमें वह शामिल नहीं है जिससे आप पहले ही reset करके दूर जा चुके हैं। आपको जिसकी ज़रूरत है वह है:

git reflog

यह हर उस जगह को दिखाता है जिस पर आपकी branch हाल ही में point कर चुकी है, उन जगहों समेत जो सामान्य history से बाहर हो गई थीं। उस बिंदु तक पीछे scroll करें जहाँ तक चीज़ें ग़लत नहीं हुई थीं, फिर: (6)

git reset --hard HEAD@{2}

(जो भी position या SHA आपके मामले से असल में मेल खाती हो, उसे यहाँ डाल दें)। reflog आपकी मशीन पर local होता है और आमतौर पर entries को क़रीब 90 दिनों तक रखता है, तो यह इतना "ख़राब pushes के लिए emergency undo" नहीं है जितना कि "लगता है मैंने अभी कुछ तोड़ दिया" के लिए एक सामान्य safety net है — इसके अस्तित्व को याद रखना इस ख़ास स्थिति से बाहर भी काम आता है।

अंतिम विचार

ये तीनों एक ही अंतर्निहित तथ्य पर टिके हैं: Git लगभग कभी भी किसी चीज़ को फ़ौरन नहीं फेंकता। Delete की गई branches, reset किए गए commits, किसी branch की पुरानी positions — ये सब दिखने से कहीं ज़्यादा देर तक टिकी रहती हैं। यही असल में -D, reset --hard, और force-push को रोज़मर्रा इस्तेमाल के लिए काफ़ी safe बनाता है, बशर्ते आपको पता हो कि अगर इनमें से कोई ग़लती साबित हो तो कहाँ जाकर देखना है।

संबंधित लेख

आगे पढ़ने के लिए

  1. git-branch — branch बनाना, list करना, और delete करना।
  2. git-merge — merge strategies और conflict resolution।
  3. git-revert — नए commits बनाकर पुराने commits को undo करना।
  4. git-reset — branch pointer को हिलाना, --soft, --mixed, और --hard के फ़र्क़ के साथ।
  5. git-push: --force-with-lease — यह --force से ज़्यादा safe क्यों है।
  6. git-reflog — उन commits को वापस पाना जो अब सामान्य history में नहीं दिखते।

टिप्पणियाँ