Git में स्थानीय आवागमन को दूर फेंक दें


1467

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

जाहिर है, मेरी वर्किंग डाइरेक्टरी को डिलीट करना और री-क्लोनिंग करना, लेकिन GitHub से सब कुछ डाउनलोड करना फिर से ओवरकिल जैसा लगता है, और मेरे समय का अच्छा उपयोग नहीं।

हो सकता git revertहै कि मुझे क्या चाहिए, लेकिन मैं मूल (या यहां तक ​​कि छह) के आगे 10 कमिट्स को समाप्त नहीं करना चाहता , भले ही यह कोड को सही स्थिति में वापस लाए। मैं सिर्फ पिछले आधे घंटे का नाटक करना चाहता हूं जो कभी नहीं हुआ।

क्या एक साधारण आदेश है जो ऐसा करेगा? यह एक स्पष्ट उपयोग के मामले जैसा लगता है, लेकिन मुझे इसका कोई उदाहरण नहीं मिल रहा है।


ध्यान दें कि यह प्रश्न विशेष रूप से कमिट्स के बारे में है , इसके बारे में नहीं :

  • अनट्रैक की गई फ़ाइलें
  • अस्थिर परिवर्तन
  • मंचन किया गया, लेकिन बिना परिवर्तन किए

जवाबों:


2468

यदि आपके अतिरिक्त कमिट्स केवल आपको दिखाई दे रहे हैं, तो आप केवल git reset --hard origin/<branch_name> उसी स्थान पर वापस जाने के लिए कर सकते हैं जहां मूल है। यह पिछली प्रतिबद्धताओं के भंडार की स्थिति को रीसेट कर देगा, और यह सभी स्थानीय परिवर्तनों को छोड़ देगा।

एक कर git revertदेता है नई प्रतिबद्ध दूर करने के लिए पुराने एक तरीका है कि हर किसी के इतिहास समझदार रहता में करता है।


90
git reset --hard <commit hash, branch, or tag>यदि आप दूरस्थ शाखा के अलावा किसी विशिष्ट संदर्भ में जाना चाहते हैं।
सैम सोफेस

55
बस स्पष्ट होने के लिए, यदि आप masterकिसी अन्य शाखा पर काम नहीं कर रहे हैं, तो आपको दौड़ना चाहिएgit reset --hard origin/<your-branch-name>
Zoltán

33
यह न केवल स्थानीय कमिट्स को हटा देगा, बल्कि आपके काम के पेड़ (यानी आप स्थानीय फाइलें) में भी सब कुछ फेंक देंगे। यदि सब आप क्या करना चाहते uncommit है, लेकिन अपने काम बरकरार छोड़ने के बाद आपको "Git रीसेट HEAD ^" ... प्रति क्या करना चाहिए stackoverflow.com/questions/2845731/...
aaronbauman

3
आप इसके बाद एक फ़ॉर्च करना चाह सकते हैं। इसने SourceTree पर संख्या-ऑफ-कमिट-वेटिंग-टू-द-पुश काउंटर तय किया।
स्टेन

2
git reset --hard origin/<branch_name>यह प्रोजेक्ट कॉन्फ़िगरेशन को भी रीसेट कर देगा, इसलिए इसका ध्यान रखें। मेरे पास एक बड़ी .cfgफ़ाइल है जो डिफ़ॉल्ट रूप से रीसेट हो गई थी। मुझे उस पर फिर से घंटे बिताने पड़े।
मैक

271

बस अपनी स्थानीय मास्टर शाखा को हटा दें और इसे फिर से बनाएं:

git branch -D master
git checkout origin/master -b master

2
यह तब अच्छा होता है जब आपके परिवर्तनों को पीछे ले जाने में बहुत अधिक समय लगेगा, जो एक दो विद्रोह के बाद मेरे साथ हुआ।
aross

1
टीम के सदस्यों के बीच सबट्री पुल / पुश समस्याओं के लिए उपयोगी!
जॉर्ज ऑर्पीनेल

यह सही है जब आप सिर्फ मास्टर के बजाय एक शाखा को बहाल करना चाहते हैं।
व्लादिमीर रालेव

1
यह सिंगल लोकल कमिट को डिलीट करने का अच्छा तरीका नहीं है। बेहतर उपयोग करने के लिएgit reset --hard origin/<branch_name>
किरीट वाघेला

1
शायद वह समाधान काम करेगा, लेकिन इसका मतलब यह नहीं है कि यह उचित है।
अदली

201

प्रयत्न:

git reset --hard <the sha1 hash>

जहाँ भी आप होना चाहते हैं अपना सिर रीसेट करें। देखने के लिए gitk का उपयोग करें, जिस पर आप होना चाहते हैं। आप gitk में भी रीसेट कर सकते हैं।


