अगर मैं दौड़ता हूं git branch -d XYZ
, तो क्या शाखा को ठीक करने का कोई तरीका है? क्या वापस जाने का कोई तरीका है जैसे कि मैंने डिलीट ब्रांच कमांड नहीं चलाया है?
अगर मैं दौड़ता हूं git branch -d XYZ
, तो क्या शाखा को ठीक करने का कोई तरीका है? क्या वापस जाने का कोई तरीका है जैसे कि मैंने डिलीट ब्रांच कमांड नहीं चलाया है?
जवाबों:
हां, आपको git reflog
अपनी हटाई गई शाखा की नोक पर कमेटी के लिए SHA1 करने और खोजने में सक्षम होना चाहिए git checkout [sha]
। और एक बार जब आप उस प्रतिबद्ध होते हैं, तो आप git checkout -b [branchname]
वहां से शाखा को फिर से बना सकते हैं।
इस संघनित / वन-लाइनर संस्करण के लिए @ कैस्केबेल को श्रेय।
आप इसे एक चरण में कर सकते हैं:
git checkout -b <branch> <sha>
git checkout -b <branch> <sha>
:।
<sha>
। जैसे कि ऊपर बताया गया है -git checkout -b <branch> <sha>
CMD+K
)
git reflog --no-abbrev
पूर्ण देखने के लिए उपयोग करें <sha>
जो डिफ़ॉल्ट रूप से संक्षिप्त किया जा रहा है।
git checkout remotes/origin/deleted_branch
।
अधिकांश समय पहुंच से बाहर होने के कारण वापसी नहीं होती है। इसलिए, पहली कोशिश यह है कि कमांड का उपयोग करके रिफ्लॉग को देखेंgit reflog
(जो कि रिफ्लॉग को प्रदर्शित करता है HEAD
)।
शायद कुछ आसान हो अगर कमिट एक विशिष्ट ब्रांच का हिस्सा था जो अभी भी मौजूद है तो कमांड का उपयोग करना है git reflog name-of-my-branch
। यह एक रिमोट के साथ भी काम करता है, उदाहरण के लिए यदि आप पुश को मजबूर करते हैं (अतिरिक्त सलाह: हमेशाgit push --force-with-lease
इसके बजाय पसंद करें कि बेहतर गलतियों को रोकें और अधिक वसूली योग्य हो)।
यदि आपके कमिट आपके रिफ्लोग में नहीं हैं (शायद इसलिए कि एक 3 पार्टी टूल द्वारा हटा दिया गया है जो कि रिफ्लॉग में नहीं लिखते हैं), मैंने सफलतापूर्वक अपनी शाखा को एक कमांड का उपयोग करते हुए पाए गए कमिट के आकार में रीसेट करके पुनर्प्राप्त कर लिया है (यह सभी झूलने वाले फ़ाइल बनाता है):
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
यदि आपको इसका एक से अधिक बार उपयोग करना चाहिए (या इसे कहीं बचाना चाहते हैं), तो आप उस आदेश के साथ एक उपनाम भी बना सकते हैं ...
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
और इसके साथ प्रयोग करें git rescue
पाए गए कमिट्स की जांच करने के लिए, आप उन्हें देखने के लिए कुछ कमांड्स का उपयोग करके प्रत्येक कमिट को प्रदर्शित कर सकते हैं।
प्रतिबद्ध मेटाडेटा प्रदर्शित करने के लिए (लेखक, निर्माण की तारीख और संदेश):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
यह भी देखने के लिए:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
एक बार जब आप अपनी कमिटमेंट पा लेते हैं, तो इस कमेटी के साथ एक ब्रांच बनाएं:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
उन लोगों के लिए जो Windows के अंतर्गत हैं और GUI पसंद करते हैं, आप सुविधा => => का उपयोग करके GitExtensions के साथ आसानी से कमिट (और अनमैक्ड स्टेज्ड फ़ाइलें) पुनर्प्राप्त कर सकते हैं।Repository
Git maintenance
Recover lost objects...
हटाए गए फ़ाइलों को आसानी से पुनर्प्राप्त करने के लिए एक समान आदेश: https://stackoverflow.com/a/58853981/717372
यदि आप GUI का उपयोग करना पसंद करते हैं, तो आप पूरे ऑपरेशन को gitk के साथ कर सकते हैं।
gitk --reflog
यह आपको शाखा के प्रतिबद्ध इतिहास को देखने की अनुमति देगा जैसे कि शाखा को हटाया नहीं गया था। अब बस शाखा के लिए सबसे हाल ही में प्रतिबद्ध पर राइट क्लिक करें और मेनू विकल्प का चयन करें Create new branch
।
शीर्ष मतदान समाधान वास्तव में अनुरोध से अधिक है:
git checkout <sha>
git checkout -b <branch>
या
git checkout -b <branch> <sha>
हाल ही में किए गए सभी परिवर्तनों के साथ आपको नई शाखा में ले जाना, जो आप करना भूल गए हैं। यह आपका इरादा नहीं हो सकता है, खासकर जब शाखा खोने के बाद "आतंक मोड" में।
एक क्लीनर (और सरल) समाधान (आप पाया के बाद एक-लाइनर हो रहा है <sha>
के साथ git reflog
):
git branch <branch> <sha>
अब न तो आपकी वर्तमान शाखा और न ही बिना परिवर्तन प्रभावित हुए हैं। इसके बजाय केवल एक नई शाखा को ही बनाया जाएगा<sha>
।
यदि यह टिप नहीं है, तो यह अभी भी काम करेगा और आपको एक छोटी शाखा मिलती है, तो आप नए <sha>
और नए शाखा नाम के साथ पुन: प्रयास कर सकते हैं जब तक कि आप इसे ठीक नहीं करते।
अंत में आप सफलतापूर्वक बहाल की गई शाखा का नाम बदल सकते हैं।
git branch -m <restored branch> <final branch>
कहने की जरूरत नहीं है, सफलता की कुंजी सही कमिटमेंट को ढूंढना था <sha>
, इसलिए अपने कामों को समझदारी से नाम दें :)
स्पष्ट उत्तर में जोड़ना : Git स्रोतों के क्षेत्र में git-resurrect.sh स्क्रिप्ट भी contrib/
है (git.git रिपॉजिटरी में), जो आपकी मदद कर सकती है।
git-resurrect <name>
एक शाखा टिप के निशान को खोजने का प्रयास किया जाता है<name>
, और इसे फिर से जीवित करने की कोशिश करता है। वर्तमान में, रिफ्लॉग को चेकआउट संदेशों के लिए खोजा जाता है, और-r
संदेशों को मर्ज भी किया जाता है। साथ-m
और-t
, सभी refs के इतिहास के लिए स्कैन किया जाता हैMerge <name> into other
/Merge <other> into <name>
(क्रमशः) विषयों के लिए प्रतिबद्ध है, जो बल्कि धीमी है, लेकिन आप अन्य लोगों के विषय शाखाओं को फिर से शुरू करने के लिए अनुमति देता है।
मैंने अपनी हटाई गई शाखा को खोजने और पुनः प्राप्त करने के लिए निम्न आदेशों का उपयोग किया। पहला चरण जीसीबी के विवरण से है।
$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\ -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline
अब कमेंट कमेंट्स के आधार पर git कमिट आईडी (GIT-SHA) की तलाश करें और नीचे कमांड में इसका उपयोग करें। पहले से मिली GIT-SHA के साथ NEW-BRANCH नामक एक नई शाखा की जाँच करें:
$ git checkout -b NEW-BRANCH GIT-SHA
यदि आपके पास कोई रिफ्लॉग नहीं है, जैसे। क्योंकि आप एक नंगे रिपॉजिटरी में काम कर रहे हैं, जिसमें रिफ्लॉग सक्षम नहीं है और आप जो कमिट करना चाहते हैं, वह हाल ही में बनाया गया था, एक और विकल्प हाल ही में बनाई गई कमिट ऑब्जेक्ट्स को ढूंढना और उनके माध्यम से देखना है।
.git/objects
निर्देशिका चलाने के अंदर से :
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
यह पिछले 12 घंटों में बनाई गई सभी ऑब्जेक्ट (कमिट, फाइलें, टैग आदि) पाता है और उन्हें केवल कमिट दिखाने के लिए फिल्टर करता है। इनकी जाँच फिर एक त्वरित प्रक्रिया है।
मैं कोशिश करूँगा git-ressurect.sh स्क्रिप्ट का जकूब के उत्तर में पहले उल्लेख किया गया था ।
man find
: "-ctime n - फ़ाइल की स्थिति अंतिम बार n बदल गई थी * 24 घंटे पहले।" इसलिए हमें पिछले 12 घंटों के अपेक्षित व्यवहार के लिए 12 से 0.5 को भी बदलना चाहिए।
के लिए GitHub Git के बिना उन स्थापित:
यदि आप इसे GitHub वेबसाइट से पुनर्स्थापित करना चाहते हैं , तो आप रेपो से संबंधित घटनाओं की सूची प्राप्त करने के लिए उनके API का उपयोग कर सकते हैं :
प्रथम
उन SHAs को खोजें (हैश करें):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
... या निजी प्रतिनिधि के लिए:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(GitHub पासवर्ड के लिए संकेत दिया जाएगा)
आगे
• शाखाओं में जाएं और उस एक को हटा दें।
• एक ही पृष्ठ पर, रीलोडिंग के बिना , DevTools, नेटवर्क पैनल खोलें। अब तैयारी करें ...
• पुनर्स्थापना पर क्लिक करें। आपको एक नई "लाइन" दिखाई देगी। उस पर राइट-क्लिक करें और "प्रतिलिपि के रूप में कॉपी करें" चुनें और कुछ संपादक में इस पाठ को सहेजें।
• कोड की नकल की रेखा के अंत में, यह एक -H "Cookie="
:।
अब आपको कुछ इस तरह मिलना चाहिए:
curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
अंतिम चरण
पुनश्च
मुझे लगता है कि यह "सरलतम समाधान" या "सही" समाधान नहीं हो सकता है, लेकिन यह किसी के लिए उपयोगी होने की स्थिति में पेश किया जाता है।
git reflog
और इसलिए उदाहरण के लिए उपयोगी था जब एक दूरस्थ शाखा को हटा दिया गया था और कंप्यूटर तक पहुंच खो दी गई थी जिससे कुछ भी नहीं किया गया था जिससे उपयोगी ठंड प्राप्त नहीं की जा सकती थी reflog
। ध्यान दें कि जब curl
curl -u username:token https://api.github.com/user
curl -H "Authorization: token TOKEN" https://api.github.com/repos/USER_OR_ORG_NAME/REPO_NAME/events
मेरी समझ से यदि हटाए जाने वाली शाखा को किसी अन्य शाखा द्वारा पहुँचा जा सकता है, तो आप इसे सुरक्षित रूप से उपयोग करके हटा सकते हैं
git branch -d [branch]
और आपका काम गुम नहीं हुआ है। याद रखें कि एक शाखा स्नैपशॉट नहीं है, लेकिन एक सूचक है। इसलिए जब आप एक शाखा को हटाते हैं तो आप एक पॉइंटर को हटाते हैं।
यदि आप एक शाखा को हटा भी देते हैं तो आप वह काम नहीं छोड़ेंगे जो किसी दूसरे द्वारा नहीं किया जा सकता है। बेशक यह कमिट हैश की जाँच करना उतना आसान नहीं होगा, लेकिन फिर भी आप इसे कर सकते हैं। इसलिए Git एक शाखा को हटाने में असमर्थ है जिसे उपयोग करके नहीं पहुँचा जा सकता है -d
। इसके बजाय आपको उपयोग करना होगा
git branch -D [branch]
यह Git के बारे में Scott Chacon के एक वीडियो को अवश्य देखें। मिनट 58:00 जांचें जब वह शाखाओं के बारे में बात करता है और उन्हें कैसे हटाता है।
reflog
वे सिर्फ ओवरकिल हैं।
स्थानीय रूप से यह सब करना सुनिश्चित करें, और बिटकोबेट क्लाउड पर धकेलने से पहले अपनी रेपो स्थिति की पुष्टि करें। अपने वर्तमान रेपो का क्लोन बनाना और पहले इन समाधानों का परीक्षण करना भी एक अच्छा विचार हो सकता है।
Deleted branch <your-branch> (was <sha>)
2. शाखा को बहाल करने के लिए, उपयोग:
git checkout -b <branch> <sha>
यदि आपको अपने सिर के ऊपर से 'शा' नहीं पता है, तो आप कर सकते हैं:
git reflog
git checkout -b <branch> <sha>
यदि आपके कमिट आपके रिफ्लॉग में नहीं हैं:
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
2. फिर आप इनमें से किसी एक का उपयोग करके प्रत्येक प्रतिबद्ध प्रदर्शित कर सकते हैं:
git log -p <commit>
git cat-file -p <commit>
मैंने रिमोट से एक शाखा को हटा दिया, जो मैं नहीं चाहता था कि कुछ कमिट्स को साफ़ करने की कोशिश करने के लिए और जो मुझे चाहिए था, उसे सही करने के लिए जा रहा था। बेशक मैंने SHAs गलत लिखा है ...
यहाँ है कि मैंने उन्हें कैसे पाया (ज्यादातर जवाबों पर चीजों से आसान इंटरफ़ेस / बातचीत):
सबसे पहले, अपने लॉग में ढीले कमिट की एक सूची तैयार करें। इसे जल्द से जल्द करें और काम करना बंद कर दें, क्योंकि कूड़ा उठाने वाले द्वारा डंप किया जा सकता है।
git fsck --full --no-reflogs --unreachable --lost-found > lost
यह एक lost
फाइल बनाता है जिसमें आपको सभी कमिट्स को देखना होगा। हमारे जीवन को सरल बनाने के लिए, आइए इसमें से केवल SHA को काटें:
cat lost | cut -d\ -f3 > commits
अब आपके पास एक commits
फाइल है जिसमें सभी कमिट आपको देखने हैं।
मान लें कि आप बैश का उपयोग कर रहे हैं, अंतिम चरण:
for c in `cat commits`; do git show $c; read; done
यह आपको उनमें से प्रत्येक के लिए अंतर और प्रतिबद्ध जानकारी दिखाएगा। और आप प्रेस करने की प्रतीक्षा करें Enter। अब आप जो चाहते हैं, उसे लिख लें और फिर उन्हें चुन लें। आपके काम हो जाने के बाद, बस उसे Ctrl-C कर दें।
बड़ी हाँ
यदि आप GIT का उपयोग कर रहे हैं तो इन सरल चरणों का पालन करें https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
यदि आप स्मार्टगिट का उपयोग कर रहे हैं और पहले से ही उस शाखा को आगे बढ़ाते हैं, तो उस शाखा को खोजें और राइट क्लिक करें फिर चेकआउट करें
सबसे पहले अपने प्रोजेक्ट के लिए इस कदम की तरह जाएं:
cd android studio project
cd Myproject
then type :
git reflog
आप सभी के पास परिवर्तनों की एक सूची है और संदर्भ संख्या रेफरी नंबर लेती है, फिर
एंड्रॉइड स्टूडियो या चेक बिट से चेकआउट करें । एक अन्य उपाय रेफरी नंबर लें और एंड्रॉइड स्टूडियो में जाएं, नीचे git शाखाओं पर क्लिक करें फिर चेकआउट टैग पर क्लिक करें या संदर्भ संख्या पिछले पर संशोधन करें, फिर आपके पास शाखाएं हैं।
टैफ के उत्तर में जोड़कर, आप उल्लिखित इस प्रक्रिया से उबर सकते हैं, जब तक कि यह कमिट नहीं किया जाता है, कचरा एकत्र नहीं किया जाता है। Git शाखा केवल एक विशेष प्रतिबद्ध पेड़ में एक संकेतक है। लेकिन अगर आप पॉइंटर को हटाते हैं, और उस ब्रांच के कमिट को अन्य मौजूदा ब्रांच में मर्ज नहीं किया जाता है, तो गिट इसे कमिंग के रूप में मानते हैं और कचरा संग्रहण के दौरान उन्हें हटा देते हैं, जो कि समय-समय पर स्वचालित रूप से चल सकता है।
यदि आपकी शाखा को किसी मौजूदा शाखा में विलय नहीं किया गया था, और यदि यह कचरा एकत्र किया गया था, तो आप उस समय तक सभी कमिट्स को ढीला कर देंगे, जहां से शाखा को मौजूदा शाखा से निकाला गया था।
एक संबंधित मुद्दा: मैं इस पृष्ठ पर "कैसे हटाए गए शाखाओं को जानने के लिए खोज" के बाद आया था।
कई पुरानी शाखाओं को हटाने के दौरान, मुझे लगा कि मैंने गलती से नई शाखाओं में से एक को हटा दिया है, लेकिन इसे पुनर्प्राप्त करने के लिए नाम नहीं जानता।
यह जानने के लिए कि हाल ही में कौन सी शाखाएँ हटाई गई हैं, नीचे करें:
यदि आप अपने Git URL पर जाते हैं, जो कुछ इस तरह दिखाई देगा:
https://your-website-name/orgs/your-org-name/dashboard
फिर आप फ़ीड को देख सकते हैं, क्या हटा दिया गया है, किसके द्वारा, हाल के दिनों में।
मैंने यह कंप्यूटर पर किया है जिसे मैं शाखा को हटाता हूं:
git reflog
प्रतिक्रिया:
74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git
और मैं इस आदेश के साथ शाखा को पुनः प्राप्त करता हूं:
git checkout -b newBranchName 74b2383
सिर्फ इस्तेमाल git reflog
करने sha
से मेरे लिए वापसी नहीं हुई । केवल commit id
(जो कि 8 वर्ण लंबा है और एक सा लंबा रास्ता है)
इसलिए मैंने इस्तेमाल किया
git reflog --no-abbrev
और फिर जैसा ऊपर बताया गया है वैसा ही करें:
git checkout -b <branch> <sha>
ध्यान दें कि जीआईटी शाखा केवल स्थानीय प्रतिलिपि को हटाती है, सर्वर पर प्रतिलिपि नहीं। सबसे पहले, गिट पैनल (बाएं टूलबार पर गिट आइकन), शाखाओं के माध्यम से देखें और देखें कि क्या आपकी शाखा अभी भी "मूल / your_branch_name" के तहत है। यदि ऐसा है, तो बस उसे चुनें और आपको अपना कोड वापस प्राप्त करना चाहिए (सुझाव है कि आप तुरंत कॉपी / पेस्ट करें / इसे कहीं और स्थानीय रूप से सहेजें)।
यदि आपको "मूल / your_branch_name" नहीं दिखाई दिया, तो GitLens एक्सटेंशन इंस्टॉल करें। यह आपको सर्वर रिपॉजिटरी में नेत्रहीन रूप से प्रहार करने की अनुमति देता है और आपके द्वारा सर्वर पर सिंक की गई कॉपी का पता लगाता है। यदि आपके पास कई रिपॉजिटरी हैं, तो ध्यान दें कि GitLens में रिपॉजिटरी को प्रदर्शित करने के लिए वांछित रिपॉजिटरी से कम से कम एक फ़ाइल को खोलना आवश्यक हो सकता है। फिर:
GitLens पैनल खोलें
भंडार का विस्तार करें
आपको श्रेणियों की एक सूची देखनी चाहिए: शाखाएँ / योगदानकर्ता / पदच्युत / चरण / आदि
आपको "शाखाओं" के तहत या संभवतः "रीमोट्स -> मूल" के तहत YourLostTreasure ढूंढना चाहिए। उम्मीद है, आपको वांछित नाम के साथ एक शाखा दिखाई देगी - यदि आप इसका विस्तार करते हैं, तो आपको उस शाखा में परिवर्तित की गई फ़ाइलों को देखना चाहिए। उन्हें खोलने के लिए फ़ाइल नामों पर डबल-क्लिक करें, और तुरंत उस कोड का बैकअप लें।
यदि आपको तुरंत अपनी खोई हुई शाखा दिखाई नहीं देती है, तो इधर-उधर थपथपाएँ और अगर आपको कुछ आशाजनक लगे, तो उसे तुरंत खोलें और कोड को पकड़ें। जब तक मुझे TheGoldenBranch मिला, तब तक मुझे काफी परेशान होना पड़ा, और तब भी कोड पिछले एक या दो बचत को याद कर रहा था (संभवतः इसलिए कि मैं एक ब्रांच-मर्ज-लेकिन-गलती से क्लिक करने से पहले सर्वर से सिंक करने में विफल रहा- शाखा-हटाएं)। मेरी खोज अनावश्यक रूप से लंबी हो गई थी क्योंकि जब मुझे पहली बार शाखा मिली तो मुझे पूरी तरह से यकीन नहीं था कि नाम सही था इसलिए इसे देखना जारी रखा गया था, और उस पहली शाखा को फिर से खोजने में कुछ समय लगा। (इस प्रकार, कार्प कार्प और फिर देखते रहो।)