Magit के साथ पिछले कमिट में बदलाव जोड़ें


43

मेरे पास 2 कमिट हैं, ए तब बी, धकेलने के लिए तैयार। मुझे एहसास है कि मैं ए में कुछ जोड़ना भूल गया।

मैं Magit का उपयोग करके इस परिवर्तन को A में कैसे जोड़ सकता हूं? मुझे यह भी पता नहीं है कि मुझे कौन सा Git प्रलेखन देखना चाहिए।

जवाबों:


68

आइए एक पल के लिए दिखावा करें कि आप कमिटमेंट में कुछ जोड़ना चाहते HEADहैं, यानी आपके उदाहरण में "सेकंड कमिट बी"।

cएक बाध्यकारी " aसंशोधन" सुविधाओं पर प्रतिबद्ध पॉपअप । उस कुंजी को दबाने से कमिटमेंट में होने वाले परिवर्तनों का "संशोधन" हो जाएगा HEAD। चूंकि कमिट Git में परस्पर योग्य नहीं हैं, इसलिए यह वास्तव में पुरानी प्रतिबद्ध को एक नई प्रतिबद्ध के साथ बदल देगा। पुराने प्रतिबद्ध संदेश के साथ एक बफर पॉप अप हो जाएगा, ताकि आप इसे संशोधित कर सकते हैं यदि जोड़ा गया परिवर्तन भी आवश्यक है कि आप संदेश को समायोजित करें। हमेशा की तरह, C-c C-cजब आप संदेश को संपादित कर रहे हों तब दबाएं । यह git commit --amendकमांड लाइन पर चलने के बराबर है ।

  • a संशोधन - HEADइसके प्रतिबद्ध संदेश को संपादित परिवर्तनों को जोड़ें और संपादित करें

क्योंकि अक्सर ऐसा होता है कि आपको केवल परिवर्तन या संदेश को समायोजित करना पड़ता है, मैगिट दो अतिरिक्त संस्करण प्रदान करता है:

  • e बढ़ाएँ - HEADप्रतिबद्ध संदेश को संपादित किए बिना चरणबद्ध परिवर्तनों को जोड़ें
  • w रिवॉर्ड - HEADइसमें किए गए बदलावों को जोड़े बिना संदेश को बदल दें

जब आप ऐसा कमिट नहीं करना चाहते हैं HEAD, तो ऊपर काम नहीं करेगा। ये आदेश हमेशा "संशोधित करें" (अर्थात बदलें) HEAD। Git एक प्रतिबद्ध आदेश को संशोधित करने के लिए एक एकल आदेश प्रदान नहीं करता है, HEADइसलिए यह थोड़ा अधिक शामिल है।

मैगिट इस तरह की एक कमांड प्रदान करता है , लेकिन क्योंकि ऐसी परिस्थितियां हैं जिनमें कई चरणों में ऐसा करना बेहतर होता है, हम पहले उस पर चर्चा करेंगे।

के अलावा एक प्रतिबद्ध कमिट HEADको तीन चरणों में तोड़ा जा सकता है:

  1. अस्थायी रूप से कि अन्य प्रतिबद्ध ( A) HEAD
  2. संशोधित करें HEAD(जैसा कि ऊपर वर्णित है), जिसके परिणामस्वरूप प्रतिबद्ध है A'
  3. बताएं कि इसके बाद हुए कमिट फिर से लागू होंगे A, लेकिन शीर्ष पर A'

यह एक इंटरैक्टिव रिबास का उपयोग करके किया जा सकता है। rरिबास पॉपअप दिखाने के लिए टाइप करें। फिर m"एड ए कमिट" रिबास संस्करण को लागू करने के लिए टाइप करें। हाल के कमिट्स वाला एक बफर दिखाई देता है। उस कमेटी में जाएँ जिसे आप संशोधित करना चाहते हैं और C-c C-cउसे चुनना चाहते हैं। इसके बाद Git इतिहास को उस प्रतिबद्ध करता है और स्टेटस बफर में चल रहे रिबेस के बारे में जानकारी दिखाता है।

HEADऊपर वर्णित अनुसार संशोधित करें । फिर गिट से कहें कि आप टाइप करके आए हैं r r। यदि A'और Bसंघर्ष होता है, तो रिबास रुक जाएगा Bऔर आपको संघर्ष को हल करना होगा। r rजारी रखने के लिए आपने ऐसा करने के बाद प्रेस किया है ।

यदि आप जानते हैं कि आपके बदलावों का Aपरिणाम संघर्ष होगा B, तो ऊपर वर्णित अनुसार आगे बढ़ें, अन्यथा निम्नलिखित दृष्टिकोण का उपयोग करें।


Git का उपयोग करके "फ़िक्सअप कमिट्स" बनाने की अनुमति देता है git commit --fixup A। यह एक नई प्रतिबद्ध बनाता है , जो उन परिवर्तनों को रिकॉर्ड करता है जो "किसी अन्य प्रतिबद्ध में किए जाने चाहिए"। वह प्रतिबद्धता नई हो जाती है HEAD। वहाँ भी एक --squashप्रकार मौजूद है । अंतर के बारे में जानकारी के लिए git-commitमैन पेज देखें ।

वास्तव में Aकमिट और नई कमिट को मिलाने के लिए और A'फिर उसके Bऊपर फिर से रीपेस का उपयोग करना होगा। मैगिट ऐसा करने के लिए एक सुविधाजनक आदेश प्रदान करता है r f

