मैं Git में खोई हुई प्रतिबद्धता को कैसे पुनर्प्राप्त कर सकता हूं?


258

सबसे पहले, "आपकी शाखा मूल / मास्टर से 3 कमिट्स से आगे है" फिर मेरा ऐप पहले के बदलावों के साथ पुराने समय में वापस आ गया है।

पिछले 11 घंटों को वापस करने में मुझे क्या मिलेगा?


जवाबों:


586

git reflogआपका दोस्त है। उस सूची को प्राप्त करें जिसे आप उस सूची में रखना चाहते हैं और आप इसे रीसेट कर सकते हैं (उदाहरण के लिए:) git reset --hard e870e41

(यदि आपने अपने परिवर्तन नहीं किए हैं ... तो आप मुश्किल में पड़ सकते हैं - जल्दी कमिट करें, और अक्सर कमिट करें! "


5
देख लेना git log HEAD@{1}। यदि वह कमिट की सही श्रृंखला की तरह दिखता है, तो आप कर सकते हैं git reset HEAD@{1}
अंबर

4
केवल अगर कोड का मंचन किया जाता है (git ऐड का उपयोग करके), तो उन्हें git में रखा जाता है और जैसे कमांड्स का उपयोग करके आसानी से वापस पाया जा सकता है git fsck --lost-found
लैंड्स

2
दुर्घटनावश पुनर्जागरण करते समय मुझे एक प्रतिबद्ध छोड़ देना चाहिए था। इसने मुझे पूरी तरह से काम के लायक कुछ घंटों के लिए फिर से बचाया।
6

27
इससे मेरी जान बच गई।
लुटाया हुजैफा इदरीस

6
इसने मेरी पवित्रता को बचा लिया: डी
फ्रैंक फाजार्डो

117

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

First of all what is HEAD?

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

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


detached HEAD

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

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

कमांड लाइन पर, यह इस तरह दिखाई देगा - SHA-1 शाखा के नाम के बजाय चूंकि 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 a 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

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


2
आप एक नायक हैं, साहब
dylanh724

4
कि बस मुझे कई घंटे काम बचा लिया। मैंने प्रत्येक प्रविष्टि के लिए तिथि / समय देखने के लिए "git reflog --date = iso" का उपयोग किया क्योंकि मैं टाइमस्टैम्प के बिना सुनिश्चित नहीं कर सकता था।
मेटलमेस्टर

1
मेरे लिए git reset --hard <commit_id>, हटाने में , HEADकाम किया! चित्रमय प्रतिनिधित्व के लिए +1 !!
reverie_ss

बस उल्लेख करने के लिए: यदि आप शाखा का नाम जानते हैं: git reflog <branchname>काफी उपयोगी हो सकता है, क्योंकि आप सिर्फ एक शाखा के परिवर्तन देखते हैं।
मार्कस श्रेबर

35

हटाए गए कमिट में आने का दूसरा तरीका git fsckकमांड के साथ है ।

git fsck --lost-found

यह अंतिम पंक्ति की तरह कुछ उत्पादन करेगा:

dangling commit xyz

हम जांच सकते हैं कि यह reflogअन्य उत्तरों में सुझाए अनुसार उपयोग करने के लिए समान है। अब हम एक कर सकते हैंgit merge

git merge xyz

नोट: अगर हम पहले से ही एक कमांड चला चुके हैं, तो हम
कमिट वापस नहीं ले सकते, जो डैंगलिंग कमिट के संदर्भ को हटा देगा।fsckgit gc


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