सभी खो जाने की सूची प्राप्त करें, जिनमें 'खोए हुए' शामिल हैं


139

मान लीजिए कि मेरा ग्राफ इस तरह है:

A---B---C---D (master)
     \
      \-E---F (HEAD)

अगर मैं ऐसा करता हूं git log --all --oneline, तो मुझे अपने सभी छह काम मिल जाएंगे।

लेकिन अगर ग्राफ है

A---B---C---D (master, HEAD)
     \
      \-E---F

मैं ई और एफ नहीं देखूंगा। क्या मुझे उन सभी कमिटों के बारे में बताने के लिए git मिल सकता है, जिनमें शाखाओं का नाम शामिल नहीं है?

धन्यवाद

जवाबों:


63

विशेष रूप से आसानी से नहीं- अगर आपने पॉइंटर को एक शाखा की नोक पर खो दिया है, तो यह एक हिस्टैक में सुई खोजने की तरह है। आप उन सभी कमिट्स को देख सकते हैं जो किसी भी संदर्भ में प्रकट नहीं होते git fsck --unreachableहैं- आपके लिए ऐसा करेंगे- लेकिन इसमें वे कमिट शामिल होंगे जिन्हें आप एक के बाद फेंक देते हैं git commit --amend, पुरानी शाखाएं आदि जिन्हें आपने रिजेक्ट कर दिया था आदि। एक बार में होने की संभावना बहुत अधिक जानकारी के माध्यम से उतारा है।

तो फ़्लिप्टेंट उत्तर है, उन चीज़ों पर नज़र न खोएँ जिनकी आप रुचि रखते हैं। अधिक गंभीरता से, रिफ्लॉग्स उन सभी कमिटों का संदर्भ रखेंगे जिन्हें आपने पिछले 60 दिनों में या डिफ़ॉल्ट रूप से उपयोग किया है। इससे भी महत्वपूर्ण बात, वे उन संदर्भों के बारे में कुछ संदर्भ देंगे जो उन लोगों के लिए हैं


7
+1: किसी प्रतिबद्ध एचईएडी के साथ काम करके commit --amendया जानबूझकर अनाथ होने के कारण जानबूझकर अनाथ किए गए rebaseऔर एक अनाथ के बीच कोई अंतर नहीं है , कहते हैं।
कैस्केबेल

3
वास्तव में। शायद उस स्थिति से उबरने का सबसे आसान तरीका है कि वह स्वयं ही हेड के लिए फिर से देखना चाहता है।
आराकनिद

@ जेफ्रोमी: git commit --amendडेड-एंड छोड़ने के बारे में महान बिंदु , खोए हुए काम। मैंने कुछ रिबासिंग और व्हाट्सएप किया और कुछ कमिट्स के साथ समाप्त हुआ, जो कि किसी भी शाखा से नहीं पहुंचे, और रेपो में उन्हें छोड़ना थोड़ा गंदा लगा। अब यह विचार बिलकुल भी अस्थिर नहीं है। :)
एमिल लंडबर्ग

2
@araqnid मैं अपने आप को मूल पोस्टर के रूप में एक ही अचार में मिला और आपके सुझाव को फिर से देखने के लिए सिर्फ करने की बात थी।
इग्नाजियो

7
मैं इस जवाब से सहमत हूं, लेकिन उस मामले में जहां किसी को सभी कमिटमेंट देखने की जरूरत होती है, जिसमें अनाथ लोग शामिल हैं चाहे जानबूझकर या आकस्मिक, git fsck --unreachableवह प्रदान नहीं करता है। मैंने बस कोशिश की। बेहतर दृष्टिकोण के लिए --reflogविकल्प है git log, जैसा कि केनोरब ने उत्तर दिया है । इसके बारे में विशेष रूप से अच्छा है कि संयुक्त के साथ --graph, आपको दृश्य संदर्भ को पार्स करने का एक आसान तरीका मिलता है, जो मूल प्रश्न में सचित्र है। उदाहरण के लिए, कोशिश करें:git log --graph --all --oneline --reflog
Inigo

111

प्रयत्न:

git log --reflog