5
इस बी / सी को अपग्रेड किया गया है यह उपयोगी जानकारी है, लेकिन बेन जैक्सन के जवाब को मैं जो चाहता था, उसे ठीक से हल करने के लिए चेकमार्क प्राप्त करता है - इस तरह से मुझे प्रतिबद्ध हैश देखने की आवश्यकता नहीं थी। :)
डेविड मोल्स

2
यह वह समय है जब आपकी नई शाखा को अभी तक उत्पत्ति के लिए धक्का नहीं दिया गया है
Jan

126

सबसे हालिया प्रतिबद्ध हटाएं:

git reset --hard HEAD~1

आपके द्वारा किए गए कार्य को नष्ट किए बिना, सबसे हालिया प्रतिबद्ध हटाएं:

git reset --soft HEAD~1


5
उपयोगी उत्तर। धन्यवाद! मैंने
तरुण कुमार

2
@TarunKumar धन्यवाद! मैं वीएस एकीकरण का उपयोग कर रहा हूं, और आपका समाधान एकमात्र तरीका था जिससे मैं मर्ज के एक समूह का सफाया करने में सक्षम था, जो मैं उस शाखा में नहीं चाहता था जिसमें मुझे जांचने की अनुमति नहीं थी।
DVK

धन्यवाद, बस मैं जो देख रहा था, "git reset --soft HEAD ~ 1" ने काम वैसे ही किया जैसे मैंने अनायास किया था और वापस करना चाहता था, लेकिन दूसरी फाइलें थीं जिन्हें मैं वापस करने के बाद नष्ट नहीं करना चाहता था।
edvard_munch

47

यदि आप एटलसियन सोर्सट्री ऐप का उपयोग कर रहे हैं , तो आप संदर्भ मेनू में रीसेट विकल्प का उपयोग कर सकते हैं।

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


42

अपने शाखा प्रयास पर:

git reset --hard origin/<branch_name>

इसलिए " git log" या " git status" का उपयोग करके, उलट (राज्य में, कोई स्थानीय कमिट के साथ) को सत्यापित करें ।


1
@ ट्रॉयसेफ़: ऊपर सूचीबद्ध सभी उत्तर, मैंने जैसा भी प्रयास किया है, और निर्धारित परिदृश्य नहीं मिला। सामान्य दृष्टिकोण, जिसे उपरोक्त किसी भी उत्तर में चित्रित नहीं किया गया था, यहाँ पर उत्तर देने की कोशिश की गई है।
परिक्रमा

3
स्वीकार किए जाते हैं जवाब तुम्हारा के रूप में ही, शून्य से सामान्य शाखा का नाम है, और टिप्पणियों में @Zoltan स्पष्ट रूप से कहते हैंJust to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
Troyseph

1
मेरी राय में यह सबसे अच्छा जवाब है।
dwjohnston

21

git reset --hard @{u}* वर्तमान शाखा पर आपके सभी स्थानीय परिवर्तन हटाता है, जिसमें शामिल हैं। मुझे आश्चर्य है कि किसी ने भी इसे पोस्ट नहीं किया है, यह देखते हुए कि आपको यह देखने की ज़रूरत नहीं होगी कि शाखाओं के साथ वापस लौटने या खेलने के लिए क्या करना है।

* अर्थात्, वर्तमान शाखा में- @{upstream}असामान्य रूप से रीसेट करें origin/<branchname>, लेकिन हमेशा नहीं


1
मछली जैसे कुछ गोले "@" की व्याख्या करेंगे, इसलिए आपको '@ {u}' को उद्धरणों में रखना पड़ सकता है, जैसे 'git reset --hard' @ {u} '। वैसे भी, अच्छा खोजो!
trysis

बहुत बढ़िया जवाब बहुत बढ़िया है
Marko

