मैं दो प्रतिबद्धों को एक प्रतिबद्ध में कैसे जोड़ सकता हूं?


102

मेरे पास 2 कमिट के साथ एक शाखा 'फर्स्टप्रोजेक्ट' है। मैं इन कमिट्स से छुटकारा पाना चाहता हूं और उन्हें सिंगल कमिटमेंट के रूप में पेश करना चाहता हूं।

आदेश git merge --squashआशाजनक लगता है, लेकिन जब मैं git merge --squashअपना टर्मिनल चलाता हूं तो बस कमांड के लिए विकल्प लाता है। सही कमांड क्या है?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

मुझे नहीं लगता कि यह सही आदेश है। इसके अलावा, मुझे संदेह है कि आप भी उस तरह से कमिट कर सकते हैं।
BSull

नाह आप कई कमिट्स को एक कमिट में बदल सकते हैं: git-scm.com/book/en/Git-Tools-Rewriting-History मेरा प्रश्न इसके लिए विशिष्ट कमांड के बारे में है।
डॉन पी

@ पूरी तरह से आप अपनी इच्छानुसार किसी भी तरीके से बदलाव कर सकते हैं। वे सचमुच किसी भी समय पूरी तरह से संपादन योग्य हैं। यदि आप दूसरों के साथ कोड साझा कर रहे हैं, तो ऐसा करना आपके इतिहास को फिर से लिख देगा और आप प्रभावी रूप से हर किसी की तुलना में एक अलग शाखा के साथ काम करेंगे।
meagar

इस पर कभी नकेल नहीं कसी जानी चाहिए थी। वास्तव में, कि अन्य को भी व्यापक के रूप में बंद किया जाना चाहिए था। अन्य प्रश्न के रूप में चिह्नित किया जाता है, क्योंकि यह एक आवश्यक जटिल है क्योंकि इसमें एक पूर्व छूट देना शामिल है।
इवान कैरोल

जवाबों:


143

आप git rebase -iएक इंटरैक्टिव रिबेस करना चाहते हैं ।

यदि आप वर्तमान में अपने "कमिट 1" पर हैं, और आप जिस कमिटमेंट को मर्ज करना चाहते हैं, "कमिट 2" है, तो वह पिछली कमिट है, आप चला सकते हैं git rebase -i HEAD~2, जो एक एडिटर को सूचीबद्ध करेगा, जो रिबास को कम कर देगा। आपको "पिक" से शुरू होने वाली दो लाइनें देखनी चाहिए। स्क्वैशिंग के साथ आगे बढ़ने के लिए, दूसरी लाइन के पहले शब्द को "पिक" से "स्क्वैश" में बदलें। फिर अपनी फ़ाइल सहेजें, और छोड़ें। Git आपकी पहली प्रतिबद्ध को आपकी दूसरी अंतिम प्रतिबद्ध में स्क्वैश करेगा।

ध्यान दें कि यह प्रक्रिया आपकी शाखा के इतिहास को फिर से लिखती है। यदि आप अपने कोड को कहीं आगे बढ़ा रहे हैं, तो आपको git push -fअपने परिवर्तनों को खींचने के लिए कुछ हुप्स के माध्यम से अपने कोड को साझा करना होगा और किसी को साझा करना होगा।

ध्यान दें कि यदि दो विचाराधीन प्रश्न शाखा में अंतिम दो नहीं हैं , तो प्रक्रिया थोड़ी भिन्न होगी।


2
कैसे करें Then write your file, and quit? मैं एंड्रॉइड स्टूडियो टर्मिनल का उपयोग कर रहा हूं, गीट कंसोल को स्वयं या यहां तक ​​कि सोर्सट्री सॉफ्टवेयर द्वारा गिट कंसोल को खोला गया है। लेकिन बचाने और छोड़ने के लिए कैसे?
डॉ.अजकी

1
कैसे 2 को जोड़ती है जो शाखा पर अंतिम दो कमिट नहीं हैं?
वीशी ज़ेंग

