[git] गिट में हालिया कामों को पूर्ववत कैसे करें?



Answers

यदि आप नहीं जानते कि यह कैसे काम करता है तो प्रतिबद्धता पूर्ववत करना थोड़ा डरावना है। लेकिन अगर आप समझते हैं तो यह वास्तव में आश्चर्यजनक रूप से आसान है।

मान लें कि आपके पास यह है, जहां सी आपका सिर है और (एफ) आपकी फाइलों की स्थिति है।

   (F)
A-B-C
    ↑
  master

आप सी को प्रतिबद्ध करना चाहते हैं और इसे फिर कभी नहीं देख सकते हैं । तुम इसे करो:

git reset --hard HEAD~1

परिणाम है:

 (F)
A-B
  ↑
master

अब बी सिर है। क्योंकि आपने उपयोग किया - --hard , आपकी फाइलें प्रतिबद्धता बी पर अपने राज्य में रीसेट हो गई हैं।

आह, लेकिन मान लीजिए प्रतिबद्ध सी आपदा नहीं थी, लेकिन थोड़ा सा बंद था। आप प्रतिबद्धता पूर्ववत करना चाहते हैं लेकिन बेहतर प्रतिबद्ध करने से पहले अपने परिवर्तनों को थोड़ा संपादन के लिए रखें। यहां से फिर से शुरू, सी के साथ अपने सिर के रूप में:

   (F)
A-B-C
    ↑
  master

आप यह कर सकते हैं, --hard छोड़कर:

git reset HEAD~1

इस मामले में परिणाम है:

   (F)
A-B-C
  ↑
master

दोनों मामलों में, हेड नवीनतम प्रतिबद्धता के लिए सिर्फ एक सूचक है। जब आप एक git reset HEAD~1 , तो आप गिट को हेड पॉइंटर को एक प्रतिबद्धता में ले जाने के लिए कहते हैं। लेकिन (जब तक आप - --hard उपयोग --hard ) आप अपनी फाइलें जैसे ही थे। तो अब git status उन बदलावों को दिखाता है जिन्हें आपने सी में चेक किया था। आपने कुछ खोया नहीं है!

सबसे हल्के स्पर्श के लिए, आप अपनी प्रतिबद्धता को पूर्ववत कर सकते हैं लेकिन अपनी फाइलें और अपनी index छोड़ सकते हैं :

git reset --soft HEAD~1

यह न केवल आपकी फाइलों को अकेला छोड़ देता है, यह आपके सूचकांक को अकेला छोड़ देता है। जब आप git status , तो आप देखेंगे कि वही फ़ाइलें इंडेक्स में पहले की तरह हैं। असल में, इस आदेश के ठीक बाद, आप git commit कर सकते हैं और आप उसी प्रतिबद्धता को फिर से शुरू कर देंगे जो आपने अभी किया था।

एक और बात: मान लीजिए कि आप पहले उदाहरण में एक प्रतिबद्धता को नष्ट कर देते हैं , लेकिन फिर पता चलता है कि आपको इसकी आवश्यकता है ? कठिन भाग्य, है ना?

नहीं, अभी भी इसे वापस पाने का एक तरीका है। git reflog टाइप करें और आप उस आंशिक (आंशिक) प्रतिबद्ध शास की एक सूची देखेंगे जिसमें आपने चारों ओर स्थानांतरित किया है। अपनी प्रतिबद्धता को ढूंढें, और ऐसा करें:

git checkout -b someNewBranchName shaYouDestroyed

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

Question

मैंने गलती से Git को गलत फाइलें दी हैं, लेकिन मैंने अभी तक सर्वर पर प्रतिबद्धता को push नहीं दिया है।

स्थानीय भंडार से उन लोगों को कैसे पूर्ववत किया जा सकता है?




सरल, इसे अपनी कमांड लाइन में चलाएं:

git reset --soft HEAD~ 



जिस चीज को आप चाहते हैं उसे पाने के लिए फ़ाइलों को जोड़ें / हटाएं:

git rm classdir
git add sourcedir

फिर प्रतिबद्धता में संशोधन करें:

git commit --amend

पिछली, ग़लत प्रतिबद्धता को नए इंडेक्स राज्य को प्रतिबिंबित करने के लिए संपादित किया जाएगा - दूसरे शब्दों में, ऐसा होगा जैसे आपने पहली बार गलती नहीं की थी।

ध्यान दें कि आपको केवल तभी करना चाहिए यदि आपने अभी तक धक्का नहीं दिया है। यदि आपने धक्का दिया है, तो आपको सामान्य रूप से एक फिक्स करना होगा।




git log टाइप करें और अंतिम प्रतिबद्ध हैश कोड ढूंढें और फिर दर्ज करें:

git reset <the previous co>



इस आलेख में एक उत्कृष्ट स्पष्टीकरण है कि विभिन्न परिदृश्यों के बारे में कैसे जाना है (जहां एक प्रतिबद्धता के साथ-साथ पुश या धक्का से पहले केवल एक प्रतिबद्धता है):

http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

