Git में एक विशेष प्रतिबद्धता को दूरस्थ दूरस्थ के लिए धकेल दिया गया है


788

एक विशेष प्रतिबद्ध को पूर्ववत करने का सबसे सरल तरीका क्या है:

  • सिर या सिर में नहीं
  • दूर तक धकेल दिया गया है।

क्योंकि अगर यह नवीनतम प्रतिबद्धता नहीं है,

git reset HEAD

काम नहीं करता है। और क्योंकि यह एक दूरदराज के लिए धकेल दिया गया है,

git rebase -i

तथा

git rebase --onto

रीमोट में कुछ समस्या पैदा करेगा।

इसलिए, मैं वास्तव में इतिहास को संशोधित नहीं करना चाहता। यदि बुरा कोड था, तो यह इतिहास में था और इसे देखा जा सकता है। मैं इसे वर्किंग कॉपी में रखना चाहता हूं, और मुझे रिवर्स मर्ज कमिट से ऐतराज नहीं है।

दूसरे शब्दों में, निम्नलिखित svn कमांड के बराबर Git क्या है :

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

जो कि उन बदलावों में सभी बदलावों को एक नई प्रतिबद्धता के रूप में बदलकर 295 से 302 तक के सभी परिवर्तनों को हटा देता है।

svn merge -c -302 ^/trunk

जो कि 302 प्रतिबद्ध को समाप्त करता है, निश्चित रूप से एक और प्रतिबद्ध जोड़कर कि रिवर्स उस संबंधित प्रतिबद्ध से परिवर्तनों को मिला देता है।

मैंने सोचा कि यह जीआईटी में एक काफी सरल ऑपरेशन और एक काफी सामान्य उपयोग मामला होना चाहिए। परमाणु प्रतिबद्धों के अलावा और क्या है?

हम मंचन किया है stashing और सभी यह सुनिश्चित करने के लिए प्रतिबद्ध पूरी तरह से परमाणु कर रहे हैं, आप एक या उन एटॉमिक कमिट की और अधिक आसानी से पूर्ववत करने के लिए सक्षम नहीं होना चाहिए?

जवाबों:


1210

कमिट के हैश की पहचान करें, का उपयोग करते हुए git log, फिर git revert <commit>एक नया कमिट बनाने के लिए उपयोग करें जो इन परिवर्तनों को दूर करता है। एक तरह से, git revertका विपर्ययण है git cherry-pick- उत्तरार्द्ध पैच को उस शाखा पर लागू करता है जो इसे याद कर रहा है, पूर्व इसे उस शाखा से हटा देता है जो यह है।


237
और यदि आप कोड वापस चाहते हैं तो एक स्विच का उपयोग करें, लेकिन स्वचालित रूप से फिर से प्रतिबद्ध नहीं है
jaygooby

17
"एम" विकल्प क्या करता है? मैंने 8213f7d git को वापस लाने की कोशिश की, लेकिन इसके बजाय यह मिला: त्रुटि: 8282f7dad1ed546b434a0d8a64cb783b530a5a30 मर्ज करें, लेकिन कोई विकल्प नहीं दिया गया था। घातक: रिवर्ट विफल
मैल्कम

10
एक मर्ज को वापस
लाने के

31
जो कोई मर्ज वापस करना चाहता है उसके लिए एक चेतावनी: git रिवर्ट सभी डेटा परिवर्तन (यानी, फ़ाइल परिवर्तन वापस हो जाएगा) को पूर्ववत कर देगा, लेकिन मर्ज अभी भी इतिहास में बना हुआ है। इस वजह से यदि आप बाद में उसी शाखा को फिर से मर्ज करने का प्रयास करते हैं, तो यह मर्जिंग शाखा से पूर्ववर्ती मर्ज से पहले कोई भी शामिल नहीं होगा। यह सबसे अधिक संभावना है कि आप क्या चाहते हैं। फिर से शाखा को पूरी तरह से मर्ज करने के लिए आपको पहले उस कमिट को वापस करना होगा जहां आपने मूल मर्ज को वापस कर दिया था। यहाँ और जानें: kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/…
etreworgy

3
@Etreworgy द्वारा टिप्पणी में लिंक 404 है। मुझे संदेह है कि यह लिंक के अद्यतित संस्करण है: kernel.org/pub/software/scm/git/docs/howto/…
टिम स्मिथ

368

मुझे ऐसा करने वाला ऑटो-कमेट पसंद नहीं git revertहै, इसलिए यह कुछ लोगों के लिए मददगार हो सकता है।

यदि आप केवल संशोधित फ़ाइलों को ऑटो-कमिट नहीं करना चाहते हैं , तो आप उपयोग कर सकते हैं--no-commit

% git revert --no-commit <commit hash>

जो जैसा है वैसा ही है -n

% git revert -n <commit hash>

9
आप यह भी कर सकते हैं git reset HEAD~1 --softयदि आप पहले से ही बिना -n
डैनियल

1
लेकिन git reset HEAD~nसिर से लगातार नहीं पहुंचने वाले किसी भी प्रतिबद्ध को पूर्ववत करने से हल नहीं होगा। क्वेरी किसी विशेष कमिट को वापस करने के लिए है।
संगीथकुमारपप

मैंने इस समाधान का उपयोग किया लेकिन उल्टा बीच में एक टकराव हुआ। संघर्ष को हल करने के बाद, git revert --continueजैसा मैंने निर्देश दिया , मैंने वैसा ही किया । इसने काम किया, लेकिन दुख की बात है कि इसके परिणाम सामने आए। शायद मुझे करने की जरूरत थी git revert --no-commit --continue
मोराओफ्ट

1
@sangeethkumarp डैनियल की टिप्पणी एक अतिरिक्त कदम है जिसे आप बाद में ले सकते हैं git revert, यदि आप भूल गए -n; क्योंकि उस बिंदु पर अंतिम प्रतिबद्ध प्रतिलोम है, इसलिए नरम रीसेट उस कमिट को पूर्ववत कर देगा, लेकिन रिवर्ट का संबद्ध कोड परिवर्तन नहीं
ओलिवर

@ डैनियल ने मेरे लिए टिप्पणी कार्य द्वारा समाधान प्रदान किया। बहुत बहुत धन्यवाद '' git रीसेट HEAD ~ 1 --soft ''
Md। अबू सईद

41

क्योंकि यह पहले ही धकेल दिया गया है, आपको सीधे इतिहास में हेरफेर नहीं करना चाहिए। git revertएक नई प्रतिबद्ध का उपयोग करते हुए कमिट से विशिष्ट बदलावों को वापस करेगा, ताकि प्रतिबद्ध इतिहास में हेरफेर न हो।


1

यदि आप जिस प्रतिगमन को वापस करना चाहते हैं वह एक मर्ज की गई प्रतिबद्धता है (पहले से ही विलय कर दिया गया है), तो आपको -m 1या तो -m 2नीचे दिखाए अनुसार विकल्प चाहिए । यह git को बताएगा कि मर्ज किए गए माता-पिता की किस प्रतिबद्धता का उपयोग करना है। अधिक जानकारी यहां पाई जा सकती है ।

  • git revert <commit> -m 1
  • git revert <commit> -m 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.