क्यों जीआईटी गुम-मी विकल्प की शिकायत करता है?


183

इसलिए मैं अन्य लोगों के साथ एक परियोजना पर काम कर रहा हूं, और कई गीथूब कांटे काम कर रहे हैं। किसी ने सिर्फ एक समस्या के लिए एक ठीक किया और मैं उसके कांटे में विलीन हो गया, लेकिन फिर मुझे एहसास हुआ कि मैं एक बेहतर समाधान पा सकता हूं। मैं अपने द्वारा किए गए वचन को वापस लेना चाहता हूं। मैंने ऐसा करने की कोशिश की, git revert HEADलेकिन इसने मुझे यह त्रुटि दी:

घातक: प्रतिबद्ध <SHA1> एक मर्ज है, लेकिन कोई विकल्प नहीं दिया गया था।

इसका क्या मतलब है? जब मैं विलय और प्रतिबद्ध हुआ, तो मैंने "उपयोगकर्ता नाम के साथ विलय" कहने के लिए -m विकल्प का उपयोग किया।

मुझसे यहां क्या गलत हो रहा है?

जवाबों:


216

डिफ़ॉल्ट रूप git revertसे एक मर्ज कमिट को वापस करने से इनकार करता है क्योंकि वास्तव में इसका मतलब अस्पष्ट है। मुझे लगता है कि HEADवास्तव में एक मर्ज कमिट है।

यदि आप मर्ज कमिट को वापस करना चाहते हैं, तो आपको यह निर्दिष्ट करना होगा कि आप जिस मर्ज के मुख्य ट्रंक के रूप में विचार करना चाहते हैं, उसके माता-पिता को क्या करना है।

अक्सर यह माता-पिता का नंबर एक होगा, उदाहरण के लिए यदि आप पर थे masterऔर किया था git merge unwantedऔर फिर विलय को वापस करने का फैसला किया unwanted। पहला माता-पिता आपकी प्री-मर्ज masterशाखा होगा और दूसरा माता-पिता की नोक होगी unwanted

इस मामले में आप कर सकते हैं:

git revert -m 1 HEAD

4
ठीक है धन्यवाद। मुझे मर्ज से प्रभावित दो फ़ाइलों को बदलना आसान लगा और फिर मेरे कुछ अन्य बदलाव भी किए।
icnhzabot

43
मुझे यह जानकारी कहां मिल सकती है कि क्या मुझे -m1 या -m2 का उपयोग करना है, ...?
पैट्रिक कॉर्नेलिसन

34
git cat-file -p [MERGE_COMMIT_ID]मूल शाखाओं को क्रम में दिखाएगा। पहला सूचीबद्ध होगा -m 1, दूसरा -m 2
नास्त्रोमो

2
git revert [HASH] -m 2मुझे बता रहा है शाखा पर 1.x-1.x करने के लिए कुछ भी नहीं है, निर्देशिका साफ काम कर रही है, लेकिन मेरी प्रतिबद्ध वापस नहीं है।
जेनलैम्पटन

3
इसलिए अगर मुझे पिछले 10 मर्ज वापस करने की आवश्यकता है (जो कि काफी संभावना है क्योंकि git एक मर्ज को स्वचालित रूप से हर बार करता है जब मैं किसी अन्य डेवलपर से परिवर्तन में खींचता हूं) मुझे हर एक मर्ज के लिए ऐसा करना होगा? क्या यही कारण है कि गिट के प्रशंसक रिबासिंग के लिए इतने उत्सुक हैं, क्योंकि रिवर्ट मूल रूप से बेकार है?
न्यूट्रिनो

46

दूसरे व्यक्ति ने फू के ऊपर बार बनाया, लेकिन आपने इस बीच बाज बनाया और फिर एक इतिहास बना दिया

$ गित लोला
* 2582152 (HEAD, मास्टर) मर्ज शाखा 'अन्यगोई'
| \  
| * c7256de (अन्यता) बार
* b7e7176 बाज़
| /  
* 9968f79 फू

नोट: गिट लोला एक गैर-मानक लेकिन उपयोगी उपनाम है।

कोई पासा नहीं git revert:

