मुझे अपनी मास्टर ब्रांच में एक "मध्य" प्रतिबद्ध करने के लिए पॉप अप और कचरा करना होगा। मैं यह कैसे कर सकता हूं?


94

उदाहरण के लिए, निम्नलिखित मास्टर शाखा में, मुझे केवल प्रतिबद्ध a5c7bf16e6f04321f966b4231371b21475bc4da को ट्रैश करने की आवश्यकता है, जो पिछले रिबास के कारण दूसरा है:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

मुझे मंत्रमुग्ध करने की जरूरत है

  • पहला प्रतिबद्ध 60b413512e616997c8b929012cf9ca56bf5c9113,
  • तीसरा प्रतिबद्ध e6523efada4d75084e81971c4dc2aec621d45530 और
  • अंतिम प्रतिबद्ध 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"दूर फेंक" बस दूसरा प्रतिबद्ध af5c7bf16e6f04321f966b4231371b21475bc4da

मैं उसे कैसे कर सकता हूँ? अग्रिम धन्यवाद लुका

जवाबों:


98

रिबेस या रिवर्ट विकल्प हैं। रिबेस वास्तव में कमिटमेंट को इतिहास से हटा देगा इसलिए ऐसा लगेगा कि दूसरा कमिट कभी अस्तित्व में नहीं था। यह एक समस्या होगी यदि आपने मास्टर ब्रांच को किसी अन्य रेपो से बाहर कर दिया है। यदि आप इस मामले में एक रिबेस के बाद पुश करने की कोशिश करते हैं, तो git आपको नॉन-फ़ॉर-फ़ॉरवर्ड मर्ज त्रुटि को अस्वीकार कर देगा ।

रिवर्ट सही समाधान है जब शाखा को अन्य रेपो के साथ साझा किया गया है। git revert af5c7bf16एक नया कमिट करेगा जो केवल उन बदलावों को उलट देता है जो af5c7bf16 ने पेश किए थे। इस तरह से इतिहास फिर से नहीं लिखा गया है, आप गलती का एक स्पष्ट रिकॉर्ड बनाए रखते हैं, और अन्य प्रतिनिधि पुश को स्वीकार करेंगे।

यहां मिटाने का एक अच्छा तरीका है: git rebase -i <commit>^ जो आपको हटाना चाहता है उससे ठीक पहले आपको कमिट में ले जाता है। इंटरेक्टिव एडिटर आपको उस बिंदु पर वापस आने वाले सभी कमेंट्स की एक सूची दिखाएगा। आप चुन सकते हैं, स्क्वैश, आदि इस मामले में आप जिस फ़ाइल को मिटाना और सहेजना चाहते हैं उसके लिए लाइन हटा दें । रिबेस अपना काम खत्म कर देगा।


2
यदि मैं रिबेस को चुनूंगा, तो रिबास के लिए क्या सही है? मुझे बस दूसरा छोड़ने की जरूरत है ...
Luca G. Soave

@ BBJ3 मिपाडी का जवाब देखें
प्रज्जवल धतवालिया

32

यदि रिबेस एक विकल्प है, तो आप रिबेट कर सकते हैं और इसे छोड़ सकते हैं:

$ git rebase -i 414ceffc^

यदि रिबास एक विकल्प नहीं है, तो आप इसे वापस कर सकते हैं:

$ git revert af5c7bf16

अगर मुझे "git rebase 414ceffc" के लिए मिला है, जो कि पुरानी कमिटमेंट है, तो डॉन 'मैं तीसरे e6523 और पहले 60b41 को भी ढीला कर दूंगा?
लुका जी। सोवे

3
@ लुक जी। सोवे: यदि आप विशेष रूप git rebaseसे इसे छोड़ने के लिए कहते हैं, तो आप केवल एक "खो" देते हैं ( rebaseइंटरेक्टिव मोड में चलने और इसकी प्रविष्टि को हटाकर)।
मपदी

