गिट में कमिट्स की एक सीमा वापस करें


127

मैं git में कितने प्रकार के कमिट वापस कर सकता हूं? पर देख से gitrevisions प्रलेखन, मैं कैसे रेंज मैं की जरूरत है निर्दिष्ट करने के लिए नहीं देख सकता। उदाहरण के लिए:

A -> B -> C -> D -> E -> HEAD

मैं इसके बराबर करना चाहता हूं:

git revert B-D

जहां परिणाम होगा:

A -> B -> C -> D -> E -> F -> HEAD

जहां F में BD सम्मिलित का उल्टा होता है।


Gitrevisions (7) पृष्ठ के अंत की ओर, एक अनुभाग होता है, जिसमें "SpecificYing RANGES" होता है। वहाँ जो वर्णन किया गया है उससे आप क्या चाहते हैं?
गैरेथ मैककॉघन

2
Gitrevisions पेज बताता है कि 'git revert A..D' वही करेगा जो मुझे चाहिए। हालाँकि जब मैं कोशिश करता हूँ कि मुझे "घातक: '' A..D 'न मिले तो यह त्रुटि हो सकती है
Alex

जवाबों:


172

आप किस संस्करण का उपयोग कर रहे हैं?

केवल Git1.7.2 + में समर्थित कई कमियों को वापस लाना: अधिक विवरणों के लिए " एक पुरानी कमिट का कई बार उपयोग करते हुए रोलबैक " देखें।
वर्तमान git revertमैन पेज केवल वर्तमान Git संस्करण (1.7.4+) के लिए है।


जैसा कि ओपी एलेक्स स्पर्लिंग ने टिप्पणियों में रिपोर्ट किया है:

1.7.4 में अपग्रेड करना ठीक काम करता है।
मेरे अपने प्रश्न का उत्तर देने के लिए, यह वह वाक्य-विन्यास है जिसकी मुझे तलाश थी:

git revert B^..D 

B^का अर्थ है "बी का पहला अभिभावक": जो Bवापस में शामिल करने की अनुमति देता है ।
" git rev-parseविशिष्ट संदर्भ अनुभाग " देखें <rev>^,HEAD^ जिसमें शामिल हैं , जैसे वाक्यविन्यास: " कार्यवाहक ( ^) वर्ण " का क्या अर्थ है? "

ध्यान दें कि प्रत्येक प्रतिवर्ती प्रतिबद्ध अलग से प्रतिबद्ध है।

हेनरिक एन टिप्पणी में स्पष्ट करता है :

git revert OLDER_COMMIT^..NEWER_COMMIT

जैसा कि नीचे दिखाया गया है, आप तुरंत बिना किए वापस लौट सकते हैं:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"

1
धन्यवाद, यही जवाब था। 1.7.4 में अपग्रेड करना ठीक काम करता है। अपने स्वयं के प्रश्न का उत्तर देने के लिए, यह वाक्यविन्यास है जिसकी मुझे तलाश थी: git revert B ^ .. D
Alex Spurling

प्रतिभा। धन्यवाद। यह मेरे लिए नहीं हुआ था मुझे पैच लागू करने के लिए रिवर्स ऑर्डर में वापस आने की जरूरत है, डुह। यह कमांड रास्ता दिखाता है।
टिम एबेल

5
मैं अक्सर इस उत्तर का संदर्भ देता हूं, और मुझे हमेशा आदेश का पता लगाने में थोड़ा समय लगता है। तो अपने भविष्य की स्वयं सहायता करने के लिए:git revert OLDER_COMMIT^..NEWER_COMMIT
हेनरिक एन

2
^ का क्या मतलब है?
डस्टिन गेट्ज़

1
@DustinGetz पहले अभिभावक: git-scm.com/docs/gitrevisions देखें : " ^संशोधन पैरामीटर के लिए एक प्रत्यय का अर्थ है उस प्रतिबद्ध वस्तु का पहला अभिभावक"।
VonC

15

यदि आप कमिट रेंज बी से डी (कम से कम गिट संस्करण 2 में) को एक ही कमिट में वापस करना चाहते हैं, तो आप कर सकते हैं

 git revert -n B^..D