जो सभी git को दर्शाती है कि यह दिखावा करके कि सभी वस्तुएं reflogs ( git reflog) के रूप में कमांड लाइन पर सूचीबद्ध हैं <commit>


1
यह वही है जिसकी मैं खोज कर रहा था - the-loglog तर्क की कार्यक्षमता।
अनोमली

3
Btw, gitk भी समर्थन करता है कि: gitk --reflog।
ald.li

50

जब मैं इस समस्या से निपटता हूं तो मैं निम्नलिखित कमांड का उपयोग करता हूं:

git reflog |  awk '{ print $1 }' | xargs gitk

इससे मुझे हाल के उन कमिटों की कल्पना करने में मदद मिली है जो बिना सिर के हो गए हैं।

मैं एक स्क्रिप्ट सहायक कहा जाता है में लिपटे है ~/bin/git-reflog-gitk


1
यह सिर्फ मुझे बड़ा समय दिया ... धन्यवाद!
ब्रेट रोइस्टर

यह कमाल का है! धन्यवाद! यह वास्तव में पेड़ के महत्वपूर्ण हिस्सों की कल्पना करता है।
म्लादेन बी।

बस एक टिप: यह केवल आपके स्थानीय कार्य के लिए रिकॉर्ड के रूप में काम करेगा when the tips of branches and other references were updated in the *local repository*git log --reflogयदि आप गैर-स्थानीय रेफ परिवर्तन के लिए ऐसा करना चाहते हैं, तो आप इसका उपयोग करना चाह सकते हैं
कृष्ण गुप्ता

29

मेरे जीवन को बचाने के लिए निम्नलिखित आदेश था:

git reflog

वहाँ आपको इतिहास के साथ एक स्क्रीन मिलती है जो इस तरह से काम करती है:

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

इस बिंदु पर, आपको केवल उस चीज़ को खोजना होगा HEAD@{X}जिसकी आपको आवश्यकता है, एक अस्थायी शाखा बनाएं और इसे इस तरह स्थानांतरित करें:

git checkout -b temp_branch HEAD@{X}

इस तरह से आपके पास अपनी खोई हुई प्रतिबद्धता के साथ एक अस्थायी शाखा होगी, जो बगैर पुनर्विचार या आपके गिट रिपॉजिटरी को भी तोड़ देगी।

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


26

@ कीरन के उत्तर की तरह, लेकिन कंसोल के लिए: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')


क्या आपको अंतिम भाग शामिल करने की आवश्यकता है: $ (git reflog | awk '{print $ 1}')? यह क्या करता है? अपने समाधान की कोशिश करने के बाद, ऐसा लगता है कि यह पिछले हिस्से के बिना भी समान उत्पादन करता है।
wmock

यदि आप अपने ब्रांच पॉइंटर को आगे बढ़ाते हैं और बिना संदर्भ के कुछ कमिट छोड़ते हैं (जैसे ओपी ने किया) तो वे अब दिखाई नहीं देंगे git log --all। एक त्वरित उदाहरण: git reset --hard @^आपके HEAD @ {0} प्रतिबद्ध के बाद केवल रिफ्लॉग में होगा, और चूंकि आप git reflogसमर्थन नहीं करते --graphहैं ताकि आपको git log --graphविज़ुअल प्रतिनिधित्व प्राप्त करने के लिए कमिट पास करना पड़े ।
फ्लोरियन फिदा

5
आप --reflogइसके बजाय का उपयोग कर सकते हैं$(git reflog | awk '{print $1}')
सिल्ड

मैंने तुलना git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')की git log --oneline --all --graph --decorate --reflog, वे लगभग समान हैं - सिवाय इसके कि - Wlog प्रविष्टियों जैसे विवरण शामिल हैं।
स्क्रिप्ट वुल्फ

@FlorianFida के बजाय, इसके बजाय का reflogउपयोग क्यों नहीं करते log --reflog?
पचेरियर

9

मैं इस समस्या को कैसे हल करूं? का उपयोग करें git fsckऔर लॉगिंग!

