Git reflog और log में क्या अंतर है?


158

मैन पेज कहता है कि लॉग कमिट लॉग दिखाता है और रिफॉल्‍ड करने वाले लोग रिफॉल्‍ग की जानकारी लेते हैं। क्या वास्तव में जानकारी को रोकना है और क्या यह है कि लॉग नहीं करता है? लॉग कहीं अधिक विस्तृत लगता है।

जवाबों:


221

git logवर्तमान HEAD और उसके वंश को दर्शाता है। यही है, यह प्रतिबद्ध हेड को इंगित करता है, फिर उसके माता-पिता, उसके माता-पिता, और इसी तरह। यह रेपो की वंशावली के माध्यम से पीछे हटता है, प्रत्येक व्यक्ति के माता-पिता की पुनरावृत्ति करता है।

(व्यवहार में, कुछ कमिट में एक से अधिक माता-पिता होते हैं। अधिक प्रतिनिधि लॉग देखने के लिए, जैसे कमांड का उपयोग करें git log --oneline --graph --decorate।)

git reflogHEAD के वंश को बिल्कुल भी पार नहीं करता है। Reflog उन हिट्स की एक आदेशित सूची है, जिन्हें HEAD ने इंगित किया है: यह आपके रेपो के लिए पूर्ववत इतिहास है। रिफ्लॉग स्वयं रेपो का हिस्सा नहीं है (यह खुद को कमिट करने के लिए अलग से संग्रहीत किया जाता है) और पुश, भ्रूण या क्लोन में शामिल नहीं है; यह पूरी तरह से स्थानीय है।

इसके अलावा: रिफ्लॉग को समझने का मतलब है कि आपके प्रतिबद्ध होने के बाद आप वास्तव में अपने रेपो से डेटा नहीं खो सकते हैं। यदि आप गलती से किसी पुराने कमिट पर रीसेट कर देते हैं, या गलत तरीके से रिबेट करते हैं, या कोई अन्य ऑपरेशन जो नेत्रहीन "हटाता है" करता है, तो आप रिफ्लेग का उपयोग यह देखने के लिए कर सकते हैं कि आप पहले कहां थे और git reset --hardवापस अपनी पिछली स्थिति को बहाल करने के लिए वापस आ गए। याद रखें, refs का मतलब सिर्फ कमिट नहीं बल्कि इसके पीछे का पूरा इतिहास है।


26
सावधानी का एक शब्द: आप कभी-कभी डेटा खो सकते हैं क्योंकि रिफ्लॉग प्रविष्टियाँ अनंत काल तक बनी नहीं रहती हैं - उन्हें कुछ शर्तों पर शुद्ध किया जाता है। इस उत्तर और git-reflog और git-gc के लिए डॉक्स देखें । आम तौर पर, यदि विनाशकारी ऑपरेशन 2 सप्ताह से अधिक नहीं था, तो आप शायद सबसे सुरक्षित हैं।
mcmlxxxvi

@mcmlxxxvi मेरे पास एक ही रेपो के लिए दो स्थानीय फ़ोल्डर हैं, क्या मैं दो फ़ोल्डरों के लिए रिफ्लॉग्स मर्ज कर सकता हूं?
Tmx

