सवाल गिट मर्ज को पूर्ववत करें जिसे अभी तक धक्का नहीं दिया गया है


मेरी मास्टर शाखा के भीतर, मैंने एक किया git merge some-other-branch स्थानीय रूप से, लेकिन मूल मास्टर में परिवर्तन कभी नहीं धक्का दिया। मेरा विलय करने का मतलब नहीं था, इसलिए मैं इसे पूर्ववत करना चाहता हूं। एक करते समय git status मेरे विलय के बाद, मुझे यह संदेश मिल रहा था:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

कुछ के आधार पर निर्देश मुझे मिला, मैंने दौड़ने की कोशिश की

git revert HEAD -m 1

लेकिन अब मुझे यह संदेश मिल रहा है git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

मैं नहीं चाहता कि मेरी शाखा किसी भी काम से आगे बढ़े। मैं उस बिंदु पर कैसे वापस आ सकता हूं?


3088
2018-03-05 19:24


मूल


यदि आपको इतिहास को संरक्षित करने की आवश्यकता है, तो दूसरे शब्दों में एक बदलाव है जिसे किसी ने कभी भी आप से खींचा है या आपने इसे कहीं नीचे यूरी उशाकोव में समाधान का उपयोग करने के लिए प्रेरित किया है! - Sedrik
कृपया वर्तमान जीतने वाले उत्तर को अचयनित करें, यह असुरक्षित है (जैसा कि कई ने बताया है) हालांकि अभी भी वोट इकट्ठा कर रहा है। मेरे लिए "एमबीओ" - सबसे अच्छा दिखता है, हालांकि इसमें कम अंक हैं। - inger
अगर आप की जरूरत है इतिहास संरक्षित करें, उपयोग यूरीनीचे नीचे समाधान है! (बस @ सेड्रिक टिप्पणी के लिए एक लिंक जोड़ना) - cregox
सम्बंधित: पिछले गिट प्रतिबद्ध पर वापस जाएं।
यह सीधे गितूब से एक महान संसाधन है: गिट के साथ कुछ भी (पूर्व) कैसे पूर्ववत करें - jasonleonhard


जवाब:


साथ में git reflog जांच करें कि कौन सा प्रतिबद्ध विलय से पहले है (गिट लॉग से गिट रीफ्लॉग बेहतर विकल्प होगा)। फिर आप इसे रीसेट कर सकते हैं:

git reset --hard commit_sha

एक और तरीका भी है

git reset --hard HEAD~1

आपको वापस 1 प्रतिबद्ध मिलेगा।

ध्यान रखें कि किसी भी संशोधित और असामान्य / अनस्टेड फ़ाइलों को उनके असम्बद्ध राज्य में रीसेट कर दिया जाएगा। उन्हें या तो स्टैश परिवर्तनों को दूर रखने या देखने के लिए --merge नीचे विकल्प।


जैसा कि @ वेल्मोंट ने अपने जवाब में नीचे दिया है, इस प्रत्यक्ष मामले में:

git reset --hard ORIG_HEAD

बेहतर परिणाम प्राप्त कर सकते हैं, क्योंकि यह आपके परिवर्तनों को संरक्षित रखना चाहिए। ORIG_HEAD विलय होने से पहले सीधे एक प्रतिबद्धता को इंगित करेगा, इसलिए आपको इसके लिए शिकार करने की आवश्यकता नहीं है।


एक और टिप का उपयोग करना है --merge के बजाय स्विच करें --hard चूंकि यह अनावश्यक रूप से फ़ाइलों को रीसेट नहीं करता है:

--merge

इंडेक्स को रीसेट करता है और काम करने वाले पेड़ में फ़ाइलों को अपडेट करता है जो <प्रतिबद्ध> और HEAD के बीच अलग होते हैं, लेकिन इंडेक्स और वर्किंग पेड़ के बीच अलग-अलग होते हैं (यानी जिनके पास बदलाव नहीं किए गए हैं)।


3380
2018-03-05 19:34



