मैं एक भड़काऊ गिट पुश-ओ मूल मास्टर से कैसे उबर सकता हूं?


93

मैंने सिर्फ --forceविकल्प का उपयोग करके अपनी परियोजना के लिए गलत स्रोत के लिए प्रतिबद्ध किया है ।

क्या वापस करना संभव है? मैं समझता हूं कि सभी पिछली शाखाओं को -fविकल्प का उपयोग करते हुए अधिलेखित कर दिया गया है , इसलिए मैंने अपने पिछले संशोधनों को खराब कर दिया है।


जवाबों:


54

Git आमतौर पर कुछ भी फेंक नहीं करता है, लेकिन इससे उबरना अभी भी मुश्किल हो सकता है।

यदि आपके पास सही स्रोत है तो आप इसे --forceविकल्प के साथ रिमोट में धकेल सकते हैं । जब तक आपने इसे नहीं बताया तब तक Git ने कोई शाखा नहीं हटाई होगी। यदि आप वास्तव में कमिट खो चुके हैं, तो कमिटिंग पुनर्प्राप्त करने के लिए इस उपयोगी मार्गदर्शिका पर एक नज़र डालें । यदि आप जानते हैं कि आप चाहते हैं तो SHA-1 का पता है तो आप शायद ठीक हैं।

सबसे अच्छी बात: सब कुछ वापस करें और देखें कि आपके स्थानीय भंडार में क्या है। यदि संभव हो तो रिमोट पर भी ऐसा ही करें। git fsckयह देखने के लिए उपयोग करें कि क्या आप चीजों को पुनर्प्राप्त कर सकते हैं, और इससे ऊपर सभी नहीं चलते हैंgit gc

इन सबसे ऊपर, कभी भी --forceविकल्प का उपयोग न करें जब तक आप वास्तव में, वास्तव में इसका मतलब नहीं करते।


64
आप संभवतः यह निर्धारित करने के लिए कि दूरस्थ शाखाएं मूल रूप से कहां थीं, रिफ्लेक्स को देख सकते हैं। उदाहरण के लिए, git reflog show remotes/origin/master। आपको अपना धक्का वहां देखने में सक्षम होना चाहिए; पिछली पंक्ति में वह जगह है जहां आप इसे गड़बड़ करने से पहले थे। आप फिर उस संशोधन --forceको मूल के साथ (और ) वापस धक्का दे सकते हैं, और जहां आप थे वहां वापस आ सकते हैं!
कास्केबेल

@ डेविड: ओह। आपने अपने प्रश्न में उल्लेख नहीं किया कि आपके पास रेपो नहीं था। (यह निश्चित रूप से कुछ ऐसा है जो आप कभी नहीं करना चाहते हैं।) यदि आपके पास फ़ाइल सिस्टम पहुंच है, जहां आपने हालांकि धक्का दिया, तो आप अभी भी यह सब कर सकते हैं।
कैसबेल

1
@ डेविड: वाईक। उस तरह की चीज़ से बचने के लिए अपने वर्तमान निर्देशिका को अपने संकेत के हिस्से के रूप में हमेशा अच्छा रखें।
कास्केले

1
@ जेफ्रोमी मुझे लगता है कि आपने जो कहा था वह वास्तविक रूप से है: यहां तक ​​कि एक पुराने संस्करण के साथ ( git fetchलंबे समय तक एड नहीं होने पर ) आप गीथहब की तरफ के रिफ्लॉग को प्रदर्शित कर सकते हैं और ठीक हो सकते हैं!
nh2

1
इसका जवाब @ जेफ्रोमी ने कहां है? मैं इस टिप्पणी धागे के बाहर इस पृष्ठ पर उल्लिखित उपयोगकर्ता नहीं देखता।
डॉन मैककरी

47

यदि आप कमिट हैश जानते हैं, तो यह आसान है, बस अपनी शाखा को फिर से बनाएँ।

5794458...b459f069 master -> master (forced update)

दूरस्थ शाखा हटाएं:

git push origin :master

फिर अपनी कमांड को निम्न कमांड के साथ फिर से बनाएँ:

git checkout 5794458
git branch master
git push origin master

28

समाधान यहाँ पहले से ही उल्लेख किया गया है

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master

धन्यवाद, यह मेरे लिए काम किया। मेरे पास मास्टर को हटाने के लिए पहुंच नहीं थी इसलिए स्वीकृत टिप्पणी विफल रही।
एंडी

हां, और git reflog show remotes/origin/masterअगर git reflog आवश्यक है (जैसा ऊपर @Cascabel द्वारा उल्लेख किया गया है)
जोशिया योडर

2
यह सही उत्तर है, सही को जोड़ने के लिए धन्यवाद।
Noitidart

6

यदि आप उस स्थानीय रेपो पर नहीं हैं, जहां से जबरन धक्का दिया गया था, तो मूल / मास्टर स्तर पर पुनर्प्राप्त करने का कोई तरीका नहीं है। लेकिन अगर आप एंटरप्राइज़ के लिए GitHub या GitHub का उपयोग करने के लिए पर्याप्त भाग्यशाली हैं , तो आप REST API पर नज़र डाल सकते हैं और खोए हुए कमिट को पैच के रूप में पुनः प्राप्त कर सकते हैं , उदाहरण:

  1. घटनाओं की सूची बनाएं और प्रतिबद्ध sha1 लंबे प्रारूप का पता लगाएं

https://api.github.com/repos/apache/logging-log4j2/events

  1. खोई हुई डाउनलोड को डाउनलोड करें और संबंधित पाथ को json पाथ .files [] / पैच में पुनः प्राप्त करें

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. स्थानीय रूप से लागू करें और फिर से धक्का दें

