'हिट पुश'


591

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

% 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 शाखा को वापस वही करता हूं जो यह था।

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



4
यह वास्तव में एक ही स्थिति नहीं है, रिबॉज़ को पूर्ववत करना एक स्थानीय रिपॉजिटरी परिदृश्य है, एक गिट पुश को पूर्ववत करना एक दूरस्थ रिपॉजिटरी शामिल है और आपके पास पहुंच के आधार पर अधिक मुश्किल हो सकता है।
सीबी बेली

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

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

जवाबों:


943

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

फिर आपको पुराने संदर्भ को 'मजबूर' करने की जरूरत है।

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

16
एक सही और अच्छी तरह से समझाया गया जवाब - बहुत बहुत धन्यवाद। किसी और के लिए जो इसे ठोकर मारता है, शैक्षणिक कारणों से मैंने पहले 2 दृष्टिकोणों में से दोनों की कोशिश की, और दोनों ने काम किया - जाहिर है अगर पहला काम करता है, तो यह सबसे साफ दृष्टिकोण है। अगर मैं यूपी को 10 बार चार्ल्स को चोदता, तो मैं होता। :)
साइरस

139
त्वरित-संदर्भ के लिए, यहाँ पहली पंक्ति हैgit push -f origin last_known_good_commit:branch_name
फिल्पेरो

5
git push -f origin cc4b63bebb6: Alpha-0.3.0 => इसने मेरी मदद की, नोट अल्फा-0.3.0 शाखा का नाम है और cc4b63bebb6 वह कमिट आईडी है जिसे हम वापस करना चाहते हैं। इसलिए, इस आदेश को पूरा करने के बाद, हम cc4b63bebb6 प्रतिबद्ध आईडी में होंगे।
कुमार

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

1
jww - सब कुछ की तुलना में, git सबसे अधिक सुविधा संपन्न और कुशल स्रोत नियंत्रण उपकरण उपलब्ध है। हर टीम इसका अलग तरह से इस्तेमाल करती है। यह एक सप्ताहांत बिताने के लिए एक ताजा भंडार के साथ खेलने और सभी सामान्य परिदृश्यों से गुजरने के लायक है। एक बार जब आप इसके साथ काम करते हुए कुछ समय बिताते हैं, तो विकास बहुत कम तनावपूर्ण होता है।
user1491819

165

मुझे विश्वास है कि आप भी ऐसा कर सकते हैं:

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

यह अंतिम विधि के समान है, सिवाय इसके कि आपको दूरस्थ रेपो में इधर-उधर न घूमना पड़े।


9
यह मेरे लिए भी काम किया है, लेकिन यह ध्यान देने योग्य है कि यह रिमोट पर इतिहास को "फिर से लिखना" होगा। यह वही हो सकता है जो आप चाहते हैं, लेकिन यह नहीं हो सकता है!
टॉम

3
इस जवाब के लिए +1 जिसने वास्तव में मेरी मदद की। मैं यह भी जोड़ना चाहता था (और चीजों को स्पष्ट करना) कि कमिट आईडी (जो " --hard" पैरामीटर के बाद आती है ) होनी चाहिए जो भी आप अपनी शाखा को रीसेट करना चाहते हैं वह आईडी है।
माइकल Dautermann

1
इतिहास को अच्छी तरह से पढ़ें ... जो कोई भी बदलावों को खींच सकता है, मैंने बस यह सुनिश्चित किया कि वे ऐसा करें git reset --hard [commit_id]ताकि हम अंतरिक्ष-समय की निरंतरता के साथ खिलवाड़ न करें।
एलियन लाइफ फॉर्म

9
"गिट पुश ओरिजिन + अल्फा-0.3.0" में + क्या है?
जिपरसन

1
@ जिपरसन +धक्का लेने के लिए मजबूर करता है, इसी तरह -f(लेकिन थोड़ा अलग: stackoverflow.com/a/25937833/1757149 )। इसके बिना, यदि आप कोशिश करते हैं git push origin alpha-0.3.0तो धक्का विफल हो जाएगा Updates were rejected because the tip of your current branch is behind:।
15:28

106

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 को अपनी खुद की कमिटमेंट से बदलें।


2
मैं 35f6af6f77f116ef922e3d75bc80a4a466f92650 आईडी के साथ कैसे आता हूं? यह उत्तर बेहतर होगा यदि आप उसे समझा सकें।
वोलोमाइक

2
@Volomike (और भविष्य के Googling devs), यह सवाल इसे प्राप्त करने के कई तरीकों का वर्णन करता है: SO पर नियंत्रण और हैश प्रश्न
Jaime

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

यह मेरे लिए काम कर रहा था। हालाँकि, सावधान रहें क्योंकि रिवर्ट आपकी स्थानीय फ़ाइलों में सभी परिवर्तनों को वापस कर देगा।
user1941537

