Git: "पिछली प्रतिबद्धता के बिना 'स्क्वैश' नहीं कर सकता" रिबास के दौरान त्रुटि


95

मेरे पास निम्नलिखित पाठ है git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

अब, जब मैं पहले वाले को स्क्वाश करने की कोशिश करता हूं ( 56bcce7) और पहले वाले "s" को जोड़कर दूसरा उठाता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

Cannot 'squash' without a previous commit

क्या कोई मुझे समझा सकता है कि इसका क्या मतलब है, और मैं इसे कैसे करूं?

मैं पहले कमिट ( 56bcce7) का चयन करना चाहता हूं और दूसरे ( e43ceba) कमिट का "सिलेक्ट एंड रीवर्ड" करता हूं


1
यदि आप वास्तव में स्क्वैश करना चाहते हैं तो HEAD ~ 2 को HEAD ~ 3 में बदलें।
एलपीकेके सेप 20'16

1
और संभवतः --root का उपयोग करें, अगर HEAD ~ 2 आपकी पहली प्रतिबद्धता है: stackoverflow.com/a/598788/2444812
Sybille पीटर्स

जवाबों:


79

इंटरएक्टिव रिबेस आपके द्वारा उपयोग किए जाने के समय आपके द्वारा उपयोग किए जाने वाले रिवर्स ऑर्डर में प्रस्तुत करता है git loggit rebase -iचयनित किए गए कमिट्स को सटीक (टॉप-डाउन) क्रम में पुनः सहेजता है जिसे वे सहेजे गए रिबेस निर्देश फ़ाइल में सूचीबद्ध हैं। स्क्वैशिंग करते समय स्क्वैशिंग के लिए चुनी गई कमेटी को उस कमिट के साथ जोड़ दिया जाता है जो इसे (संपादित) सूची में रखता है, यानी पिछली लाइन से कमिट। आपके मामले में - इसके लिए कोई पिछली प्रतिबद्धता नहीं है 56bcce7। आपको निम्न में से एक करना है

  • git rebase -i HEAD~3(आप छुटकारा पाने के लिए चाहते हैं, तो 56bcce7में 684f917)
  • यदि आप के 56bcce7साथ गठबंधन करने का मतलब है e43ceba, और e43cebaनिर्भर नहीं करता है 56bcce7, तो बस उन्हें फिर से व्यवस्थित करें:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    अद्यतन करें : नीचे दिए गए गस का उत्तर दो करने के बिना, समान काम करने का एक बेहतर तरीका बताता है:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    यह दो कमिट्स को एक में स्क्वैश / मर्ज करेगा। जब इंटरएक्टिव रिबास के लिए एक पुनरीक्षित प्रतिबद्ध संदेश के लिए पूछता है 56bcce7, उस प्रतिबद्ध संदेश प्रदान करें जो 56bcce7और के संघ का वर्णन करता है e43ceba


1
56bcce7 में स्क्वैश करना चाहता हूं e43ceba। तो, मैं यहाँ चरण 1 कैसे करूँ?
14:33 पर Dawny33

82

मेरे पास एक समान समस्या थी जिसे मैंने निम्नानुसार हल किया:

यह वह समूह है जिसे मैं स्क्वैश करना चाहता था:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

जैसा कि आप देख सकते हैं, मैं नहीं चाहता था। 4, लेकिन 1, 2 और 3 में स्क्वैश करने के लिए कोई पिछली प्रतिबद्धता नहीं थी । इसलिए पिछली प्रतिबद्ध त्रुटि के बिना 'स्क्वैश' नहीं किया जा सकता

मेरा समाधान के लिए rविकल्प का उपयोग करना था# r, reword = use commit, but edit the commit message

इसलिए मेरी कमिट सूची इस तरह दिखी:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

सहेजने के बाद, इंटरेक्टिव शेल ने मुझे चुने हुए प्रतिबद्ध की रिकॉर्डिंग के लिए कहा।

उसके बाद, मेरे कमिट लॉग में एक सिंगल कमेंट हुआ, जिसके परिणामस्वरूप एक क्लीनर कमिट हिस्ट्री हुई।


2
मेरे जैसा अगर आपको त्रुटि मिली है क्योंकि आपने किसी भी कमिट को फिर से चुनने या लेने और उल्लेखित त्रुटि (प्रश्न पर) प्राप्त करने के लिए नहीं चुना है, तो आपको git rebase --edit-todoइस उत्तर का संदर्भ देने और फिर ठीक करने की आवश्यकता होगीgit rebase --continue
पुराना-भिक्षु

