'Git log' द्वारा पहला कमिटमेंट कैसे दिखाया जाए?


289

मेरे पास एक परियोजना है जिसका लंबा इतिहास है। मैं git पर पहला कमिटमेंट दिखाना चाहता हूं।

मैं यह कैसे करु?


2
मुझे केवल आखिरी दिखाने का एक तरीका मिला git log -1
एलेक्स

जवाबों:


299

संक्षिप्त जवाब

git rev-list --max-parents=0 HEAD

(से tiho की टिप्पणी । के रूप में क्रिस Johnsen नोटिस , --max-parentsके बाद इस उत्तर पोस्ट किया गया था पेश किया गया था।)

व्याख्या

तकनीकी रूप से, एक से अधिक रूट कमिट हो सकते हैं। ऐसा तब होता है जब कई पहले के स्वतंत्र इतिहास एक साथ विलीन हो जाते हैं। जब कोई परियोजना एक सबट्री मर्ज के माध्यम से एकीकृत होती है तो यह आम है ।

git.gitभंडार अपने इतिहास ग्राफ में छह जड़ करता है (के लिए एक-एक लीनुस की प्रारंभिक प्रतिबद्ध, gitk , कुछ शुरू में अलग उपकरण, Git-जीयूआई , gitweb , और Git-पी 4 )। इस मामले में, हम जानते हैं कि वह e83c516है जिसमें हम शायद रुचि रखते हैं। यह जल्द से जल्द प्रतिबद्ध और जड़ प्रतिबद्ध दोनों है।

यह सामान्य मामले में इतना सरल नहीं है।

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

आप इस तरह से इतिहास के सभी रूट कमिट पा सकते हैं:

git rev-list --max-parents=0 HEAD

रिकॉर्ड के लिए, यदि --max-parentsउपलब्ध नहीं थे , तो यह भी काम करता है:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

यदि आपके पास उपयोगी टैग हैं, तो git name-revआप इतिहास का त्वरित अवलोकन कर सकते हैं:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

बक्शीश

यह अक्सर उपयोग करें? याद रखना मुश्किल है? त्वरित पहुँच के लिए एक git उपनाम जोड़ें

git config --global alias.first "rev-list --max-parents=0 HEAD"

अब आप बस कर सकते हैं

git first

49
मुझे विश्वास git rev-list --max-parents=0 HEADहै कि वही करेंगे, और थोड़ा सरल है।
तीह

3
@tiho: हाँ, यह वही करता है, और सरल है; हालांकि यह विकल्प इस प्रश्न / उत्तर के समय में "आविष्कार" नहीं किया गया था ।
क्रिस जॉन्सन

यह मेरे लिए होता है कि पहला कमिट एक रूट कमिट की तुलना में अधिक पत्ती वाला होता है
tiwo

@tiho मुझे लगता है कि आपके जवाब का अपना जवाब होना चाहिए न कि केवल एक टिप्पणी। इस तरह यह अधिक प्रमुख हो जाएगा और आपको बहुत अधिक योग्य अंक मिलेंगे।
रसेल सिल्वा

@RussellSilva मुझे अंकों की परवाह नहीं है, लेकिन मेरा मानना ​​है कि अन्य लोगों के उत्तरों को संपादित करना संभव है, जो शायद एक नया जोड़ने से बेहतर होगा। मैं वास्तव में खुद इसे करने में सहज नहीं हूं, हालांकि इसे करने के लिए स्वतंत्र महसूस कर रहा हूं :)
tiho

415

मैने पाया कि:

git log --reverse

शुरू से दिखाता है।


19
दिलचस्प रूप git log --reverse -5से इसे --reverseकिसी कारण से अनदेखा करता है
Dan2552

6
@ Dan2552 बग की तरह दिखता है, रिपोर्ट किया जाना चाहिए?
saeedgnu

23
ऐसा लगता है कि यह पहले परिणामों को 5 प्रविष्टियों तक सीमित करता है, और फिर
गैर

3
@ @, 無極 而 生 सही है, यह प्रलेखित व्यवहार है।
गंभीरदेव

44

आप केवल अपने लॉग को उल्टा कर सकते हैं और पहले परिणाम के लिए इसे हेड कर सकते हैं।

git log --pretty=oneline --reverse | head -1

7
git log --reverseइतिहास को उलट देता है, इसलिए आपको पहले प्रतिबद्ध होने के head -1बजाय उपयोग करना होगा tail -1
रूबाई।

4
यह सबसे अच्छा होगा अगर git -nध्वज को अनदेखा नहीं किया है जब --reverseदिया जाता है।
फ्रेडरिक नॉर्ड


6

ऐसा करने का सबसे सुंदर तरीका मुझे नहीं लगता है:

git log --pretty=oneline | wc -l

यह आपको एक नंबर देता है

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1आपको प्रतिबद्ध हैश (यानी 0dd89fb) देता है, जिसे आप अन्य कमांड में फीड कर सकते हैं, जैसे कुछ करके

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD अंतिम दिन में सभी आवागमन देखने के लिए।

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