सबसे पहले एक फाइल बनाएं जिसमें खोया (अगम्य) कमिट और ब्लब्स हो। (नोट: अगर आपने कुछ ऐसा किया है git gcतो यह कचरा उन सभी को इकट्ठा करेगा और आप उन्हें यहां नहीं पाएंगे!)

$git fsck --lost-found > lost_found.commits

इससे आपको एक फाइल मिलती है:

झूलने प्रतिबद्ध dec2c5e72a81ef06963397a49c4b068540fc0dc3
झूलने ब्लॉब f8c2579e6cbfe022f08345fa7553feb08d60a975
झूलने ब्लॉब 0eb3e86dc112332ceadf9bc826c49bd371acc194
झूलने ब्लॉब 11cbd8eba79e01f4fd7f496b1750953146a09502
झूलने प्रतिबद्ध 18733e44097d2c7a800650cea442febc5344f9b3
झूलने ब्लॉब 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

फिर आप इस फाइल को अपने पसंदीदा टेक्स्ट एडिटर के साथ वहां से कमिट / ब्लॉग हैश कॉपी करने के लिए खोल सकते हैं। (* खांसी * vim macros इस * कफ * के लिए बहुत अच्छा काम करता है )

अब आप कुछ इस तरह से इस कमिट से वापस लॉग इन कर सकते हैं git log --oneline <commit hash>। वैकल्पिक रूप से, gitk, tig, या किसी अन्य git दर्शक को काम करना चाहिए।

आपके मामले में अगर आपको कमिटमेंट के लिए हैश मिल जाए तो लॉग आपको कुछ इस तरह दिखाएगा,

A---B---E---F

जल्द और आसान! अब आप उन सभी झटकों के पीछे का संदर्भ पा सकते हैं।

पुनश्च हाँ, मुझे पता है, देर से पोस्ट, लेकिन ओह ठीक है, कोई इसे यहाँ पा सकता है और इसे उपयोगी पा सकता है। (6 महीने में मुझे इसकी संभावना है जब मैं इसे फिर से गूगल करूँगा)


5

मुझे उस रिफ्लेक्ट को देखकर कमिट ठीक करने का सौभाग्य मिला है, जो यहां स्थित था .git/logs/HEAD

फिर मुझे फ़ाइल के अंत में नीचे जाना पड़ा , और मुझे यह वचन मिला कि मैं बस खो गया हूं।


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

5

हम git logकभी-कभी सभी कमिटमेंट प्राप्त करने के लिए अच्छा नहीं है, इसलिए इसे देखने के लिए ...

Mac के लिए: आप git प्रोजेक्ट में जाएं और टाइप करें:

$ nano .git/logs/HEAD

आप सभी को उस, या में देखने के लिए:

$ gedit .git/logs/HEAD

आप सभी को उसमें देखने के लिए,

तब आप अपने किसी भी पसंदीदा ब्राउज़र में एडिट कर सकते हैं।


3

@bsimmons

git fsck --lost-found | grep commit

फिर हर एक के लिए एक शाखा बनाएँ:

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

अब कई उपकरण आपको उन खोए हुए कमिट्स का चित्रमय दृश्य दिखाएंगे।


2

यदि आप Git एक्सटेंशन का उपयोग GUI करते हैं तो यह आपको "दृश्य -> ​​शो रिफ्लॉग संदर्भ दिखाएँ" चेक करने पर झूलने वाले चित्रांकन का चित्रमय दृश्य दिखा सकता है। यह अन्य सभी संदर्भित लोगों की तरह, पेड़ में झूलते हुए चित्र दिखाएंगे। इस तरह से यह खोजना आसान है कि आप क्या खोज रहे हैं।

प्रदर्शन के लिए यह छवि देखें । छवि पर C2, C3, C4 और C5 के कमिटिंग झूल रहे हैं, लेकिन फिर भी दिखाई दे रहे हैं।


2
git log --reflog

मुझे बचाया! मैंने अपना सिर विलय करते समय खो दिया और अपने साथियों को कमिट नहीं कर पाया! स्रोत के पेड़ में नहीं दिखा रहा है, लेकिन git log --reflogमेरे पहले के सभी स्थानीय प्रदर्शन दिखाओ

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