यह जवाब संक्षिप्त था और इस बिंदु पर, वास्तव में मदद की, धन्यवाद
गोनज़ोफिश

16

मुझे यह समस्या थी और मेरे मामले में ऐसा करने का कारण यह था कि, आप एक नई प्रतिबद्धता पर पुराने कमिट्स को नहीं काट सकते। यहाँ एक उदाहरण है कि आपके पास 3 कमिट हैं:

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

अब अगर आप कहें git rebase -i HEAD~3और आप कुछ ऐसा करें

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

इसके परिणामस्वरूप त्रुटि होगी:

त्रुटि: पिछली प्रतिबद्धताओं के बिना 'स्क्वैश' नहीं कर सकते हैं आप इसे 'गिट रिबेस - हेडिट-टूडो' के साथ ठीक कर सकते हैं और फिर 'गिट रिबेस - कॉन्टिन्यू' चला सकते हैं। या आप रिबेट को 'गिट रिबास - वाबोर्ट' से निरस्त कर सकते हैं।

उपाय :

जब स्क्वैशिंग होती है, तो आपको हाल ही में पुराने लोगों के साथ स्क्वैश करना चाहिए, इसके विपरीत नहीं उदाहरण में यह इस तरह से होगा:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

यह ठीक काम करेगा, आप अपने सभी प्रतिबद्ध संदेश चाहते हैं, मैं स्क्वैश के बजाय फिक्सअप का सुझाव दूंगा


5
धन्यवाद- मैं अक्सर स्क्वैश नहीं करता और सबसे पुरानी कमिटमेंट को चुनने की सलाह दी जाती है, जिससे मुझे एक अनफिट गिट एरर लाने में मदद मिली।
0x574F4F54

2

रिवर्स लॉजिक के साथ स्क्वैश । आप बाद के चरण में इच्छित संदेश का चयन करने में सक्षम होंगे।

  • pickपहला कमिट जो आप के लिए कमिट-मैसेज नहीं चाहते हैं
  • squashया fixupवह कमिटमेंट जिसे आप मर्ज करना चाहते हैं, जब तक कि वह कमिटेड मैसेज नहीं है जो आप वास्तव में चाहते थे।
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • परिवर्तन की पुष्टि करें ( :x)
  • आप जो संदेश नहीं चाहते हैं, उसे हटाएं और केवल उस संदेश को छोड़ दें जिसे आप चाहते हैं (इस मामले में :)Lint.py: Replace deprecated link
  • पसंद की पुष्टि करें ( :x)

आशा है कि यह किसी के लिए स्पष्ट है somebody


1

यह सबसे अच्छा होगा कि केवल कम्पीटिव वाले इंटरेक्टिव एडिटर में कहें, नीचे से ऊपर तक हमेशा स्क्वाश करें और नीचे से स्क्वैश प्राप्त करने के लिए शीर्ष पर "पिक" प्रविष्टि छोड़ दें।


1

मैंने इस दृष्टिकोण की कोशिश की।

git log -n3

यह अंतिम 3 कमिट दिखाएगा जो मुझे यह विचार देगा कि नवीनतम प्रतिबद्ध क्या है और कौन सा पहले गया था। अब कहा गया है,

git rebase -i HEAD ~ 3

सबसे ऊपर अंतिम कमिट चुनें, जिसमें हमें अन्य दो को स्क्वैश करने की आवश्यकता है। आधार आईडी के रूप में चुनी जाने वाली कमिट आईडी इस तरह होगी,

कमिट करें

अन्य दो प्रतिबद्ध आईडी के लिए, उन्हें में बदलें,

स्क्वैश कमिट करें

या केवल,

s कम_द


0

मैं भी इस समस्या से पहले ही मिल चुका हूँ, बस लापरवाह है। आप इस समस्या को अगले की तरह हल कर सकते हैं: जब आप पहले एक (56bcce7) को स्क्वैश करने की कोशिश करते हैं और दूसरी लाइन से पहले आपको "s" जोड़ना चाहिए लेकिन पहले वाला नहीं। आप अगली वेब साइट का भी संदर्भ ले सकते हैं: http://backlogtool.com/git-guide/en/stepup/stepup__.html


1
नमस्ते ! यह बेहतर होगा कि आप स्टैक ओवरफ्लो पर भविष्य के प्रयास के लिए न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण कैसे बनाएं चेकआउट करें । -थैंक यू
मोमिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.