From the article, the easiest command I saw to revert a previous commit by its commit id , was:

git revert dd61ab32



git का उपयोग करके नीचे दिए गए कमांड को बस रीसेट करें:

git reset --soft HEAD~1

समझाएं: क्या git reset करता है, यह मूल रूप से किसी भी प्रतिबद्धता को reset कर देता है जिसे आप वापस जाना चाहते हैं, फिर यदि आप इसे - --soft कुंजी के साथ --soft , तो यह वापस जायेगा, लेकिन आपकी फ़ाइल में बदलावों को बनाए रखेगा, इसलिए आप मंच पर वापस आ गए हैं, जिसे फ़ाइल अभी जोड़ा गया था, HEAD शाखा का प्रमुख है और यदि आप ~1 साथ गठबंधन करते हैं (इस मामले में आप HEAD^ का भी उपयोग करते हैं), तो यह केवल एक प्रतिबद्धता वापस जायेगा जो आप चाहते हैं। ..

मैं आपके लिए अधिक जानकारी में नीचे दी गई छवि में चरणों का निर्माण करता हूं, जिसमें वास्तविक परिस्थितियों में होने वाले सभी चरणों और कोड को शामिल करना शामिल है:




दूसरा रास्ता:

उस शाखा को चेकआउट करें जिसे आप वापस करना चाहते हैं, फिर अपनी स्थानीय कार्य प्रतिलिपि को उस प्रतिबद्धता पर रीसेट करें जिसे आप रिमोट सर्वर पर नवीनतम एक बनना चाहते हैं (इसके बाद सब कुछ अलविदा होगा)। ऐसा करने के लिए, SourceTree I में राइट-क्लिक किया गया और चयनित "इस प्रतिबद्धता में BRANCHNAME रीसेट करें"।

फिर अपनी रिपोजिटरी की स्थानीय निर्देशिका पर नेविगेट करें और यह आदेश चलाएं:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

इससे आपके स्थानीय भंडार में वर्तमान के बाद सभी काम मिटाए जाएंगे, लेकिन केवल एक शाखा के लिए।




मैं अपने साझा भंडार में सबसे आखिरी 5 कामों को पूर्ववत करना चाहता था। मैंने संशोधन आईडी को देखा जो मैं रोलबैक करना चाहता था। फिर मैंने निम्नलिखित में टाइप किया।

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>



एक ही आदेश:

git reset --soft 'HEAD^' 

यह अंतिम स्थानीय प्रतिबद्धता पूर्ववत करने के लिए बहुत अच्छा काम करता है!




"काम करने वाले पेड़ को अंतिम प्रतिबद्धता में रीसेट करें"

git reset --hard HEAD^ 

"काम करने वाले पेड़ से अज्ञात फाइलें साफ़ करें"

git clean    

देखें - गिट त्वरित संदर्भ

नोट: यह आदेश आपकी पिछली प्रतिबद्धता को हटा देगा, इसलिए सावधानी के साथ उपयोग करें! git reset --hard - git reset --hard सुरक्षित है -




यदि आप इसे स्थायी रूप से पूर्ववत करना चाहते हैं और आपने कुछ भंडार क्लोन किया है

प्रतिबद्ध आईडी द्वारा देखा जा सकता है

git log 

फिर आप कर सकते हैं -

git reset --hard <commit_id>

git push origin <branch_name> -f



पिछली स्थानीय प्रतिबद्धता को कैसे ठीक करें

एक git commit --amend करने के लिए गिट-गुई (या इसी तरह) का प्रयोग करें - git commit --amend । जीयूआई से आप प्रतिबद्ध से व्यक्तिगत फाइलें जोड़ या निकाल सकते हैं। आप प्रतिबद्ध संदेश भी संशोधित कर सकते हैं।

पिछले स्थानीय प्रतिबद्धता को पूर्ववत कैसे करें

बस अपनी शाखा को पिछले स्थान पर रीसेट करें (उदाहरण के लिए, gitk या git rebase gitk का उपयोग करके)। फिर सहेजे गए प्रतिलिपि से अपने परिवर्तन दोबारा लागू करें। आपके स्थानीय भंडार में कचरा संग्रह के बाद, यह अवांछित प्रतिबद्धता की तरह कभी नहीं होगा। एक ही कमांड में ऐसा करने के लिए, git reset HEAD~1 उपयोग करें।

चेतावनी का शब्द : git reset का लापरवाही उपयोग आपकी कामकाजी प्रति को एक भ्रमित स्थिति में लाने का एक अच्छा तरीका है। मैं अनुशंसा करता हूं कि गिट नौसिखियां इससे बचें यदि वे कर सकते हैं।

सार्वजनिक प्रतिबद्धता को पूर्ववत कैसे करें

परिवर्तनों को पूर्ववत करने के लिए एक रिवर्स चेरी पिक ( git-revert ) करें।

यदि आपने अभी तक अपनी शाखा में अन्य बदलाव नहीं खींचा हैं, तो आप बस कर सकते हैं ...

git revert --no-edit HEAD

