2013-07-16 6 views
11

मैं अपने भंडार में कुछ करता मिला रखें:Git: पहले प्रतिबद्ध निकालने, लेकिन हाल के परिवर्तन

की तरह:

A - Added Feature A 
B - Removed Feature B 
C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

कहाँ ई सबसे हाल ही में प्रतिबद्ध मैंने बनाया है। अब मैं फीचर सी के साथ किए गए परिवर्तनों से छुटकारा पाना चाहता हूं लेकिन मैं डी और ई

के साथ किए गए परिवर्तनों को रखना चाहता हूं, मुझे उम्मीद है कि आप मेरी मदद कर सकते हैं।

धन्यवाद रिबेसिंग आप

+2

के संभावित डुप्लिकेट [Git: भंडार के लिए लॉग प्रविष्टियों के लिए प्रतिबद्ध चयनित हटाने] (http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- एक भंडार) – jszakmeister

+1

@jszakmeister: बिल्कुल वही नहीं, लिंक किया गया पोस्ट काम करना चाहता है, जबकि ओपी उन्हें यहां हटाना चाहता है – CharlesB

+1

@CharlesB पूरी तरह से सच नहीं है। स्क्वैशिंग बी और सी एक विकल्प था, और इसलिए ओपी के सवाल में काम को हटा रहा था। उत्तर में दोनों पर दिशानिर्देश हैं। – jszakmeister

उत्तर

7

आप केवल (अपने प्रश्न शरीर में विनिर्दिष्ट है) "परिवर्तन से छुटकारा पाने के लिए" के रूप में वास्तव में (शीर्षक में विनिर्दिष्ट है) "एक प्रतिबद्ध निकालना" के लिए विरोध चाहते हैं, एक आसान विकल्प एक नया जोड़ रहा है पहले प्रतिबद्धता के विपरीत बिल्कुल विपरीत कर रहे हैं।

यह मूर्खतापूर्ण नहीं है और इसके परिणामस्वरूप परिवर्तनों के कारण संघर्ष हो सकता है, लेकिन यह इतिहास में बदलाव नहीं करता है, जिससे आप रिवर्सल और उसके कारणों को दस्तावेज करने की अनुमति देते हैं, और अन्य कामकाजी प्रतियों के साथ अच्छी तरह से खेलते हैं।

git revert उपकरण का एक सेट के ऐसे बुरे जुड़वा बनाने के लिए उपयोग किया जाने वाला टूल है।

0

इस कहा जाता है: आप -i स्विच करना चाहते हैं।

पढ़ने: https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i

एक समान प्रश्न/उत्तर के लिए

देखें: https://stackoverflow.com/a/2938393/2536029

+0

धन्यवाद। लेकिन मैंने 'गिट रिवर्ट सी' का उपयोग किया, जिसने सी के साथ किए गए सभी बदलावों को हटा दिया। यह आसान था। – Strernd

+1

जो लिंक किए गए उत्तर में पहला सुझाव होगा। – mnagel

0

ऐसा करने के लिए, निम्न चरणों का पालन करें:

git rebase -i HEAD~3 

तो सी प्रतिबद्ध तल पर पहले होने के लिए ले जाने के , आपके पास

D - Added Feature D 
E - Added Feature D 
C - Redesigned Feature C 

आप sav ई और बाहर निकलें, तो

git reset HEAD^ 

इस सी

20

Interactive rebase प्रतिबद्ध पूर्ववत होगा अपने दोस्त है!

के रूप में अन्य लोगों ने कहा:

$ git rebase -i HEAD~5 

... जहां -i इंटरैक्टिव झंडा है, और HEAD~5 साधन इंटरैक्टिव रिबेस में पिछले 5 करता शामिल हैं।

जब आप इसके बाद के संस्करण जारी करने की एक परिणाम के रूप में संपादक उठो, खोला फ़ाइल में टिप्पणी पर एक नज़र डालें:

# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

आप के लिए महत्वपूर्ण बिट कि COMMIT तुम यहाँ एक लाइन निकाल देते हैं तो है खो जाएगा।

तो, उन पंक्तियों को हटाएं जो उन चीजों को हटाते हैं जिन्हें आप छुटकारा पाने, सहेजने और बंद करने के लिए चाहते हैं, और गिट बाकी को संभालेगा (आपको प्रतिबद्धता की प्रकृति के आधार पर कुछ संघर्षों को ठीक करना पड़ सकता है और आपको वापस लेना पड़ सकता है हटाने की कोशिश कर रहे हैं)।

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

+1

यह यहां बेहतर समझाया गया है। यह जवाब स्वीकार किया जाना चाहिए। –

+0

@CyrilCHAPON - जबकि मैं मानता हूं कि यह एक अच्छा जवाब है (प्रश्न शीर्षक के लिए), आईएमओ यह आवश्यक प्रश्न (शरीर में) के लिए सही जवाब नहीं है। आईएमओ @ एआईबी का जवाब पसंदीदा है, क्योंकि पुनर्जन्म विनाशकारी है (इतिहास को फिर से लिखता है - जैसा कि इस उत्तर में उल्लेख किया गया है, लेकिन पर्याप्त आईएमओ को हाइलाइट नहीं किया गया है)। कभी-कभी यह एकमात्र उत्तर है, लेकिन आईएमओ रीबेस का उपयोग केवल अंतिम मास्टर के रूप में मास्टर शाखा पर किया जाना चाहिए। –

1

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

यदि अन्य लोगों के पास आपका काम है, तो सबसे आसान काम यह है कि आपत्तिजनक परिवर्तन को वापस लाएं, इसे पूरी तरह से उत्पादित न करें। git revert COMMIT_ID का उपयोग एक नई प्रतिबद्धता बनाने के लिए करें जो आपके द्वारा लागू किए गए परिवर्तनों को COMMIT_ID में लागू करता है।

0
git reabse -i HEAD~3 

आप पिछले संदेशों

C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

तुम सिर्फ डालने के लिए प्रतिबद्ध एक्स Git रीसेट HEAD^से पहले प्रतिबद्ध आप पूर्ववत करने के लिए, आप, सी प्रतिबद्ध पूर्ववत करना चाहते हैं चाहते हैं कि उसे तो अपने 3 की सूची होगी इस

C - Redesigned Feature C 
x git reset HEAD^ 
    D - Added Feature D 
    E - Added Feature D 

निकास रिबेस कंसोल, आप देखेंगे कि आपकी प्रतिबद्धता लॉग में और नहीं है और उनकी फाइलें चरणबद्ध हैं।

0

यदि आप विंडोज में टोर्टोइज गिट का उपयोग करते हैं, तो आप गिट फ़ोल्डर पर राइट-क्लिक कर सकते हैं और फिर TortoiseGit > Show log पर क्लिक कर सकते हैं। आप पहले किए गए सभी कामों को देख सकते हैं और फिर उस प्रतिबद्धता की जांच कर सकते हैं जिसे आप वापस करना चाहते हैं।

प्रतिबद्धता पर क्लिक करें और आप नीचे दी गई बदली गई फाइलें देख सकते हैं। वापस आने वाली फ़ाइलों पर दायाँ क्लिक करें और फिर revert to parent revision पर क्लिक करें।

How to revert commits

संबंधित मुद्दे