1
आप {{u} का मूल्य कैसे प्रिंट करते हैं?
फिलिप रेगो

12

उस कमिटमेंट की SHA-1 आईडी को देखने / पाने के लिए जिसे आप वापस भी आना चाहते हैं

gitk --all

उस कमिट पर वापस जाने के लिए

git reset --hard sha1_id

!ध्यान दें। उस कमिट के बाद किए गए सभी कमिट (और प्रोजेक्ट में आपके सभी संशोधन) को हटा दिया जाएगा। इसलिए पहले परियोजना को किसी अन्य शाखा में बेहतर क्लोन करें या किसी अन्य निर्देशिका में कॉपी करें।


यह उन स्थितियों के लिए बहुत अच्छा है जहां रिमोट उपलब्ध नहीं है, और किसी को कुछ स्थानीय प्रतिबद्धताओं को रीसेट करने की आवश्यकता है। gitk कमाल है - इसके बारे में पहले से जानकारी नहीं थी।
द रिले

यदि आप पहले से ही gitk में हैं तो आप कमिट पर राइट-क्लिक कर सकते हैं और "यहाँ पर रीसेट शाखा XY का चयन करें"।
mkrieger1

और नए कमिट को तुरंत डिलीट नहीं किया जाएगा। उनकी ओर अब कोई शाखा नहीं है (याद रखें, एक शाखा एक विशेष प्रतिबद्ध के लिए "बुकमार्क" के अलावा कुछ भी नहीं है)।
mkrieger1 8

9

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

git rebase -i HEAD~2 -> यह पिछले दो कमिट्स को रीबेज करेगा

और मैंने कमिटमेंट के लिए 'ड्रॉप' का इस्तेमाल किया जिसे मैं हटाना चाहता था।


9

अनचाही फ़ाइलों को हटा दें (स्थानीय परिवर्तन नहीं किए गए)

git clean -df

सभी स्थानीय कमानों को स्थायी रूप से हटाकर नवीनतम रिमोट कमिटमेंट प्राप्त करें

git reset --hard origin/<branch_name>

8

स्थानीय कमिट्स के लिए जिन्हें पुश नहीं किया जा रहा है, आप git rebase -iकमिट करने के लिए या स्क्वैश करने के लिए भी उपयोग कर सकते हैं।


1
मुझे पता है कि यह सबसे छोटा समाधान नहीं हो सकता है, लेकिन मैंने आपको परेशान किया क्योंकि IMHO git rebase -iकई समान समस्याओं को हल करने का एक अधिक सामान्य तरीका है और विभिन्न स्थितियों में सहायक हो सकता है।
स्टीफन मारिनोव

1
dropरिब्रेस निरस्त होने से बचने के लिए सभी कमिटों को हटाते समय कीवर्ड (एक पंक्ति को हटाने के बजाय) का उपयोग करें ।
मिशाल Micizmazia

6

सरल समाधान मूल / मास्टर शाखा HEAD के लिए स्थानीय मास्टर शाखा HEAD से मिलान करना होगा

git reset --hard origin/master

PS: मूल / मास्टर - मास्टर शाखा के लिए दूरस्थ सूचक है। आप मास्टर को किसी भी शाखा के नाम से बदल सकते हैं


4

उत्तर देने से पहले आइए कुछ पृष्ठभूमि जोड़ते हैं, यह बताते हुए कि यह क्या है HEAD। नीचे दिए गए विकल्पों में से कुछ के परिणामस्वरूप अलग किया गया सिर होगा

First of all what is HEAD?

HEADबस वर्तमान शाखा पर वर्तमान प्रतिबद्ध (नवीनतम) के लिए एक संदर्भ है। किसी भी समय
केवल एक ही हो सकता है HEAD। (छोड़कर git worktree)

की सामग्री HEADअंदर संग्रहीत की जाती है .git/HEADऔर इसमें वर्तमान प्रतिबद्ध के 40 बाइट्स SHA-1 होते हैं।


detached HEAD

यदि आप नवीनतम कमिट पर नहीं हैं - इसका अर्थ है कि HEADइतिहास में एक पूर्व कमिट की ओर इशारा करना detached HEAD

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

कमांड लाइन पर, यह शाखा नाम के बजाय इस प्रकार दिखाई देगा - क्योंकि HEADवर्तमान शाखा के सिरे की ओर इशारा नहीं है

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

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

एक अलग सिर से उबरने के बारे में कुछ विकल्प:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

यह वांछित प्रतिबद्धता की ओर इशारा करते हुए नई शाखा की जाँच करेगा।
यह कमांड किसी दिए गए कमिट को चेकआउट करेगा।
इस बिंदु पर, आप एक शाखा बना सकते हैं और इस बिंदु से काम करना शुरू कर सकते हैं।

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

आप हमेशा के reflogरूप में अच्छी तरह से उपयोग कर सकते हैं ।
git reflogकिसी भी परिवर्तन को प्रदर्शित करेगा जो अपडेट किया गया था HEADऔर वांछित रिफ्लग प्रविष्टि की जाँच करके इस कमेटी को HEADवापस सेट कर देगा ।

हर बार जब संशोधित किया जाता है तो एक नई प्रविष्टि होगी reflog

git reflog
git checkout HEAD@{...}

यह आपको आपकी इच्छित कमिट पर वापस मिल जाएगा

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


git reset --hard <commit_id>

"HEAD" को अपने HEAD में इच्छित स्थान पर वापस ले जाएं।

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

git revert <sha-1>

दी गई प्रतिबद्ध या प्रतिबद्ध सीमा को "पूर्ववत करें"।
रीसेट कमांड दिए गए कमिट में किए गए किसी भी बदलाव को "पूर्ववत" करेगा।
पूर्ववत पैच के साथ एक नई प्रतिबद्धता होगी, जबकि मूल प्रतिबद्धता इतिहास में भी रहेगी।

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

यह स्कीमा दिखाता है कि कौन सी कमांड क्या करती है।
जैसा कि आप देख सकते हैं वहाँ reset && checkoutसंशोधित करें HEAD

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


3

विजुअल स्टूडियो समाधान में रुचि रखने वालों के लिए, यहाँ ड्रिल है:

  1. में Team Explorerखिड़की, लक्ष्य रेपो से कनेक्ट।
  2. फिर Branches, ब्याज की शाखा पर राइट-क्लिक करें और चुनें View history
  3. Historyविंडो में एक राइट-क्लिक करें और चुनें Reset -> Delete changes (--hard)

यह आपके स्थानीय कमिट्स को फेंक देगा और आपके रेपो की स्थिति को चयनित कमिट पर रीसेट कर देगा। यानी रेपो को खींचने के बाद आपके बदलाव खो जाएंगे।


2

यदि आपका ब्रांच origin/XXX5 कमिट द्वारा ' ' से आगे है।

आप जारी कर सकते हैं:

git reset --hard HEAD~5

और यह अंतिम 5 कमिट्स को हटा देना चाहिए।


0
git reset --hard <SHA-Code>

यह आपके काम आएगा यदि आपने अपनी स्थानीय कॉपी पर कुछ गलतियाँ की हैं जो आप यह सुनिश्चित करना चाहते हैं कि गलती से आपकी दूरस्थ शाखा को धक्का न लगे।

SHA- कोड शाखा पर अंतिम कमिट के लिए आपके git डैशबोर्ड के वेबवर्जन को देखकर प्राप्त किया जा सकता है।

इस तरह आप शाखा पर अंतिम प्रतिबद्ध के साथ सिंक्रनाइज़ हो सकते हैं।

आप git pullकुछ भी नया करने के लिए सिंक करने के लिए नए सिरे से पुष्टि करने के लिए हार्ड रीसेट पूरा करने के बाद आप कर सकते हैं यानी आपको संदेश देखने को मिलता है।

आपकी शाखा अप टू डेट है Origin/<Branch Name>


0

यदि आप अपने स्थानीय रेपो को पूरी तरह से गड़बड़ कर देते हैं, तो गिट में स्थानीय आवागमन को दूर करने का एक विश्वसनीय तरीका है ...

  1. दूरस्थ उत्पत्ति का URL प्राप्त करने के लिए "git config --get Remote.origin.url" का उपयोग करें
  2. "My_broken_local_repo" के लिए स्थानीय git फ़ोल्डर का नाम बदलें
  3. दूरस्थ गिट रिपॉजिटरी की ताज़ा स्थानीय प्रतिलिपि प्राप्त करने के लिए "git क्लोन <url_from_1>" का उपयोग करें

मेरे अनुभव में, ग्रहण दुनिया को उसके चारों ओर बदलते हुए अच्छी तरह से संभालता है। हालांकि, आपको ग्रहण में प्रभावित परियोजनाओं का चयन करने और उन्हें फिर से बनाने के लिए ग्रहण को मजबूर करने के लिए उन्हें साफ करने की आवश्यकता हो सकती है। मुझे लगता है कि अन्य आईडीई को एक मजबूर पुनर्निर्माण की भी आवश्यकता हो सकती है।

उपरोक्त प्रक्रिया का एक पक्ष लाभ यह है कि आपको पता चलेगा कि क्या आपका प्रोजेक्ट स्थानीय फ़ाइलों पर निर्भर करता है जिन्हें गिट में नहीं डाला गया था। यदि आप पाते हैं कि आप फाइलें गायब हैं तो आप उन्हें "my_broken_local_repo" से कॉपी कर सकते हैं और उन्हें git में जोड़ सकते हैं। एक बार जब आपको विश्वास हो जाता है कि आपके नए स्थानीय रेपो में आपके लिए आवश्यक सब कुछ है तो आप "my_broken_local_repo" को हटा सकते हैं।


0

यदि आप सिर्फ स्थानीय कमिट्स को फेंकना चाहते हैं और फाइलों में किए गए संशोधनों को रखना चाहते हैं, तो
git रीसेट करें ~ ~
अन्य उत्तर हार्ड रीसेट को संबोधित करते हैं

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