2011-01-24 17 views
59

चलो कहते हैं कि मैं इस तरह एक ग्राफ है कि दो:सभी गिट की सूची करता है?

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

अगर मैं git log --all --oneline करते हैं, मैं अपने प्रतिबद्ध के सभी छह मिल जाएगा।

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

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

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

धन्यवाद

उत्तर

35

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

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

+5

+1: 'प्रतिबद्ध - आदेश' या 'रीबेज 'द्वारा जानबूझकर अनाथाश्रम किए गए प्रतिबद्धता के बीच बिल्कुल अंतर नहीं है और एक अलग-अलग सिर के साथ काम करके गलती से अनाथ हो गया है। वास्तव में – Cascabel

+3

। शायद उस स्थिति से ठीक होने का सबसे आसान तरीका हेड के लिए खुद को रिफ्लॉग देखना होगा। – araqnid

+0

धन्यवाद, यह मदद करता है। यहां तक ​​कि झिलमिलाहट जवाब भी :) +1 – Amadan

3

मैं भाग्य उबरने reflog, जो .git/logs/HEAD

मैं तो फ़ाइल के अंत तक नीचे स्क्रॉल करने के लिए किया था पर स्थित था को देखकर प्रतिबद्ध लिया है, और मैं प्रतिबद्ध मैं सिर्फ खो पाया ।

3

हम करेंगे git log कभी कभी सब तो यह देखने के लिए विस्तार करता है, प्राप्त करने के लिए अच्छा नहीं है ...

Mac के लिए: जाओ में आप परियोजना और प्रकार git:

$ nano .git/logs/HEAD 

आप देखना वह सब में करता है, या:

$ gedit .git/logs/HEAD 

कि आप सब करता देखने के लिए,

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

32

जब मैं इस मुद्दे को मैं निम्न आदेश का उपयोग से निपटने:

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

यह मैं हाल ही में करता है जो बिना सिर बन गए हैं कल्पना कर सकते हैं।

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

4

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

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

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

है कि आप इस तरह की एक फ़ाइल देता है:

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

आप फिर वहाँ से प्रतिबद्ध/ब्लॉग हैश कॉपी करने के लिए पसंदीदा पाठ संपादक आपसे यह फ़ाइल खोल सकते हैं। (* खांसी * vim मैक्रो इस के लिए अच्छा काम करता है * खांसी *)

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

आपके मामले में अगर आप प्रतिबद्ध एफ के लिए लॉग आप कुछ इस तरह दिखाई देगा हैश मिल जाए,

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

त्वरित और आसान! अब आप उन सभी खतरनाक कामों के पीछे संदर्भ पा सकते हैं।

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

16

तरह @Kieran के जवाब है, लेकिन कंसोल के लिए: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

+0

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

+0

यदि आप अपनी शाखा सूचक को स्थानांतरित करते हैं और किसी संदर्भ के बिना कुछ काम करते हैं (जैसे ओपी किया जाता है) तो वे अब 'गिट लॉग --all' में दिखाई नहीं देंगे। एक त्वरित उदाहरण: 'गिट रीसेट - हार्ड @ ^' के बाद आपका हेड @ {0} प्रतिबद्धता केवल रिफ्लॉग में होगी, और चूंकि 'गिट रीफ्लॉग' का समर्थन नहीं करता है '- ग्राफ' आपको प्रतिबद्धताएं पास करनी होंगी एक दृश्य प्रतिनिधित्व प्राप्त करने के लिए 'गिट लॉग - ग्राफ'। –

+2

आप '' '$ (गिट रीफ्लॉग | awk '{प्रिंट $ 1}' के बजाय' '' --reflog''' का उपयोग कर सकते हैं '' '' – Sild

21

प्रयास करें:

git log --reflog 

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

1

@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 

अब कई उपकरण आप उन खो प्रतिबद्ध की एक ग्राफिकल दृश्य दिखाई देगा।

संबंधित मुद्दे