धन्यवाद mipadi, मैं अपने वोट को आवश्यक रूप से व्यापक स्पष्टीकरण के लिए जेकोटन को देता हूं, भले ही आप दोनों ने एक ही बात कही हो ... फिर से धन्यवाद।
लुका जी। सोवे

29

सभी क्रेडिट के बावजूद मूल उत्तर यहां प्राप्त हुए, मैंने उन्हें संतोषजनक ढंग से इस सवाल का जवाब देने के लिए नहीं पाया। यदि आप अपने आप को ऐसी स्थिति में पाते हैं, जहाँ आपको कमिटमेंट हटाने की ज़रूरत है, या इतिहास के मध्य से आने-जाने का एक संग्रह है, तो यह वही है जो मैं सुझाता हूँ:

  • सभी हिट वाले एक के सिर से एक नई शाखा बनाएं और इसे स्विच करें।
  • उस नई शाखा पर वापस लौटें जिस बिंदु से आप एक नया आधार शुरू करना चाहते हैं।
  • फिर, (यहाँ प्रमुख बिंदु) चेरी बाद में आने वाले कमिट्स को चुनें, जिन्हें आप उसके बाद मूल शाखा से नए एक पर लागू करना चाहते हैं, और उन कॉम्पट को छोड़ दें जिन्हें आप अब और नहीं चाहते हैं (यानी जिन्हें आप हटा रहे हैं)।
  • यदि वांछित है, तो मूल शाखा का नाम बदलकर कुछ यह बताएं कि यह पुराना कोड है, और फिर अपनी नई शाखा का नाम बदलें जिसे मूल कहा जाता है।
  • अंत में, अपने परिवर्तनों को अपने दूरस्थ रेपो (यदि एक का उपयोग कर रहे हैं) में धकेलें। आपको शायद "मजबूर धक्का" का उपयोग करने की आवश्यकता होगी। यदि आपके सहयोगियों के पास संशोधनों को खींचने के मुद्दे हैं, तो उनके लिए दूरस्थ स्रोत से केवल रेपो को फिर से क्लोन करना सबसे आसान हो सकता है। एक तरह से या किसी अन्य, आप संभवतः उनसे बात करना चाहते हैं यदि आप वैसे भी अपने इतिहास के बीच से बाहर आ रहे हैं!

यहां चेरी पिकिंग के बारे में जानकारी दी गई है: चेरी का मतलब क्या होता है?

यहाँ कछुआ Git (जैसा कि मैंने अभी किया था) के साथ कुछ कर रहा हूँ। इस प्रकार के संचालन के लिए एक गिनी उपयोगिता का उपयोग करना निश्चित रूप से आसान है! TortoiseGit का उपयोग कर चेरी उठाओ


6
यह शीर्ष उत्तर होना चाहिए था!
मैडोग्रे

चेरी पिक का उपयोग करने का अच्छा तरीका, यह समाधान तब भी बेहतर है जब आप एक से अधिक प्रतिबद्ध "स्किप" करना चाहते हैं।
जॉनी विलर

वास्तव में मूल प्रश्न का समाधान नहीं। सुझाव दिया समाधान काम करता है, जबकि यह बहुत अधिक समय लेने वाली / अजीब है और IMO कोई लाभ नहीं लाता है। यदि शाखा को पहले से ही धकेल दिया गया था (और जंगली में इस्तेमाल किया गया था) तो फिर से पलटने की रणनीति शायद इसका जवाब है। यदि नहीं, तो इंटरएक्टिव को रिजेक्ट करें और आपत्तिजनक कमेंट को हटा दें जो मैं उपयोग करूंगा। यदि इसे धकेल दिया गया था, लेकिन हम जानते हैं कि इसका उपयोग किसी के द्वारा नहीं किया जाता है, तब भी आप बल के धक्का के बाद छूट के साथ भाग सकते हैं।
राडु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.