मैंने कई बार इस दृष्टिकोण का विकल्प चुना लेकिन मैं भी git rebase -i का उपयोग करता हूं <id-पहले-अंतिम-अच्छा-> एक इंटरैक्टिव रिबास करने के लिए और इतिहास को साफ करने के लिए जैसा कि यहां बताया गया है, stackoverflow.com/questions/5189560/…
अर्नेस्टो एलेली

35

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

एक सर्वोत्तम अभ्यास के रूप में, सभी को साझा किए जाने वाले रिमोट रेपो पर धकेल दिया जाता है, जिसे 'अपरिवर्तनीय' माना जाना चाहिए। 'Git revert' का उपयोग करें: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

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


क्या, वास्तव में, क्या आप निर्देश दे रहे हैं? आपको केवल पुराने लिंक ही प्रतीत होते हैं।
jww

32

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

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

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


19

ऐसा करने का एक और तरीका:

  1. दूसरी शाखा बनाएं
  2. "git चेकआउट" का उपयोग करके उस शाखा पर पिछली प्रतिबद्ध जांच करें
  3. नई शाखा को धक्का दें।
  4. पुरानी शाखा को हटाएं और हटाएं का उपयोग करें (उपयोग करें) git push origin --delete <branch_name> )
  5. पुरानी शाखा में नई शाखा का नाम बदलें
  6. फिर से धक्का।

2
यह एक वास्तविक समाधान की तरह दिखता है जब आप पहले से ही रेपो में गलत काम करते हैं
इलारियन कोवलचुक

17
git push origin +7f6d03:master

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


2
यह सबसे सीधा उत्तर है। आप एक जीवित सेवर हैं।
एकुनदो आशीर्वाद फनमिनी

2
याद रखें, यह आपकी स्थानीय फ़ाइलों को रीसेट नहीं करेगा।
के-गन

11

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

पूर्ववत करें

git reset --hard HEAD ~ 1 (अंतिम प्रतिबद्ध में परिवर्तन हटा दिए जाएंगे) git रीसेट --soft HEAD ~ 1 (अंतिम प्रतिबद्ध में परिवर्तन अनधिकृत स्थानीय संशोधनों के रूप में उपलब्ध होंगे)


9

परिदृश्य 1 : यदि आप अंतिम वचन 8123b7e04b3 को पूर्ववत करना चाहते हैं, तो नीचे कमांड है (यह मेरे लिए काम किया है):

git push origin +8123b7e04b3^:<branch_name>

आउटपुट नीचे की तरह दिखता है:

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

अतिरिक्त जानकारी: परिदृश्य 2 : कुछ स्थिति में, आप पिछली कमांड के माध्यम से जो पूर्ववत करें (मूल रूप से पूर्ववत पूर्ववत करें) वापस करना चाहते हैं, तो नीचे दिए गए कमांड का उपयोग कर सकते हैं:

git reset --hard 8123b7e04b3

आउटपुट:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

अधिक जानकारी यहाँ: https://github.com/blog/2019-how-to-undo-almost-anything-with-git


परिदृश्य 1 को स्वीकृत उत्तर देना चाहिए क्योंकि प्रश्न में यह निर्दिष्ट नहीं किया गया है कि कौन सा हटाना है। स्वीकृत उत्तर केवल अंतिम कमिट को हटाता है । यह उत्तर किसी भी कमिट को हटा देता है ।
डोमिनिक सेरिसानो

0

मौजूदा उत्तर अच्छे और सही हैं, लेकिन क्या होगा अगर आपको इसे पूर्ववत करने की आवश्यकता है push:

  1. आप स्थानीय स्तर पर कमिट्स रखना चाहते हैं या आप अनक्मिटेड बदलाव रखना चाहते हैं
  2. तुम नहीं जानते कि कितने ने तुम्हें धक्का दिया

रेफरी में परिवर्तन वापस करने के लिए इस कमांड का उपयोग करें:

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

-2

यदि आप अंतिम प्रतिबद्ध को अनदेखा करना चाहते हैं, जिसे आपने अभी दूरस्थ शाखा में धकेला है: तो यह प्रतिबद्ध को नहीं हटाएगा, लेकिन जीआईटी पॉइंटर को एक पूर्व में, इसे HEAD ^ या HEAD ^ द्वारा संदर्भित करके इसे अनदेखा कर सकता है। 1

git push origin +HEAD^:branch

लेकिन अगर आपने पहले ही इस कमिट को धक्का दे दिया है, और दूसरों ने शाखा खींच ली है। इस मामले में, अपनी शाखा के इतिहास को फिर से लिखना अवांछनीय है और आपको इस वचन को वापस करना चाहिए:

git revert <SHA-1>
git push origin branch

1
हाँ! गितुब के साथ काम करने पर यह एक आकर्षण की तरह काम करता था। धन्यवाद।
cukabeka

सवाल "धक्का" के बारे में है फिर यह रिमोट शाखा की चिंता करता है। HEAD को एक कमेटी में स्थानांतरित करने के लिए नहीं, जिसका अर्थ है कि अंतिम प्रतिबद्ध को अनदेखा करें, बस यह करें: git push origin + HEAD ^: your_branch
mkebri
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.