फिर अपनी अद्यतन शाखा को साझा भंडार में दबाएं।

प्रतिबद्धता इतिहास दोनों अलग-अलग काम दिखाएगा

उन्नत: सार्वजनिक भंडार में निजी शाखा का सुधार

यह खतरनाक हो सकता है - सुनिश्चित करें कि आपके पास शाखा की स्थानीय प्रतिलिपि है।

यह भी ध्यान दें: यदि आप किसी और शाखा में काम कर रहे हैं तो आप ऐसा नहीं करना चाहते हैं।

git push --delete (branch_name) ## remove public version of branch

अपनी शाखा को स्थानीय रूप से साफ करें, फिर पुन: दबाएं ...

git push origin (branch_name)

सामान्य स्थिति में, आपको शायद अपने निजी-शाखा प्रतिबद्ध इतिहास के बारे में चिंता करने की आवश्यकता नहीं है। बस एक फॉलोअप प्रतिबद्धता को दबाएं (ऊपर 'सार्वजनिक प्रतिबद्धता को पूर्ववत करने के लिए कैसे करें) देखें, और बाद में, इतिहास को छिपाने के लिए squash-merge करें।




दो मुख्य परिदृश्य हैं

आपने अभी तक प्रतिबद्धता को धक्का नहीं दिया है

अगर समस्या अतिरिक्त फाइलें थीं (और आप उन्हें भंडार पर नहीं चाहते हैं), तो आप उन्हें git rm का उपयोग करके हटा सकते हैं और फिर --amend साथ --amend

git rm <pathToFile>

आप -r साथ, या अन्य Bash कमांड के साथ गठबंधन के साथ पूरी निर्देशिका को भी हटा सकते हैं

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

फ़ाइलों को हटाने के बाद, आप --amend विकल्प के साथ प्रतिबद्ध कर सकते हैं

git commit --amend -C HEAD # the -C option is to use the same commit message

यह आपके हालिया स्थानीय प्रतिबद्धताओं को अतिरिक्त फ़ाइलों को हटाने के लिए फिर से लिख देगा, इसलिए, इन फ़ाइलों को कभी भी पुश पर नहीं भेजा जाएगा और जीसी द्वारा आपके स्थानीय .git रिपोजिटरी से भी हटा दिया जाएगा।

आपने पहले ही प्रतिबद्धता को धक्का दिया है

आप अन्य परिदृश्य का एक ही समाधान लागू कर सकते हैं और फिर -f विकल्प के साथ git push कर सकते हैं, लेकिन यह अनुशंसित नहीं है क्योंकि यह रिमोट इतिहास को एक अलग परिवर्तन के साथ ओवरराइट करता है (यह आपके भंडार को गड़बड़ कर सकता है)।

इसके बजाए, आपको बिना काम के प्रतिबद्धता करना है (इसे याद रखें- यह विकल्प अंतिम प्रतिबद्धता पर इतिहास को फिर से लिखता है)।




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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

अब प्रतिबद्ध फाइलें चरणबद्ध क्षेत्र से अस्थिर क्षेत्र में आती हैं। अब फाइलें संपादित करने के लिए तैयार हैं, इसलिए जो कुछ भी आप बदलते हैं, आप संपादित करना चाहते हैं और इसे जोड़ना और ताज़ा / नई प्रतिबद्धता बनाना चाहते हैं।

More




अंतिम प्रतिबद्धता को बदलने के लिए

इंडेक्स में फ़ाइलों को बदलें:

git rm --cached *.class
git add *.java

फिर, यदि यह एक निजी शाखा है, तो प्रतिबद्धता में संशोधन करें:

git commit --amend

या, यदि यह एक साझा शाखा है, तो एक नई प्रतिबद्धता बनाएं:

git commit -m 'Replace .class files with .java files'


( पिछली प्रतिबद्धता को बदलने के लिए , भयानक इंटरैक्टिव रीबेस का उपयोग करें)

ProTip ™: यह फिर से होने से रोकने के लिए *.class gitignore में *.class जोड़ें।

एक प्रतिबद्धता वापस करने के लिए

प्रतिबद्धता में संशोधन करना आदर्श समाधान है यदि आपको अंतिम प्रतिबद्धता को बदलने की आवश्यकता है, लेकिन एक और सामान्य समाधान reset

आप गिट को किसी भी प्रतिबद्धता के साथ रीसेट कर सकते हैं:

git reset @~N

जहां N HEAD से पहले काम करने की संख्या है, और @~ पिछले प्रतिबद्धता को रीसेट करता है।

तो, प्रतिबद्धता में संशोधन करने के बजाय, आप इसका उपयोग कर सकते हैं:

git reset @~
git add *.java
git commit -m "Add .java files"

यह क्या करता है इसकी बेहतर समझ के लिए, git help reset , विशेष रूप से --soft --mixed और --hard पर --soft --mixed

Reflog

यदि आप गड़बड़ करते हैं, तो आप गिराए गए कामों को खोजने के लिए हमेशा रीफ्लॉग का उपयोग कर सकते हैं:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started





Related