मुझे नहीं लगता कि यह (हमेशा?) काम करेगा - "विलय से पहले" सबसे हालिया प्रतिबद्धता होगी जो दूसरी शाखा से विलय हो गई थी - यह वर्तमान शाखा पर सबसे हालिया प्रतिबद्धता नहीं होगी । सही? (यह सिर्फ इसका परिणाम हो सकता है git log डिफ़ॉल्ट रूप से दिखाने के लिए चुनता है - शायद एक अलग आउटपुट है git log या git reflog इसके लिए इस्तेमाल किया जा सकता है) - John Bachir
मुझे लगता है कि यह निर्भर हो सकता है कि आप विलय स्क्वैश करते हैं या नहीं। - Marcin Gil
@ जॉनबचिर सही है। में git log आउटपुट, आप दो माता-पिता को देखना चाहते हैं। आपकी शाखा में नवीनतम प्रतिबद्धता है, एक शाखा में नवीनतम प्रतिबद्धता है जिसे आप विलय कर चुके हैं। आप चाहते हैं कि git reset --hard आपके द्वारा विलय की गई शाखा पर माता-पिता को प्रतिबद्ध करने के लिए। - Justin
@ जॉनबचिर: जब तक "विलय" वास्तव में तेज़ आगे नहीं होता है, तब तक यह लॉग के शीर्ष पर एक नई प्रतिबद्धता होगी, और इस प्रतिबद्धता में दो माता-पिता हैं (या यदि आप ऑक्टोपस करते हैं तो 2 से अधिक विलय)। यदि आप इसे एक विलय प्रतिबद्धता को हटाते हैं, तो विलय से आने वाले सभी पुराने काम भी गायब हो जाएंगे। सुरक्षित होने के लिए, हालांकि, एक रीसेट गिट के बाद आपको बताएगा कि नया सिर कहां है: "हेड अब 88a04de <प्रतिबद्ध संदेश>" पर है। मैं हमेशा यह सुनिश्चित करने के लिए देखता हूं कि मैं समाप्त हो गया जहां मुझे उम्मीद थी। मेरी परियोजना चीजों को यादगार रखने के लिए एक मानक शाखा नामकरण योजना का उपयोग करती है। - Mark E. Haase
जो मैंने उपयोगी पाया वह "गिट रीफ्लॉग" को देखना था और मैंने मास्टर में किए गए आखिरी प्रतिबद्धता की तलाश की थी। फिर करो git reset --hard <commit_sha> - Max Williams


मान लें कि आपका स्थानीय मास्टर मूल / मास्टर से आगे नहीं था, आपको ऐसा करने में सक्षम होना चाहिए

git reset --hard origin/master

फिर आपका स्थानीय master शाखा को समान दिखना चाहिए origin/master


1290
2018-03-17 18:06



@Carter यह वास्तव में सबसे अच्छा जवाब नहीं है। यह संभव है कि मूल / मास्टर कुछ स्थानीय लोगों द्वारा विलय के ठीक पहले आपके स्थानीय मास्टर से आगे हो सकता है, उस स्थिति में यह वांछित परिणाम नहीं दे सकता है - Dhruva Sagar
@ ध्रुव-सागर हां, लेकिन जब तक गिट यह नहीं कहता कि आप पीछे हैं, और आप नहीं लाते हैं, तो आपको ठीक होना चाहिए। - Kelvin
धन्यवाद! यह सही है अगर (और केवल अगर) आपके पास रिमोट रिपोजिटरी है। - tomc
नहीं, यह इस प्रश्न के लिए सही नहीं है, "मान लें" खंड देखें। एमबीओ का जवाब वास्तव में इस मामले को शामिल करता है, और वह मामला जहां विलय एकमात्र स्थानीय प्रतिबद्धता नहीं है। - inger
एक बार फिर, शायद यह चेतावनी जवाब में खुद जाना चाहिए: हमेशा गिट इतिहास को फिर से लिखने से बचें! - cregox


देख गिट बुक में अध्याय 4 तथा लिनस टोरवाल्ड्स द्वारा मूल पोस्ट

एक विलय पूर्ववत करने के लिए वह पहले से ही धक्का दिया गया था:

git revert -m 1 commit_hash

यदि आप फिर से शाखा कर रहे हैं, तो लिनस ने कहा, रिवर्ट को वापस करना सुनिश्चित करें।


1085
2018-06-02 16:31



^ - इतिहास को तोड़ने के बिना विलय को वापस करने का तरीका केवल एकमात्र सही उत्तर है। यदि आप साझा रेपो के साथ काम करते हैं तो यह महत्वपूर्ण है। - Ruslan Kabalin
इसे और अधिक नहीं हटाया गया है क्योंकि परिवर्तन कभी नहीं धकेल दिया गया है, इसलिए इतिहास में आकस्मिक विलय जोड़ने का कोई कारण नहीं है। इसे स्थानीय रूप से मिटाएं और आगे बढ़ें। - Justin
एक ऐसी प्रतिबद्धता को वापस लेना जो धक्का नहीं दिया गया है, इतिहास में बदसूरत दिखता है और इसे और अधिक भ्रमित करता है। यदि आपने अभी तक इसे धक्का नहीं दिया है, तो यह आपके सिर को पीछे की ओर ले जाने के लिए और अधिक समझ में आता है, फिर कुछ धक्का देता है। - Mark E. Haase
"यह अधिक नहीं किया गया है क्योंकि ..." - फिर भी, मेरे जैसे लोग इस प्रश्न पर आ रहे हैं क्योंकि हमने अतिरिक्त काम किया है / धक्का दिया है, यह अमूल्य है। - perfectionist
@ अतिवादवादी सहमत हुए :) इच्छा की तरह इस जवाब को किसी अन्य प्रश्न पर माइग्रेट करने का एक तरीका था - (शायद वहाँ है?) - mikermcneil


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