$ जीआईटी ने हेड को वापस कर दिया
घातक: प्रतिबद्ध 2582152 ... एक मर्ज है, लेकिन कोई विकल्प नहीं दिया गया था।

चार्ल्स बेली ने हमेशा की तरह एक शानदार जवाब दिया । में के git revertरूप में उपयोग करना

$ git रिवर्ट --no-edit -m 1 HEAD
[मास्टर e900aad] "मर्ज ब्रांच 'अन्यग'
 0 फाइलें बदल गईं, 0 प्रविष्टि (+), 0 विलोपन (-)
 हटाएं मोड 100644 बार

प्रभावी रूप से हटाता है barऔर एक इतिहास बनाता है

$ गित लोला
* e900aad (HEAD, मास्टर) रिवर्ट "मर्ज ब्रांच 'अदरगी'"
* 2582152 मर्ज शाखा 'अन्यगोई'
| \  
| * c7256de (अन्यता) बार
* b7e7176 बाज़
| /  
* 9968f79 फू

लेकिन मुझे संदेह है कि आप मर्ज कमिटमेंट को फेंकना चाहते हैं:

$ जीआईटी रीसेट - हेड HEAD ^
HEAD अब b7e7176 बाज पर है

$ गित लोला
* b7e7176 (HEAD, मास्टर) बाज
| * c7256de (अन्यता) बार
| /  
* 9968f79 फू

जैसा कि मैनुअल में प्रलेखित हैgit rev-parse

<rev>^, उदाहरण के लिए ^ ^,v1.5.1^0 एक संशोधन पैरामीटर के लिए एक
प्रत्यय ^का अर्थ है उस प्रतिबद्ध वस्तु का पहला अभिभावक। ^<n>मतलब n -थ पैरेंट ( यानी <rev>^ के बराबर <rev>^1) है। एक विशेष नियम के रूप में, <rev>^0कमिट का मतलब है और इसका उपयोग तब किया जाता है जब <rev>किसी ऑब्जेक्ट ऑब्जेक्ट का ऑब्जेक्ट नाम होता है जो एक कमिट ऑब्जेक्ट को संदर्भित करता है।

इसलिए आह्वान करने से पहले git reset, HEAD^(या HEAD^1) b7e7176 था और c7256de HEAD^2था, अर्थात , क्रमशः मर्ज किए गए पहले और दूसरे माता-पिता।

इससे सावधान रहें git reset --hardक्योंकि यह काम को नष्ट कर सकता है।


3
यह एक मिश्रित है, ऊपर muddled, दुनिया को हिलाकर रख दिया। सिवाय लोला के। इस शानदार उर्फ ​​के लिए एक लाख धन्यवाद।
बार्नी

lolaअपने git कमांड में जोड़ने का आसान तरीका :git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. गिब्स

8

मुझे यह समस्या थी, समाधान था कि कमिट ग्राफ (gitk का उपयोग करके) देखें और देखें कि मेरे पास निम्नलिखित थे:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

मैं अब समझ गया हूं कि मैं करना चाहता हूं

git cherry-pick -m 2 mycommitsha

इसका कारण यह है कि -m 1आम माता-पिता के आधार पर विलय होगा जहां -m 2शाखा y के आधार पर विलय होता है, यही वह है जिसे मैं चेरी-पिक करना चाहता हूं।


1
संभवतः क्योंकि यह संबंधित नहीं है git-revert, जो कि यह सवाल है।
pnomolos 16

1
मुझे लगता है कि यह प्रश्न -mविकल्प के बारे में है, विशेष रूप से इसके बारे में नहीं git merge। यानी, -mविकल्प के उपयोग के पीछे तर्क रेवेरेट्स और चेरी-पिक्स के समान होगा। अगर यह सच नहीं है, तो कृपया हमें बताएं। चूंकि मुझे कोई अन्य प्रश्न नहीं मिला है जो विशेष रूप से चेरी-पिक का उपयोग करते हैं, इसलिए इस उत्तर के लिए धन्यवाद, जिसने शायद इस प्रश्न और उपयोगी, प्रासंगिक चर्चा को खोजने में मेरी मदद करने के लिए Google का नेतृत्व किया!
nealmcb 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.