धक्का दिए जाने के बाद एक मर्ज वापस करें


80

मेरे द्वारा किए गए चरण:

मेरी दो शाखाएँ हैं शाखा 1 और शाखा 2,

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

मैंने संघर्षों को हल किया और ए

$git commit -m "Merge resolved"

फिर

$git checkout branch1
$git merge branch2
$git push origin branch1

अब मुझे एहसास हुआ कि चरण 1 पर होने के दौरान, ऑटो मर्जिंग ने कुछ कोड हटा दिया और परिवर्तन कोड को धक्का दे दिया गया, अब मैं किसी भी परिवर्तन को वापस करने के लिए अपने प्रारंभिक स्थिति में वापस जाना चाहता हूं। कुछ तत्काल मदद के लिए?


क्या जीआईट रीवर्ट वह नहीं करता जो आप चाहते हैं?
फ्रेडरिक चेउंग

1
यह संदेश देता है: घातक: प्रतिबद्ध b4a758b36a5bde9311061fe7b56e4f47859de052 एक मर्ज है, लेकिन कोई विकल्प नहीं दिया गया था। @FrederickCheung
बिजेंद्र

-M विकल्प के बारे में मैनुअल देखें। kernel.org/pub/software/scm/git/docs/git-revert.html कुछ ही समय में आप -m 1 या -m 2 का उपयोग कर सकते हैं। यह उन दो अभिभावकों में से एक का चयन करता है जिन्हें आप वापस करना चाहते हैं।
इल्या इवानोव

याया मैंने git का उपयोग किया था -m 1 SHA, अब सभी परिवर्तन मेरे स्थानीय में किए जाने वाले परिवर्तनों के रूप में आते हैं,
बिजेंद्र

Vim में एक त्रुटि थी, जो इसे वापस लाते समय ऑपरेशन से बाहर निकल रही थी, मैंने git config --global core.editor / usr / bin / vim को चलाया और इसने इस समस्या को ठीक कर दिया और फिर समस्या को ठीक करने के लिए सफलतापूर्वक भाग लिया। थैंक्स
बिजेंद्र

जवाबों:


95

आप आधिकारिक गाइड के बाद मर्ज वापस कर सकते हैं , हालांकि यह गलत धारणा के साथ गिट छोड़ देता है कि मर्ज किए गए कमिट अभी भी लक्ष्य शाखा पर हैं।

मूल रूप से आपके पास है:

git revert -m 1 (Commit id of the merge commit)

26
एक साथ सावधान रहना चाहिए 1। इसका अर्थ firstहै मर्ज कमिटमेंट का जनक। लेकिन यदि कोई (काल्पनिक रूप से) 'दुर्घटना से' शाखा में मास्टर का विलय कर देता है, तो तेजी से आगे -m 2बढ़ने वाले मास्टर को मर्ज किए गए कमिट में - किसी को मास्टर पर मर्ज को वापस करने के लिए उपयोग करना चाहिए ।
Krzysztof Jabłoński

1
उससे सावधान रहें 1। इसने मर्ज को आंशिक रूप से वापस करके मेरी रिपॉजिटरी को गड़बड़ कर दिया, जबकि मैं मर्ज को पूरी तरह से वापस करना चाहता था। मैं वापस लौट आया!
व्यावहारिक गीक

1
@JavadSadeqzadeh या, आपने एसओ से कॉपी-पेस्ट करके अपनी रिपॉजिटरी में गड़बड़ी की, पूरी तरह से जांच किए बिना कि जवाब क्या देता है
joel

33

git reflog <branch>यह जानने की कोशिश करें कि मर्ज होने से पहले आपकी शाखा कहां थीgit reset --hard <commit number> पुराने संशोधन को बहाल करने के लिए।

Reflog आपको शाखा के पुराने राज्य दिखाएगा, इसलिए आप इसे अपने पसंद के किसी भी परिवर्तन पर वापस कर सकते हैं।

सुनिश्चित करें कि जब आप गिट रीसेट का उपयोग करते हैं तो आप सही शाखा में हैं

दूरस्थ रिपॉजिटरी इतिहास को बदलने के लिए, आप कर सकते हैं git push -f, हालांकि इसकी अनुशंसा नहीं की जाती है क्योंकि कोई भी आपके द्वारा पुश किए गए परिवर्तनों को डाउनलोड कर सकता है।


1
मैंने कोड को दूरस्थ शाखा में धकेल दिया था, यह कैसे वहां से कोड को वापस
लाएगा

3
अगर आपने पहले ही धक्का दे दिया है, तो आप स्थानीय इतिहास को फिर से लिखना नहीं चाहते हैं, जैसा कि इल्या ने कहा है
एमएस-टीजी

2
क्षमा करें, मैंने उस चीज़ को याद किया है ... कभी-कभी आप दूरस्थ इतिहास को फिर से लिखने के लिए git push -f का उपयोग कर सकते हैं। यह आपके दूरस्थ रिपॉजिटरी कॉन्फ़िगरेशन और टीम के अन्य सदस्यों पर निर्भर करता है (यदि वे आपको उस जबरदस्ती धक्का नहीं देंगे)।
इल्या इवानोव

8

पहला विकल्प का उपयोग है git revert

git revert -m 1 [sha-commit-before-merge]

git revertपरिवर्तन पूर्ववत हो जाएंगे लेकिन इतिहास रखेंगे। इसलिए आप उसी शाखा में काम करना जारी नहीं रख पाएंगे क्योंकि आप विलय की गई शाखा और आपकी सुविधा शाखा के बीच वास्तविक अंतर नहीं देख सकते हैं। इतिहास को भी हटाने के लिए निम्न तरीके का उपयोग करें। इसे बहुत सावधानी से करें और यदि आप केवल एक ही समय में शाखा में परिवर्तन कर रहे हैं।

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force

1

मेरे मामले में, मैंने अपनी शाखा (कहते हैं: मेरी शाखा) को किसी अन्य सुविधा शाखा (सुविधा-शाखा) में विलय कर दिया, लेकिन मास्टर नहीं। इसलिए मेरी शाखा का इतिहास इस प्रकार था:

my-branch (before merge)

---master----m1----m2----m3---m4

इसे दूसरे के साथ विलय करने के बाद, feature-branchजो f1, f2गुरु के शीर्ष पर था , यह इस तरह बन गया:

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

ऐसा शायद इसलिए हुआ क्योंकि अपनी शाखा पर काम करते हुए मैंने 2 कमिट के बाद मास्टर से मर्ज किया था, या 2 शाखाओं में से एक मास्टर के साथ तारीख तक नहीं हो सकता था। तो इस मामले git revert -m 1में काम नहीं कर रहा था क्योंकि यह उन लोगों को छोड़ रहा था f1औरf2 बीच में कमिट करता था।

समाधान सरल था, जो सामान्य परिदृश्यों के मामले में काम करेगा, जहां हमारे बीच में कमिट नहीं है:

git rebase -i HEAD~6

6 के बजाय उपयुक्त संख्या का उपयोग करें जिसके आधार पर आप कितने अतीत को बदलना चाहते हैं। अब विम एडिटर खोला जाता है, बस अवांछित चिह्न को dropउसी तरह चिह्नित करें और :wq सत्यापन लॉग का उपयोग करना छोड़ दें :

git log --oneline 

बल धक्का

git push -f

अब दूरस्थ शाखा पिछले राज्य में होनी चाहिए।

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