उपरोक्त दृष्टिकोण के लिए मुख्य अंतर यह है कि यहां हम पहली बार एक नई प्रतिबद्धता बनाते हैं और फिर हम उस "लक्ष्य" के साथ और फिर से संयोजन करने के लिए रिबेस करते हैं B। ऊपर हमने कमिट करने के बजाय रिबासिंग शुरू की।

मैगिट में --fixupऔर --squashवेरिएंट दोनों कमिट पॉपअप, ऑन fऔर से उपलब्ध हैं s। लेकिन MAGIT भी प्रदान करता है "तत्काल" Fixup और पर स्क्वैश आदेशों की वेरिएंट Fऔर S। ये वैरिएंट "नॉन-इंस्टेंट" वेरिएंट की तरह एक नया कमिट बनाते हैं, लेकिन फिर वे रिबेट का इस्तेमाल करते हुए टारगेट कमिट के साथ तुरंत आपके साथ जुड़ जाते हैं, बिना किसी दूसरी कमांड के।

"त्वरित फिक्स-अप" ( c F) अनिवार्य रूप से "विस्तार के रूप में एक ही बात है HEAD" ( c e), सिवाय इसके कि यह काम करता है किसी भी प्रतिबद्ध के लिए, बस नहीं HEAD


आगे की पढाई:


शीशे की तरह साफ! धन्यवाद, भयानक पैकेज BTW।
मैथ्यू मैर्क

1
खैर, मुझे लगता है कि मेरे उत्तर के दूसरे भाग में कुछ भावपूर्ण भाग हैं। लेकिन उन से बचने के लिए मैं यह पहले से ही लंबे समय से उत्तर की लंबाई दोगुना करने के लिए, तो मैं आप के लिए ;-) यह काम करता है खुश हूँ के लिए होता है
tarsius

इस उत्तर तारसियस के लिए धन्यवाद, यह वास्तव में मेरे लिए काम करता है।
एकेगी

इस स्पष्टीकरण की पहली छमाही की स्पष्टता दूसरी छमाही को पढ़ती है, जिसका पालन करना बहुत कठिन है, काफी निराशाजनक है!
लिन हेडली

git-commitमैन पेज रीडायरेक्ट करता है git-rebase(1)जिसमें ये पंक्तियाँ हैं: मुड़े हुए कमिट के लिए सुझाया गया कमिट मैसेज "स्क्वैश" कमांड के साथ पहले कमिट और उन लोगों के कमिट मैसेज का कॉनसेप्ट है, लेकिन "फिक्स" के साथ कमिट के मैसेज को छोड़ देता है आदेश। IOW, यदि आप पिछली प्रतिबद्ध में कोड को ठीक करना चाहते हैं , तो फ़िक्सअप का उपयोग करें, यदि आप भी प्रतिबद्ध संदेश को ठीक करना चाहते हैं , तो स्क्वैश का उपयोग करें ।
यसुशी शूजी

3

git commit --amend –C HEADGit कमांड है जिसे आप ढूंढना चाहते हैं, और आप Magit में संशोधन कर सकते हैं C-c C-a


मैं मैगिट नवीनतम का उपयोग कर रहा हूं, C-c C-aएक पुराने संस्करण से है (मुझे लगता है)। इसके अलावा, मुझे मदद बफर ( ?) में "संशोधन" का कोई निशान नहीं दिख रहा है ।
मैथ्यू मार्केस

मैगी 2.x समकक्ष के लिए रमी का उत्तर देखें ।
npostavs

3

तो एक कार्यप्रवाह है:

  • अपना परिवर्तन करें
  • सी (कमिट) च (फिक्सअप - अपने फिक्सिंग का चयन करें)

फिर

  • r (रिबेस) -a (ऑटोसक्वाश, डिफॉल्ट किया जा सकता है) i (इंटरेक्टिव)

ऑटोसक्वाश स्वचालित रूप से सभी को स्थानांतरित कर देगा! फिक्सअप सही जगह पर पहुंचता है और उन्हें फिर से बेस पर स्क्वैश करने के लिए सेट करता है।


केवल एक चीज जो मैंने की, वह यह नहीं थी कि आप अपनी पहली बुलेट और दूसरी के बीच स्टेज करें। मारने iसे मुझे उपज मिलती है Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.। सिवाय मेरे कोई भी परिवर्तन नहीं हुआ है। : /
मैथ्यू मार्केस

, खींचने के बाद फिर से कोशिश की Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort। क्या यह मुझे यह बताने की कोशिश कर रहा है कि मेरा फिक्सअप आगामी मर्ज पर खराब हो सकता है?
मैथ्यू मैर्क

@MathieuMarques: "इसके अलावा मेरे पास कोई भी अपरिवर्तित परिवर्तन नहीं है" - गिट आपको लगता है कि आप करते हैं। ध्यान दें कि संदेश मंचन परिवर्तनों का सुझाव देता है, न कि अस्थिर परिवर्तनों का। पुन:, merge in rebaseBUGS के तहत देखें git help rebase। मेरा सुझाव है कि अपस्ट्रीम को खींचने से पहले फिक्सअप करना।
npostavs

1

अंतिम प्रतिबद्ध को संशोधित करने के लिए, यह "सी" है। फिक्सअप कुछ पुरानी प्रतिबद्धताओं को संशोधित करने के लिए है।


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