git reset --merge ORIG_HEAD

निर्देशी ORIG_HEAD मर्ज से पहले मूल प्रतिबद्धता को इंगित करेगा।

( --merge विकल्प के विलय के साथ कुछ भी नहीं है। यह बस की तरह है git reset --hard ORIG_HEAD, लेकिन सुरक्षित है क्योंकि यह असामान्य परिवर्तनों को स्पर्श नहीं करता है।)


833
2018-01-29 15:46



हां, यह अब तक का सबसे आसान तरीका है। मुझे आश्चर्य है कि अन्य उत्तरों की तुलना में इसका इतना कम वोट क्यों है। - Pablo Olmos de Aguilera C.
यदि आपने अपने काम करने वाले पेड़ को गंदे कर दिया है, git reset --merge ORIG_HEAD उन परिवर्तनों को संरक्षित करता है। - yingted
यह मेरे लिए जवाब है। की कोई ज़रूरत नहीं git reflog या फिर कुछ और। धन्यवाद। - crmpicco
हाँ, सबसे अच्छा जवाब। यह एक उदाहरण है कि स्टैक ओवरफ्लो वोटिंग सिस्टम अनिवार्य रूप से केवल उन उत्तरों को पुरस्कृत करता है जो शुरुआती पोस्ट किए गए हैं। - samthebest
खैर, यह जवाब स्वीकार किए जाने के लगभग तीन साल बाद आया; लेकिन मैं सहमत हूं, यह बहुत अच्छा काम किया! - Mike Branski


नए गिट संस्करणों के साथ, यदि आपने अभी तक विलय नहीं किया है और आपके पास एक विलय संघर्ष है, आप बस कर सकते हैं:

git merge --abort

से man git merge:

[यह] विलय के परिणामस्वरूप विवादों के परिणामस्वरूप ही चलाया जा सकता है। git merge --abort विलय प्रक्रिया को रोक देगा और पूर्व विलय राज्य का पुनर्निर्माण करने का प्रयास करेगा।


307
2018-02-12 02:13





आपको पिछली प्रतिबद्धता पर रीसेट करना चाहिए। यह काम करना चाहिए:

git reset --hard HEAD^

या और भी HEAD^^ उस वापसी प्रतिबद्धता को वापस करने के लिए। यदि आप सुनिश्चित नहीं हैं कि आपको कितने कदम उठाने चाहिए तो आप हमेशा एक पूर्ण SHA संदर्भ दे सकते हैं।

यदि आपको समस्याएं होती हैं और आपकी मास्टर शाखा में कोई स्थानीय परिवर्तन नहीं होता है, तो आप रीसेट कर सकते हैं origin/master


104
2018-03-05 19:31



सबसे अच्छा जवाब आईएमएचओ, ओपी के अपने एक को शामिल करता है (क्यू में केवल 1 कदम माना जाता है, जो क्यू में मामला प्रतीत होता है), साथ ही randomguy3 के शॉर्टकट एक (जो काम करता है जब "आपकी मास्टर शाखा में कोई स्थानीय परिवर्तन नहीं था ") - inger
मैं पूरी तरह से सहमत हूं कि यह सबसे अच्छा जवाब है !!! - Konstantin
आप टिप्पणीकार, @Inger और @ Konstantin, क्यों? मेरे उत्तर के निर्माण के बाद आप यहां आए थे, और यह अधिक सही है। बस एक कदम ऊपर जाकर अक्सर गलत होता है, और आपको वास्तव में गिनना होगा कि आपको कितनी दूर जाने की जरूरत है। गिट पहले से ही सेट है ORIG_HEAD तुम्हारे लिए, इसका इस्तेमाल क्यों नहीं करें? - odinho - Velmont
क्या यह स्थानीय परिवर्तन भी रीसेट करेगा? #कृपया अद्यतन करें। - CoDe
यह मेरे लिए पूरी तरह से काम करता है, इस तरह के सिर को रीसेट करने से यहां आधा जवाबों की तुलना में अधिक समझदारी होती है। - Varda Elentári


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

git reflog कुछ ऐसा वापस कर सकता है:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

पहली पंक्ति इंगित करती है कि एक विलय हुआ। दूसरी पंक्ति मेरे विलय से पहले समय है। मैं सामान्यत git reset --hard 43b6032 विलय से पहले ट्रैक करने के लिए इस शाखा को मजबूर करने के लिए, और आगे बढ़ना।


78
2017-12-19 17:51



Omigosh जीवन बचतकर्ता :) - M.G.Palmer
ओह आदमी। बहुत बहुत धन्यवाद। - Ross Henderson
यह शीर्ष जवाब क्यों नहीं है जिसे मैं नहीं जानता। यह पूरी तरह से काम किया। - Matt
इसके लिए धन्यवाद, अद्भुत! - zooblin