यह B के पेरेंट कमिट (बहिष्कृत) से D प्रतिबद्ध (शामिल) के लिए किए गए परिवर्तनों को वापस करता है, लेकिन वापस किए गए परिवर्तनों के साथ कोई भी कमिट नहीं बनाता है। रिवर्ट केवल वर्किंग ट्री और इंडेक्स को संशोधित करता है।

के बाद परिवर्तन करने के लिए मत भूलना

 git commit -m "revert commit range B to D"

आप एक ही विधि का उपयोग करते हुए, एक ही प्रतिबद्ध में कई असंबंधित कमानों को भी वापस कर सकते हैं। उदाहरण के लिए बी और डी वापस करने के लिए लेकिन सी नहीं

 git revert -n B D
 git commit -m "Revert commits B and D"

संदर्भ: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

धन्यवाद Honza HAERING के लिए सुधार


3
git revert -n B..Dबी को वापस नहीं करता है, केवल सी और डी git revert -n B^..Dको भी बी वापस करता है।
होन्जा हाइरिंग

गिट प्रलेखन के अनुसार यह करता है। संदर्भ में पोस्ट
रामस्त फेरी

1
यदि आप इस उदाहरण के संदर्भ में (जो मुझे लगता है कि थोड़ा भ्रमित है) संदर्भ में git revert -n master~5..master~2कहते हैं : यह कहते हैं कि पांचवें नवीनतम प्रतिबद्ध शामिल हैं। लेकिन master~5वास्तव में 6 वीं नवीनतम प्रतिबद्धता है। संकेतन के बारे में विस्तृत जानकारी के लिए git डॉक्स में संशोधन चयन देखें ..:-)
होन्ज़ा हेरिंग

6

कर git revert OLDER_COMMIT^..NEWER_COMMITमेरे लिए काम नहीं किया।

मैंने इस्तेमाल किया git revert -n OLDER_COMMIT^..NEWER_COMMITऔर सब कुछ अच्छा है। मैं git संस्करण का उपयोग कर रहा हूँ 1.7.9.6


मेरे पास एक ही मुद्दा है और इसे -n का उपयोग करके ठीक करें, लेकिन आपको ^ ^ OLDER_COMMIT (git revert -n OLDER_COMMIT ^ .. NEWER_COMMIT) के साथ ^ छोड़ देना चाहिए।
फीलगुड

@FeelGood आपको ^ क्यों छोड़ना चाहिए?
ऑरलैंडो

मेरे पास इतिहास ए -> बी -> सी था और लक्ष्य बी और सी को वापस करना था। जब मैं 'जीट रिवर्ट-एन बी..सी' चलाता हूं, तो केवल सी वापस किया गया था। जब मैंने 'git revert -n B ^ .. C' का उपयोग किया, तो git ने दोनों कमिट्स वापस कर दिए। शायद मैंने कुछ गलत किया है।
फीलगुड

शांत, अच्छी तरह से इसका परीक्षण करना है, लेकिन मुझे लगता है कि मेरे मामले में अच्छा काम किया है (जब तक कि मैं एक 1 प्रतिबद्ध सीमा योग्य नहीं दे रहा था) मैं ^ को शामिल करने के लिए उत्तर को संशोधित करूंगा। धन्यवाद
ऑरलैंडो

2
-nया --no-commitविकल्प के लिए एक एकल में सीमा के दौरान सभी परिवर्तन पूर्ववत हो जाएंगे प्रतिबद्ध, बजाय एक वापस लाएं बनाने के लिए प्रतिबद्ध हर रेंज में प्रतिबद्ध के लिए। अंतिम परिणाम समान है, जैसा कि, उसी परिवर्तन को वापस किया जाएगा। बस निर्भर करता है कि आप अपने गिट इतिहास को कैसे देखना चाहते हैं।
डेनिस

0

git rebase -iप्रासंगिक कमिट को एक में स्क्वैश करने के लिए उपयोग करें । फिर आपके पास वापस करने के लिए एक प्रतिबद्ध है।


7
अगर गिट रीबेस का उपयोग कर रहे हैं, तो आप बस कमिट्स को हटा सकते हैं। मुझे लगता है कि रीज़न नहीं करने का एक कारण है, जैसे कि प्रतिबद्ध एफ के SHA1 को रखना चाहते हैं।
पाओलो एबरमन

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