@ टीएमएक्स, मैं आपके मामले को काफी नहीं समझता - एक ही रेपो के लिए दो स्थानीय फ़ोल्डर से आपका क्या मतलब है ? यदि आपके पास एक ही रेपो के दो क्लोन हैं, जो आज तक हैं, और आप उनके संपादित इतिहास को "मर्ज" करना चाहते हैं, तो .git/logs/refs/<branch>प्रविष्टियों का प्रारूप है <old_rev> <new_rev> [...] <timestamp> [...]। आप टाइमस्टैम्प द्वारा कंक्रीटिंग और सॉर्टिंग का प्रयास कर सकते हैं। हालाँकि, कुछ पंक्तियाँ new_revअगले वाले से मेल नहीं खा सकती हैं old_rev(जिस स्थिति में मुझे संदेह है कि रिफ्लॉग अमान्य होगा। फिर आप अनुक्रम को "ठीक" करने के लिए नकली प्रविष्टियां डालने का प्रयास कर सकते हैं, लेकिन यह मेरे लिए बहुत परेशानी की बात है।
mcmlxxxvi

62
  • git log रेफरी (सिर, टैग, उपाय) से सुलभ लॉग को दिखाता है
  • git reflogएक है रिकॉर्ड सब करता है कि कर रहे हैं या किसी भी समय अपने रेपो में संदर्भित कर रहे थे की।

यही कारण है कि git reflog(एक स्थानीय रिकॉर्डिंग जो डिफ़ॉल्ट रूप से 90 दिनों के बाद छंटनी होती है) का उपयोग तब किया जाता है जब आप उस शाखा द्वारा संदर्भित SHA1 को वापस पाने के लिए एक "विनाशकारी" ऑपरेशन (जैसे एक शाखा को हटाना) करते हैं।
देखें git config:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogएक्सपायर इस समय की तुलना में पुरानी प्रविष्टियों को हटाता है; 90 दिनों के लिए चूक। बीच में
" <pattern>" (उदाहरण के लिए " refs/stash") के साथ सेटिंग केवल उन रेफल्स पर लागू होती है जो मेल खाते हैं <pattern>

सुरक्षा तंत्र

git reflogअक्सर " आपके सुरक्षा जाल " के रूप में संदर्भित होता है

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

" शांत रहें और उपयोग करेंgit reflog "

शान्ति बनाये रखें

फिर से, reflog आपके SHA1 की एक स्थानीय रिकॉर्डिंग है।
जैसा कि विरोध किया गया है git log: यदि आप अपने रेपो को अपस्ट्रीम रेपो में धकेलते हैं , तो आप वही देखेंगे git log, लेकिन जरूरी नहीं कि वही हो git reflog


14

यहाँ प्रो 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आपको वही जानकारी प्रदान नहीं करता है ? क्षमा करें यदि यह स्पष्ट लगता है, तो मैं जीआईटी के लिए बहुत नया हूं और अपने पहले ओएमजी से पहले कुछ मूल बातें प्राप्त करना चाहूंगा।
Noich

2
गिट लॉग आपके कमिट्स का रिकॉर्ड है । प्रो गिट बुक राज्यों के रूप में, रिफ्लोग, आपके संदर्भों का एक रिकॉर्ड है (मूल रूप से, आपके शाखा सूचक और आपका HEADसूचक), और जो इंगित करता है कि वे इंगित कर रहे हैं। क्या इसका कोई मतलब है? एक साइड नोट पर, logआप सूचना को दर्शा सकते हैं, लेकिन आपको इसके लिए एक तर्क के रूप में एक विशेष विकल्प ध्वज को पास करना होगा --walk-reflogs

3
इसके अलावा, चूँकि आप एक Git शुरुआत करने वाले हैं, इसलिए मैं आपको Pro Git पुस्तक पढ़ने की अत्यधिक सलाह देता हूँ, यह है कि मैंने सबसे अधिक जो कुछ मैंने सीखा है उसके बारे में मैंने सीखा है। मैं अध्याय 1-3 और 6-6.5 सुझाता हूं। मैं यह भी अनुशंसा करता हूं कि आप सीखें कि कैसे अंतःक्रियात्मक और गैर-अंतःक्रियात्मक रूप से दोनों को फिर से बनाना है।

8

मैं इसके बारे में उत्सुक था और बस थोड़ा विस्तार और संक्षेप में बताना चाहता था:

  1. git logजिस शाखा पर आप हैं उसके लिए आपके सभी आवागमन का इतिहास दिखाता है। एक अलग शाखा की जाँच करें और आप एक अलग प्रतिबद्ध इतिहास देखेंगे। यदि आप सभी शाखाओं के लिए इतिहास देखना चाहते हैं, तो टाइप करें git log --all

  2. git reflogकपकेक ने कहा कि आपके संदर्भों का एक रिकॉर्ड दिखाता है। हर बार एक कमिटमेंट या एक चेकआउट किया जाता है। प्रत्येक चेकआउट के बाद कुछ समय का उपयोग करके git checkoutऔर चलाकर दो शाखाओं के बीच आगे और पीछे स्विच करने का प्रयास करें git reflog। आप हर बार "चेकआउट" प्रविष्टि के रूप में शीर्ष प्रविष्टि को अपडेट करते हुए देखेंगे। आप इन प्रकार की प्रविष्टियों को नहीं देखते हैं git log

सन्दर्भ: http://www.lornajane.net/posts/2014/git-log-all-branches


1

मैं एक निजी रिकॉर्ड और एक सार्वजनिक रिकॉर्ड के बीच अंतर के रूप में गिट लॉग और रिफ्लॉग के बीच के अंतर के बारे में सोचना पसंद करता हूं।

निजी बनाम सार्वजनिक

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

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

लॉग पॉलिश है। रिफ्लैप लैपिडरी है।

तो हाँ, मुझे 'निजी बनाम सार्वजनिक' सादृश्य पसंद है। या शायद एक बेहतर लॉग बनाम रिफ्लॉग सादृश्य है 'पॉलिश बनाम लैपिडरी।' रिफ्लेग आपके सभी परीक्षणों और त्रुटियों को दर्शाता है। लॉग सिर्फ आपके कार्य इतिहास का एक साफ और पॉलिश संस्करण दिखाता है।

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

लॉग पॉलिश है।  Reflog लैपिडरी है।

'सुरक्षा जाल' के विचार पर वापस जाएं

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


-6

दरअसल, रिफ्लॉज के लिए एक उपनाम है

 git log -g --abbrev-commit --pretty=oneline

तो जवाब होना चाहिए: यह एक विशिष्ट मामला है।


9
में git log, -gके लिए संक्षिप्त रूप है --walk-reflogs। तो, वह कुछ भी नहीं समझाता है।
एड्रियन डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.