1
@meagar मुझे लगता है कि इसका कोई मतलब नहीं है ... यदि आप इस मुद्दे (इस का एक डुप्लिकेट) की जांच करते हैं, तो 'दिशा' को तोड़ना एक बड़ा अंतर था और पूरे मामले की जड़ थी (लगभग 200 अपवर्जन के साथ पहली टिप्पणी देखें) गलत तरीके से
मारना

1
@PandWood आप उत्तर को गलत बता रहे हैं। पहला तरीका सरल गलत था , अलग नहीं । आप केवल पीछे की ओर स्क्वैश कर सकते हैं, इससे पुराने कमिट को नए सिरे से स्क्वैश करने के बारे में सोचने का कोई मतलब नहीं है, लेकिन अगर आप ऐसा कर सकते हैं तो यह एक ही ऑपरेशन होगा।
meagar

1
मैं "दूसरी पंक्ति के पहले शब्द को बदलने के लिए" समझा - दूसरी पंक्ति क्या?
एंड्रयू टोर

75

मेरे जैसे भुलक्कड़ लोगों के लिए आलसी सरल संस्करण:

git rebase -i HEAD~3 या फिर 3 के बजाय कई कमिट करता है।

इसे चालू करें

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

इस मामले में

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

और कुछ कार्रवाई करें जहां आप हिट करते हैं escफिर enterपरिवर्तनों को बचाने के लिए। [1]

जब अगली स्क्रीन आती है, तो उन कचरा # लाइनों से छुटकारा पाएं [2] और एक नया प्रतिबद्ध संदेश या कुछ और बनाएं, और उसी escape enterक्रिया को करें। [1]

Wowee, आपके पास कम आवागमन है। या आपने बस सब कुछ तोड़ दिया।


[१] - या आपके गिट कॉन्फ़िगरेशन के साथ जो भी काम करता है। यह सिर्फ एक ऐसा सिक्वेंस है जो मेरे सेटअप को देखते हुए कुशल है।

[२] - आपको # this is your n'th commitइन संदेशों के ठीक नीचे कुछ मूल जैसे कुछ सामान दिखाई देंगे । आप इन पंक्तियों को निकालना चाहते हैं, और n कमिट्स के इरादों को प्रतिबिंबित करने के लिए एक प्रतिबद्ध संदेश बनाते हैं जिसे आप 1 में जोड़ रहे हैं।


1
बहुत संक्षिप्त समाधान - धन्यवाद। sयहाँ उल्लिखित स्क्वैश का उपयोग करना आसान हो सकता है । कमिट का उपयोग करने के लिए, लेकिन पिछले
कमेंट में पिघल जाएं

तुम सिर्फ है, तो 2करता और गठबंधन करने के लिए एक ही चाहते 2प्रतिबद्ध, आप चलाने की आवश्यकता होगी git reset --soft HEAD~और git commit --amend
स्क्रूटनी

@Stachu जब मैं इसके बाद धक्का देता हूं, तो यह पुल और मर्ज करने के लिए कहेगा। उससे बचने के लिए मैं क्या कर सकता हूं?
अभय कोरडिय़ा

आप क्यों नहीं खींचना और मर्ज करना चाहेंगे?
स्टैचू

23
  1. अपनी शाखा की जाँच करें और अपने सभी आवागमन की मात्रा की गणना करें।
  2. खुला बैश और लिखें: git rebase -i HEAD~<quantity of your commits>(यानी git rebase -i HEAD~5)
  3. पहली बार किए गए कमिट (जो शीर्ष पर है) को छोड़कर, सभी के लिए ओपन txtफाइल चेंज pickकीवर्ड में squash। शीर्ष पर इसे बदलने के लिए reword(जिसका अर्थ है कि आप अगले चरण में इस कमिट के लिए एक नई टिप्पणी प्रदान करेंगे) और SAVE पर क्लिक करें! यदि vim में है, escतो एंटर करके सेव करें wq!और एंटर दबाएं।
  4. टिप्पणी प्रदान करें।
  5. नए परिवर्तन देखने के लिए Git खोलें और "सभी प्राप्त करें" करें।

किया हुआ


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