git - english - प्रत्यावर्तित परिवर्तन




'गिट पुश' को पूर्ववत करना (7)

यहां मैंने अपनी स्थिर-स्थिर-स्थिर शाखा पर क्या किया है ...

% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
  refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
  from cc4b63bebb6e6dd04407f8788938244b78c50285
  to   83c9191dea88d146400853af5eb7555f252001b0
    done
'refs/heads/unstable': up-to-date
Updating remote server info

यह सब गलती थी क्योंकि मुझे बाद में एहसास हुआ। मैं इस पूरी प्रक्रिया को पूर्ववत करना चाहता हूं, और अल्फा-0.3.0 शाखा को वापस लौटाना चाहता हूं।

मुझे क्या करना चाहिए?


आपके द्वारा इच्छित परिवर्तनों को खोए बिना इसे करने का एक तरीका:

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

फिर आप उन फ़ाइलों को चुन सकते हैं जिन्हें आप धक्का देना चाहते थे


आपको यह सुनिश्चित करने की ज़रूरत है कि इस संग्रह के अन्य उपयोगकर्ता गलत परिवर्तन नहीं कर रहे हैं या उन चीजों के शीर्ष पर निर्माण करने की कोशिश कर रहे हैं जिन्हें आप हटा देना चाहते हैं क्योंकि आप इतिहास को रिवाइंड करने वाले हैं।

फिर आपको पुराने संदर्भ को 'बल' करने की आवश्यकता है।

git push -f origin last_known_good_commit:branch_name

या आपके मामले में

git push -f origin cc4b63bebb6:alpha-0.3.0

आप रिमोट रिपोजिटरी पर सेट कर सकते हैं receive.denyNonFastForwards । यदि यह मामला है, तो आपको एक त्रुटि मिलेगी जिसमें वाक्यांश [remote rejected]

इस परिदृश्य में, आपको शाखा को हटाना और फिर से बनाना होगा।

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

यदि यह काम नहीं करता है - शायद क्योंकि आपको प्राप्त होता है। receive.denyDeletes सेट करते हैं, तो आपको रिपोजिटरी तक सीधे पहुंच प्राप्त करनी होगी। रिमोट रिपोजिटरी में, आपको निम्न प्लंबिंग कमांड की तरह कुछ करना होगा।

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8

कई पूर्ववत करें गिट रीसेट - हार्ड 0ad5a7a6 (बस SHA1 हैश प्रदान करें)

अंतिम प्रतिबद्धता पूर्ववत करें

गिट रीसेट - हार्ड हेड ~ 1 (अंतिम प्रतिबद्धता में परिवर्तन हटा दिए जाएंगे) गिट रीसेट - सॉफ्ट हेड ~ 1 (अंतिम प्रतिबद्धता में परिवर्तन असामान्य स्थानीय संशोधनों के रूप में उपलब्ध होंगे)


मेरा मानना ​​है कि आप यह भी कर सकते हैं:

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

यह अंतिम विधि के समान ही है, सिवाय इसके कि आपको रिमोट रेपो में चारों ओर घूमना नहीं है।


यहां दिए गए कुछ दृष्टिकोणों की तुलना में git revert कम खतरनाक है:

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
 4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>

अपनी प्रतिबद्धता के साथ 35f6af6f77f116ef922e3d75bc80a4a466f92650 बदलें।


स्वीकृत समाधान (@charles bailey से) अत्यधिक खतरनाक है यदि आप किसी साझा रेपो में काम कर रहे हैं।

एक सर्वोत्तम अभ्यास के रूप में, सभी एक रिमोट रेपो को धक्का देते हैं जिसे साझा किया जाता है जिसे 'अपरिवर्तनीय' माना जाना चाहिए। इसके बजाए 'गिट रिवर्ट' का प्रयोग करें: kernel.org/pub/software/scm/git/docs/…

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things


git push origin +7f6d03:master

यह आपके रेपो को उल्लिखित प्रतिबद्ध संख्या में वापस कर देगा







git-push