जवाबों:
git log
वर्तमान HEAD और उसके वंश को दर्शाता है। यही है, यह प्रतिबद्ध हेड को इंगित करता है, फिर उसके माता-पिता, उसके माता-पिता, और इसी तरह। यह रेपो की वंशावली के माध्यम से पीछे हटता है, प्रत्येक व्यक्ति के माता-पिता की पुनरावृत्ति करता है।
(व्यवहार में, कुछ कमिट में एक से अधिक माता-पिता होते हैं। अधिक प्रतिनिधि लॉग देखने के लिए, जैसे कमांड का उपयोग करें git log --oneline --graph --decorate
।)
git reflog
HEAD के वंश को बिल्कुल भी पार नहीं करता है। Reflog उन हिट्स की एक आदेशित सूची है, जिन्हें HEAD ने इंगित किया है: यह आपके रेपो के लिए पूर्ववत इतिहास है। रिफ्लॉग स्वयं रेपो का हिस्सा नहीं है (यह खुद को कमिट करने के लिए अलग से संग्रहीत किया जाता है) और पुश, भ्रूण या क्लोन में शामिल नहीं है; यह पूरी तरह से स्थानीय है।
इसके अलावा: रिफ्लॉग को समझने का मतलब है कि आपके प्रतिबद्ध होने के बाद आप वास्तव में अपने रेपो से डेटा नहीं खो सकते हैं। यदि आप गलती से किसी पुराने कमिट पर रीसेट कर देते हैं, या गलत तरीके से रिबेट करते हैं, या कोई अन्य ऑपरेशन जो नेत्रहीन "हटाता है" करता है, तो आप रिफ्लेग का उपयोग यह देखने के लिए कर सकते हैं कि आप पहले कहां थे और git reset --hard
वापस अपनी पिछली स्थिति को बहाल करने के लिए वापस आ गए। याद रखें, refs का मतलब सिर्फ कमिट नहीं बल्कि इसके पीछे का पूरा इतिहास है।
.git/logs/refs/<branch>
प्रविष्टियों का प्रारूप है <old_rev> <new_rev> [...] <timestamp> [...]
। आप टाइमस्टैम्प द्वारा कंक्रीटिंग और सॉर्टिंग का प्रयास कर सकते हैं। हालाँकि, कुछ पंक्तियाँ new_rev
अगले वाले से मेल नहीं खा सकती हैं old_rev
(जिस स्थिति में मुझे संदेह है कि रिफ्लॉग अमान्य होगा। फिर आप अनुक्रम को "ठीक" करने के लिए नकली प्रविष्टियां डालने का प्रयास कर सकते हैं, लेकिन यह मेरे लिए बहुत परेशानी की बात है।
git log
रेफरी (सिर, टैग, उपाय) से सुलभ लॉग को दिखाता हैgit reflog
एक है रिकॉर्ड सब करता है कि कर रहे हैं या किसी भी समय अपने रेपो में संदर्भित कर रहे थे की।यही कारण है कि git reflog
(एक स्थानीय रिकॉर्डिंग जो डिफ़ॉल्ट रूप से 90 दिनों के बाद छंटनी होती है) का उपयोग तब किया जाता है जब आप उस शाखा द्वारा संदर्भित SHA1 को वापस पाने के लिए एक "विनाशकारी" ऑपरेशन (जैसे एक शाखा को हटाना) करते हैं।
देखें git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
एक्सपायर इस समय की तुलना में पुरानी प्रविष्टियों को हटाता है; 90 दिनों के लिए चूक। बीच में
"<pattern>
" (उदाहरण के लिए "refs/stash
") के साथ सेटिंग केवल उन रेफल्स पर लागू होती है जो मेल खाते हैं<pattern>
।
git reflog
अक्सर " आपके सुरक्षा जाल " के रूप में संदर्भित होता है
परेशानी के मामले में, सामान्य सलाह, जब गिट लॉग आपको वह नहीं दिखाता है जो आप देख रहे हैं:
फिर से, reflog आपके SHA1 की एक स्थानीय रिकॉर्डिंग है।
जैसा कि विरोध किया गया है git log
: यदि आप अपने रेपो को अपस्ट्रीम रेपो में धकेलते हैं , तो आप वही देखेंगे git log
, लेकिन जरूरी नहीं कि वही हो git reflog
।
यहाँ प्रो Git पुस्तक से स्पष्टीकरण हैreflog
:
जब आप काम कर रहे होते हैं, तो बैकग्राउंड में जिन चीजों में से एक होता है, उनमें से एक रिफ्लॉग - आपके एचएएडी और शाखा संदर्भों का एक लॉग पिछले कुछ महीनों से होता है।
आप का उपयोग करके अपने reflog देख सकते हैं
git reflog
:$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
हर बार जब भी आपकी शाखा टिप किसी भी कारण से अपडेट की जाती है, तो Git आपके लिए इस अस्थायी इतिहास की जानकारी संग्रहीत करता है। और आप इस डेटा के साथ पुराने कमिट भी निर्दिष्ट कर सकते हैं।
reflog
आदेश भी reflog वह भी पुराने हैं से प्रविष्टियों को हटा या प्रविष्टियों समाप्त करने के लिए इस्तेमाल किया जा सकता। इसके लिए आधिकारिक लिनक्स कर्नेल गिट प्रलेखन सेreflog
:
Subcommand
expire
का उपयोग पुराने reflog प्रविष्टियों को prune करने के लिए किया जाता है।रिफ्लॉग से एकल प्रविष्टियों को हटाने के लिए, सबकॉमैंड का उपयोग
delete
करें और सटीक प्रविष्टि (जैसेgit reflog delete master@{2}
) निर्दिष्ट करें ।
git log
आपको वही जानकारी प्रदान नहीं करता है ? क्षमा करें यदि यह स्पष्ट लगता है, तो मैं जीआईटी के लिए बहुत नया हूं और अपने पहले ओएमजी से पहले कुछ मूल बातें प्राप्त करना चाहूंगा।
HEAD
सूचक), और जो इंगित करता है कि वे इंगित कर रहे हैं। क्या इसका कोई मतलब है? एक साइड नोट पर, log
आप सूचना को दर्शा सकते हैं, लेकिन आपको इसके लिए एक तर्क के रूप में एक विशेष विकल्प ध्वज को पास करना होगा --walk-reflogs
।
मैं इसके बारे में उत्सुक था और बस थोड़ा विस्तार और संक्षेप में बताना चाहता था:
git log
जिस शाखा पर आप हैं उसके लिए आपके सभी आवागमन का इतिहास दिखाता है। एक अलग शाखा की जाँच करें और आप एक अलग प्रतिबद्ध इतिहास देखेंगे। यदि आप सभी शाखाओं के लिए इतिहास देखना चाहते हैं, तो टाइप करें git log --all
।
git reflog
कपकेक ने कहा कि आपके संदर्भों का एक रिकॉर्ड दिखाता है। हर बार एक कमिटमेंट या एक चेकआउट किया जाता है। प्रत्येक चेकआउट के बाद कुछ समय का उपयोग करके git checkout
और चलाकर दो शाखाओं के बीच आगे और पीछे स्विच करने का प्रयास करें git reflog
। आप हर बार "चेकआउट" प्रविष्टि के रूप में शीर्ष प्रविष्टि को अपडेट करते हुए देखेंगे। आप इन प्रकार की प्रविष्टियों को नहीं देखते हैं git log
।
सन्दर्भ: http://www.lornajane.net/posts/2014/git-log-all-branches
मैं एक निजी रिकॉर्ड और एक सार्वजनिक रिकॉर्ड के बीच अंतर के रूप में गिट लॉग और रिफ्लॉग के बीच के अंतर के बारे में सोचना पसंद करता हूं।
गिट रिफ्लग के साथ, यह आपके द्वारा स्थानीय रूप से की गई हर चीज का ट्रैक रखता है। तुमने क्या किया? Reflog इसे ट्रैक करता है। क्या आपने हार्ड रीसेट किया? Reflog इसे ट्रैक करता है। क्या आपने कोई संशोधन किया ? Reflog इसे ट्रैक करता है। आपने जो कुछ भी स्थानीय स्तर पर किया है, उसके लिए रिफ्लॉग में एक प्रविष्टि है।
यह लॉग के लिए सही नहीं है। यदि आप एक प्रतिबद्ध संशोधन करते हैं, तो लॉग केवल नई प्रतिबद्ध दिखाता है। यदि आप रीसेट करते हैं और अपने इतिहास में कुछ कमिट्स को वापस छोड़ते हैं, तो जो लोग आपको छोड़ देते हैं, वे लॉग में दिखाई नहीं देंगे। जब आप अपने परिवर्तन को किसी अन्य डेवलपर या GitHub या इस तरह से धक्का देते हैं, तो केवल लॉग में ट्रैक की गई सामग्री दिखाई देगी। किसी अन्य डेवलपर के लिए, ऐसा लगेगा कि रीसेट कभी नहीं हुआ या संशोधन कभी नहीं हुआ।
तो हाँ, मुझे 'निजी बनाम सार्वजनिक' सादृश्य पसंद है। या शायद एक बेहतर लॉग बनाम रिफ्लॉग सादृश्य है 'पॉलिश बनाम लैपिडरी।' रिफ्लेग आपके सभी परीक्षणों और त्रुटियों को दर्शाता है। लॉग सिर्फ आपके कार्य इतिहास का एक साफ और पॉलिश संस्करण दिखाता है।
बिंदु पर जोर देने के लिए इस छवि को देखें। रिपॉजिटरी के आरंभ होने के बाद से कई संशोधन और रीसेट हुए हैं। रिफ्लोग यह सब दिखाता है। फिर भी लॉग कमांड यह दिखता है कि हालांकि रेपो के खिलाफ केवल एक ही प्रतिबद्ध है:
इसके अलावा, चूँकि आप जिन चीज़ों में संशोधन करते हैं और जो आप रीसेट करते हैं , उन पर नज़र रखता है , तो यह आपको वापस जाने और उन कमिट्स को खोजने की अनुमति देता है क्योंकि यह आपको कमिट आईडी देगा। मान लें कि आपकी रिपॉजिटरी को पुराने कमिट्स से शुद्ध नहीं किया गया है, जो आपको लॉग में दिखाई देने वाली वस्तुओं को फिर से जीवित करने की अनुमति देता है। इस तरह से कभी-कभी किसी की त्वचा को बचाने के लिए रिफ्लॉज समाप्त हो जाता है जब उन्हें कुछ वापस पाने की आवश्यकता होती है, तो उन्हें लगता है कि वे अनजाने में खो गए थे।
दरअसल, रिफ्लॉज के लिए एक उपनाम है
git log -g --abbrev-commit --pretty=oneline
तो जवाब होना चाहिए: यह एक विशिष्ट मामला है।
git log
, -g
के लिए संक्षिप्त रूप है --walk-reflogs
। तो, वह कुछ भी नहीं समझाता है।