git पैच अप लागू करें। & git कमिट-मी "रिस्टोर कमिट" && git पुश ओरिजिन मास्टर


4

खोए हुए कमिट को पुनर्प्राप्त करने के लिए या यहां तक ​​कि यह पता लगाने के लिए कि क्या कमिट खो गए थे, यदि आपके स्थानीय रेपो से पिछले धक्का नहीं आया, तो अपने सीआई मशीन को देखने का एक और तरीका है।

यदि आपके पास एक नौकरी है जो हर प्रतिबद्ध (या लगातार आने वाली श्रृंखला) के बाद मास्टर शाखा का परीक्षण करती है, जो आपके पास होनी चाहिए, तो आपके पास एक नज़र हो सकती है कि यह अंतिम परीक्षण क्या था। यही कारण है कि आप को बहाल करने की जरूरत है।

CI मशीन रेपो का एक स्थानीय क्लोन भी रख सकती है, जिससे आप इस रिकवरी को करने में सक्षम हो सकते हैं।

स्रोत: संभवतः सतत वितरण: विश्वसनीय सॉफ्टवेयर बिल्ड, टेस्ट और तैनाती स्वचालन (एडिसन-वेस्ले सिग्नेचर सीरीज (फाउलर)) के माध्यम से जारी करता है।


3

हां, आप इसके बाद कमिट कर सकते हैं git push -f your_branch

Doc से पाठ :

निर्दिष्ट समय से अधिक पुरानी प्रविष्टियाँ। यदि यह विकल्प निर्दिष्ट नहीं है, तो समाप्ति समय कॉन्फ़िगरेशन सेटिंग gc.reflogExpire से लिया जाता है, जो 90 दिनों के लिए चूक में बदल जाता है। - एक्पायर = सभी prunes प्रविष्टियों की परवाह किए बिना उनकी उम्र; --expire = पहुंच योग्य प्रविष्टियों की छंटाई को बंद नहीं करता (लेकिन देखें - Dexire-unreachable)।

तो आप कर सकते हैं:

1- git reflog

यहाँ छवि विवरण दर्ज करें

2- आप चुनते हैं Head_Number क्या आप के साथ पुनर्प्राप्त करना चाहते हैं git reset –hard HEAD@{HEAD-NUMBER}

यहाँ छवि विवरण दर्ज करें

3- आप इस सिर पर सभी कमिट्स को देख सकते हैं git cherry -v branch_name

4- अंत में आपको जोर जबरदस्ती करनी चाहिए git push -f branch_name

या

1- अपने GIT क्लाइंट (इंटरफ़ेस) से SHA की संख्या प्राप्त करें

git reset --hard commit_SHA

2- बल धक्का

git push -f your_branch

उम्मीद है की यह मदद करेगा


2

मैंने केवल एक फ़ाइल के लिए एक अंतिम पुश को पूर्ववत करते समय यही काम किया था। अंत में वापस भंडार की मूल स्थिति में जा रहा है। मैं लाइनस से गिट कमांड का उपयोग कर रहा था क्योंकि मेरे पास लिनक्स पर स्थानीय कॉपी थी। सौभाग्य से वह प्रति अभी भी बरकरार थी।

मैंने किया था (स्थानीय रेपो की कुछ और प्रतियां बनाने के बाद):

git add .
git status

(यह कहा गया कि मूल / गुरु 68 कमिट्स से आगे थे, ठीक है ... वे सभी कमिट थे जिन्हें मैंने डिलीट कर दिया था)

git remote set-url origin <GIT_SSH_URL>
git push

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


0

यहाँ आप निर्णय पढ़ सकते हैं https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it

दूसरे ने मेरी मदद की। मैंने इन आदेशों को गलत किया

1) (some-branch) git pull -> correct command was git pull origin some-branch

2) (some-branch) git push -f origin some-branch

इन आदेशों के बाद मैंने तीन कमिट खो दिए। उन्हें ठीक करने के लिए मैंने टर्मिनल को देखा, जहाँ मैंने गलत तरीके से 'गिट पुल' किया था और वहाँ जैसा आउटपुट देखा है

60223bf ... 0b258eb कुछ-शाखा -> मूल / कुछ-शाखा

दूसरा हैश 0b258eb बिल्कुल वही था जिसकी मुझे जरूरत थी। इसलिए, मैंने इस हैश को लिया और कमांड का निर्माण किया

git push --force origin 0b258eb:some-branch

0

मेरे जैसे बुरे हालात में लोगों के लिए (उदाहरण के लिए, यदि आपको bad objectदौड़ते समय त्रुटियां हो रही हैं git reset --hard):

मैंने ट्रीसेवर नामक एक स्क्रिप्ट लिखी है जो आपकी सभी फाइलों को GitHub API से अंतिम उपाय के रूप में खींचती है। इसका उपयोग कैसे करें:

  1. treesaverस्क्रिप्ट और cdइसे क्लोन करें ।
  2. SHAउस पेड़ की स्ट्रिंग का पता लगाएं जिसे आप एक्सेस करके पुनर्स्थापित करना चाहते हैं https://api.github.com/repos/<your_username_or_org>/<repo>/events
  3. में payloadसंपत्ति अपने पुश घटना के लिए इसी, लगता है commitआप पर वापस लौटने और उसके पर क्लिक करने के लिए करना चाहते हैं url
  4. के तहत commit.tree, नकल treeकी url
  5. भागो python3 main.py <tree_url> <path_to_save_to>

उदाहरण के लिए, मेरे मामले में, मैं भागूंगा:

python3 main.py https://api.github.com/repos/anthonykrivonos/my-repo/git/trees/1234567 .

बेशक, पीआरएस का स्वागत है।

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