Git में वर्तमान प्रतिबद्ध के लिए हैश कैसे प्राप्त करें?


1930

मैं (अभी के लिए) GFS परिवर्तन को TFS में संग्रहीत कार्यक्षेत्रों से जोड़ने की क्षमता रखना चाहूंगा।

मैंने पहले से ही एक टूल (Git से हुक का उपयोग करते हुए) लिखा था, जिसमें मैं Git changeet के संदेश में काम करने वाले की पहचान कर सकता हूं।

हालाँकि, मैं Git कमिट (हैश) के पहचानकर्ता को एक कस्टम TFS कार्यक्षेत्र में स्टोर करना चाहूंगा। इस तरह मैं टीएफएस में एक कार्यपत्रक की जांच कर सकता हूं और देख सकता हूं कि गिट परिवर्तन क्या कार्यक्षेत्र से जुड़े हैं।

मैं Git से वर्तमान प्रतिबद्ध से हैश को आसानी से कैसे प्राप्त कर सकता हूं?

जवाबों:


2807

SHA-1 में मनमाने ढंग से विस्तारित वस्तु संदर्भ को चालू करने के लिए, उदाहरण के लिए गिट-रेव-पार्स का उपयोग करें

git rev-parse HEAD

या

git rev-parse --verify HEAD

सिडेनोट: यदि आप संदर्भों ( शाखाओं और टैग ) को SHA-1 मेंबदलना चाहते हैं, तो हैgit show-refऔरgit for-each-ref


81
--verifyतात्पर्य यह है कि:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
लिनस उन्नेबेक

647
git rev-parse --short HEADहैश के लघु संस्करण को लौटाता है, बस अगर कोई सोच रहा था।
ठाणे ब्रिमहल

54
ठाणे ने जो कहा, उसे जोड़ते हुए, आप एक विशिष्ट लंबाई जोड़ सकते हैं --short, जैसे कि --short=12, हैश से एक विशिष्ट संख्या प्राप्त करने के लिए।
टायसन फाल्प

31
@TysonPhalp: अंकों की न्यूनतम संख्या के --short=Nबारे में है ; अगर अंक छोटा हो जाए तो git बड़ी संख्या में अंकों का उपयोग करता है। उदाहरण के लिए प्रयास करें या । git rev-parse --short=2 HEADgit log --oneline --abbrev=2
जकुब नारबस्की

36
ठाणे, टायसन, और जैकब ने कहा कि आप पूरे हैश को प्रिंट कर सकते हैं, लेकिन कमिट को पहचानने के लिए आवश्यक हेक्सिट्स को उजागर करेंgit rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Zaz

423

यदि आप केवल छोटा हैश चाहते हैं:

git log --pretty=format:'%h' -n 1

इसके अलावा,% H का उपयोग लंबी हैश पाने का एक और तरीका है।


106
या, यह प्रतीत होता है, ऊपर दिए गए रेव-पार्स कमांड में जोड़ने से काम करने लगता है।
आउटफोकल्चर

15
मुझे लगता git logहै कि चीनी मिट्टी के बरतन है और git rev-parseनलसाजी है।
अमेडी वैन गैससे

इस पद्धति का एक लाभ यह है कि यह हैश के छोटे संस्करण को हैश की टक्करों के लिए समायोजित सही लंबाई के साथ लौटाएगा जो कि बड़े रेपो के लिए होता है। कम से कम गिट के हाल के संस्करणों में।
इलिया सिदोरेंको

4
यह इसे करने का एक बुरा / गलत तरीका है क्योंकि यह तरीका आपको गलत हैश देगा यदि आपके पास एक अलग सिर है। उदाहरण के लिए, यदि वर्तमान प्रतिबद्धता 12ab34 है ... और पिछली प्रतिबद्धता 33aa44 थी ... तो अगर मैं 'git चेकआउट 33aa44' करता हूं और फिर मैं आपकी आज्ञा चलाता हूं तो भी मुझे 12ab34 वापस मिल जाएगा ... मेरे सिर के बावजूद वास्तव में इंगित 33aa44 करने के लिए ...
theQuestionMan

3
@theQuestionMan मैं आपके द्वारा वर्णित व्यवहार का अनुभव नहीं करता हूं; git checkout 33aa44; git log -n 1मुझे देता है 33aa44। आप किस संस्करण का उपयोग कर रहे हैं?
आउटफुलकल्चर

150

एक और एक, git लॉग का उपयोग कर:

git log -1 --format="%H"

यह @outofculture के समान है, हालांकि थोड़ा छोटा है।


और परिणाम एकल-उद्धृत नहीं है।
क्रुकसेक

5
यह सही उत्तर है, क्योंकि यह तब भी काम करता है, जब आप इसके बजाय एक विशिष्ट प्रतिबद्धता की जांच करते हैं HEAD
परसा

1
@Parsa: जब HEADएक नामित शाखा के रूप में इस प्रतिबद्ध के लिए एक विशिष्ट प्रतिबद्ध अंक की जाँच करने के लिए अलग सिर के रूप में जानते हैं ।
क्रिस्टोफ़सेन

124

पूर्ण SHA प्राप्त करने के लिए:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

छोटा संस्करण प्राप्त करने के लिए:

$ git rev-parse --short HEAD
cbf1b9a

यदि दो git commitहैश की जरूरत है, जैसे कि branchआप में से एक वर्तमान में साथ काम कर रहा है और ए master branch, आप उपयोग कर सकते हैं git rev-parse FETCH_HEADयदि आपको उस हैश की आवश्यकता है master commitजो आप mergeअपने वर्तमान में चाहते हैं branch। अगर आपके पास जैसे branchतोंmaster और feature/new-featureकिसी दिए गए रेपो के लिए।, जबकि पर feature/new-featureआप इस्तेमाल कर सकते हैं git fetch origin master && git merge FETCH_HEADऔर उसके बाद git rev-parse --short FETCH_HEADअगर आप की जरूरत commitसे हैश masterतुम सिर्फ mergeमें d किसी भी स्क्रिप्ट के लिए आप हो सकता है।
EVAL

72

पूर्णता के लिए, चूंकि किसी ने अभी तक इसका सुझाव नहीं दिया है। .git/refs/heads/masterएक फाइल है जिसमें केवल एक लाइन है: नवीनतम कमिट का हैशmaster । इसलिए आप इसे वहां से पढ़ सकते हैं।

या, कमांड के रूप में:

cat .git/refs/heads/master

अपडेट करें:

ध्यान दें कि git अब / refs / head / folder में एक फ़ाइल के बजाय पैक-रेफ फ़ाइल में कुछ हेड रिफ स्टोर करने का समर्थन करता है। https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html


10
यह मानता है कि वर्तमान शाखा है master, जो जरूरी नहीं कि सच हो।
गवरी

12
वास्तव में। इसलिए मैंने स्पष्ट रूप से यह कहा है master
डेस्टन

20
.git/HEADआम तौर पर एक रेफरी को इंगित करता है, यदि आपके पास वहां SHA1 है, तो आप अलग किए गए हेड मोड में हैं।
Eckes

8
यह अन्य दृष्टिकोणों की तुलना में बहुत मजबूत नहीं है, विशेष रूप से क्योंकि यह मानता है कि एक .gitउपनिर्देशिका है, जो जरूरी नहीं है। मैन पेज --separate-git-dirमें झंडा देखें git init
जुब

16
+1 क्योंकि कभी-कभी आप जीआईटी निष्पादन योग्य स्थापित नहीं करना चाहते हैं (जैसे कि आपके डॉकरीफाइल में)
wim

50

कमेट हैश

git show -s --format=%H

संक्षिप्त प्रतिबद्ध हैश

git show -s --format=%h

अधिक जानकारी के लिए यहां क्लिक करेंgit show उदाहरणों के ।


50

हमेशा की git describeतरह है। डिफ़ॉल्ट रूप से यह आपको देता है -

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75

18
Git वर्णन करता है कि पहला TAG एक कमिट से वापस आता है। यह मुझे SHA प्राप्त करने में कैसे मदद करता है?
सारदुकर

42
मुझे पसंद git describe --long --dirty --abbrev=10 --tagsहै कि यह मुझे ऐसा कुछ देगा, 7.2.0.Final-447-g65bf4ef2d4जो 7.2.0 के बाद 447 कमिट करता है। वर्तमान टैग में ग्लोबल SHA-1 के पहले 10 डाइजेस्ट "65bf4ef2d4" हैं। यह वर्जन स्ट्रिंग्स के लिए बहुत अच्छा है। - लंबे समय तक यह हमेशा गिनती (-0-) और हैश को जोड़ देगा, भले ही टैग वास्तव में मैच के लिए हो।
1

14
यदि कोई टैग मौजूद नहीं है, तो git describe --always"विशेष रूप से संक्षिप्त वस्तु के रूप में पतन के रूप में दिखाई देगा"
रॉनी एंडरसन

मैं उपयोग करता हूं git describe --tags --first-parent --abbrev=11 --long --dirty --always--alwaysविकल्प यह एक परिणाम (हैश) प्रदान करता है, भले ही कोई टैग नहीं है का मतलब है। इसका --first-parentमतलब यह है कि यह विलय के द्वारा भ्रमित नहीं होता है और केवल वर्तमान शाखा पर आइटम का अनुसरण करता है। यह भी ध्यान रखें कि --dirtyजोड़ देंगे, -dirtyअगर वर्तमान शाखा अप्रतिबद्ध परिवर्तन है परिणाम के लिए।
ingyhere

30

उपयोग git rev-list --max-count=1 HEAD


3
git-rev-list प्रतिबद्ध वस्तुओं की सूची बनाने के बारे में है; यह वस्तु नाम (जैसे HEAD) का SHA-1 में अनुवाद करने के लिए git-Rev-parse है
Jakub Nar 4bski

21

यदि आपको किसी स्क्रिप्ट के दौरान चर को हैश में स्टोर करने की आवश्यकता है, तो आप उपयोग कर सकते हैं

last_commit=$(git rev-parse HEAD)

या, यदि आप केवल पहले 10 अक्षर चाहते हैं (जैसे github.com करता है)

last_commit=$(git rev-parse HEAD | cut -c1-10) 

26
इसके भी --shortया --short=numberपैरामीटर हैं git rev-parse; कोई और एक पाइप उपयोग करने की आवश्यकता cut
जूलियन डी।

15

यदि आप इसे करने के लिए सुपर-हैकी तरीका चाहते हैं:

cat .git/`cat .git/HEAD | cut -d \  -f 2`

असल में, git फॉर्म में HEAD की .AD / HEAD की जगह स्टोर करता है ref: {path from .git} । यह कमांड पढ़ता है कि "रेफ:" से स्लाइस करता है, और जो भी फाइल को इंगित करता है उसे पढ़ता है।

यह, निश्चित रूप से, अलग-अलग मोड में विफल हो जाएगा, क्योंकि HEAD "रेफ: ..." नहीं होगा, लेकिन हैश ही - लेकिन आप जानते हैं, मुझे नहीं लगता कि आप अपने बैश में बहुत स्मार्ट होने की उम्मीद करते हैं। -liners। यदि आपको नहीं लगता कि अर्धविराम धोखा दे रहे हैं, हालांकि ...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH

1
git को स्थापित करने की आवश्यकता नहीं है, मुझे यह पसंद है। (मेरी डॉक बिल्ड इमेज में जिट नहीं है)
हेलिन वांग

इसलिए भी उपयोगी है क्योंकि आप इसे
samaspin

मैंने इसे अपनी स्थानीय मशीन की स्क्रिप्ट के लिए औपचारिक रूप दिया। फिर, मैंने सोचा, अरे: मैंने जो क्रियान्वयन किया है वह काफी सरल है कि यह दिखाता है कि एक असंबंधित समस्या को कैसे हल किया जाए (बाहरी कार्यक्रमों के बिना कच्ची पोसिक्स शेल स्क्रिप्ट में पार्सिंग तर्क), लेकिन जटिल पर्याप्त रूप से थोड़ा बदलाव प्रदान करने और सबसे अधिक शोषण करने के लिए की सुविधाएँ sh। आधे घंटे की दस्तावेजीकरण की टिप्पणियाँ बाद में, और यहाँ इसका सार है: gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07
Ford

इसे देखते हुए, मैंने गिट और एसवीएन का पता लगाने के लिए एक अधिक व्यापक संस्करण बनाया, और गिट हैश / svn संशोधन को पकड़ा। इस बार एक साफ तार नहीं, लेकिन आसानी से कमांड-लाइन पार्स, और एक संस्करण टैग के रूप में प्रयोग करने योग्य: gist.github.com/Fordi/8f1828efd820181f24302b292670b14e
Ford

14

सबसे रसीला तरीका मुझे पता है:

git show --pretty=%h 

यदि आप किसी विशिष्ट संख्या के हैश को जोड़ सकते हैं:

--abbrev=n

14
जबकि यह तकनीकी रूप से काम करता है, git showजिसे एक चीनी मिट्टी के बरतन कमांड (यानी उपयोगकर्ता-सामना करना) के रूप में जाना जाता है, और इसलिए इसे लिपियों में उपयोग नहीं किया जाना चाहिए क्योंकि इसका आउटपुट परिवर्तन के अधीन है। इसके git rev-parse --short HEADबजाय ऊपर दिए गए ( ) उत्तर का उपयोग किया जाना चाहिए।
jm3

4
@ jm3 जो पीछे की तरफ है। "पोर्सिलेन" कमांड में स्थिर आउटपुट हैं जो स्क्रिप्ट के लिए अभिप्रेत हैं। खोजें git help showके लिए porcelain
जॉन टायर्री

2
@ जॉनीटाइरी यह एक भ्रमित करने वाला विषय है, लेकिन jm3 सही था: चीनी मिट्टी के बरतन आदेशों का अर्थ है, बल्कि मानव-पठनीय होने के लिए नहीं। मामले में आपको एक स्क्रिप्ट में एक चीनी मिट्टी के बरतन कमांड का उपयोग करने की आवश्यकता होती है और आप एक स्थिर प्रारूप रखना चाहते हैं, कभी-कभी (उदाहरण के लिए, गिट स्थिति, धक्का और दोष के साथ) एक विकल्प है जो बस ऐसा करता है। दुर्भाग्य से, उस विकल्प को कहा जाता है --porcelain, यही कारण है कि यह भ्रमित है। आप इस महान जवाब
फैबियो कहते हैं

1
प्रिय भगवान जिन्होंने उस विकल्प को नाम देने का फैसला किया - चीनी मिट्टी के बरतन मैं उन्हें ढूंढना चाहता हूं और ... ओह इंतजार मुझे उन्हें खोजने के लिए गिट का उपयोग करने की आवश्यकता होगी
ब्रिटन केरीन

14

शायद आप एक उपनाम चाहते हैं ताकि आप सभी निफ्टी विवरणों को याद न रखें। नीचे दिए गए चरणों में से एक करने के बाद, आप बस टाइप कर पाएंगे:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

पर बाद स्वीकार किए जाते हैं जवाब , यहाँ यह स्थापित करने के लिए दो तरीके हैं:

1) वैश्विक विन्यास (मेरे मूल उत्तर) का संपादन करके स्पष्ट तरीका सिखाएं:

 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2) या अगर आपको शॉर्टकट सिखाने के लिए एक शॉर्टकट पसंद है, जैसा कि हाल ही में एड्रियन ने टिप्पणी की है:

$ git config --global alias.lastcommit "rev-parse HEAD"

यहां से, git lastcommitअंतिम प्रतिबद्ध के हैश को दिखाने के लिए उपयोग करें।


3
एड्रिएन डे सेंटेनक नोट करते हैं कि मैन्युअल रूप से गिट कॉन्फिग फाइल को एडिट करने के बजाय, आप बस कर सकते हैं:git config --global alias.lastcommit "rev-parse HEAD"
cgmb

12

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

यहाँ एक लाइनर है कि करता है:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
परिणाम:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

स्पष्टीकरण: वर्तमान टिप्पणी का वर्णन करता है (एनोटेट टैग का उपयोग करके), लेकिन केवल "नॉट ए टीएजी" वाले टैग के साथ। चूँकि टैग में स्थान नहीं हो सकता है, यह कभी भी टैग से मेल नहीं खाता है और जब से हम परिणाम दिखाना चाहते हैं --always, कमांड --abbrev=0कमिट के पूर्ण ( ) sha1 को प्रदर्शित करते हुए वापस गिर जाता है और यह कार्यशील निर्देशिका होने पर तारांकन को जोड़ देता है--dirty

यदि आप तारांकन चिह्न नहीं जोड़ना चाहते हैं, तो यह पिछले उत्तरों में अन्य सभी कमांडों की तरह काम करता है:
git describe --always --abbrev=0 --match "NOT A TAG"
परिणाम:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe


धन्यवाद, बस इस पर ठोकर खा रहा है और यह मुझे उस के लिए एक या अन्य प्रतिध्वनि
बख्शता

1
यह मेरे बिना काम करता है --match "NOT A TAG"। 2.18.0 के साथ-साथ 2.7.4 में परीक्षण किया गया। क्या कोई ऐसी स्थिति है जहाँ इस तर्क की आवश्यकता है?
थॉमस

यदि वर्तमान इतिहास में कहीं भी आपके पास एक एनोटेट टैग है, तो यह काम नहीं करेगा। नकली टैग यह सुनिश्चित करता है कि वर्णन कमांड प्रतिबद्ध का वर्णन करने के लिए एक टैग का उपयोग नहीं करता है,
Rado

8
git show-ref --head --hash head

यदि आप गति के लिए जा रहे हैं, तो Deestan द्वारा उल्लिखित दृष्टिकोण

cat .git/refs/heads/<branch-name>

अब तक सूचीबद्ध किसी भी अन्य विधि की तुलना में काफी तेज है।


show-ref यह स्क्रिप्टिंग कमांड के लिए मुझे सबसे अच्छा विकल्प लगता है, क्योंकि यह प्लंबिंग कमांड है और इस प्रकार भविष्य की रिलीज़ में स्थिर रहने के लिए गारंटी (या कम से कम बहुत संभावना): अन्य उत्तर का उपयोग करें rev-parse , show, describe, या logहै, जो सभी चीनी मिट्टी के बरतन आदेशों हैं। और ऐसे मामलों में जहां गति सार की नहीं है, show-refमैनपेज से नोट लागू होता है: 'इस उपयोगिता का उपयोग सीधे .गित निर्देशिका के तहत फाइलों तक पहुंचने के पक्ष में प्रोत्साहित किया जाता है।'
पोंट

6

यहाँ बैश शेल में वन-लाइनर है जो गिट फाइल से डायरेक्ट रीड का उपयोग करता है:

(head=($(<.git/HEAD)); cat .git/${head[1]})

आपको अपने git रूट फोल्डर में कमांड के ऊपर चलना होगा।

यह विधि तब उपयोगी हो सकती है जब आप रिपॉजिटरी फाइल्स, लेकिन git कमांड इंस्टॉल नहीं हुई है।

यदि काम नहीं करेगा, तो .git/refs/headsफ़ोल्डर में देखें कि आपके पास किस तरह के सिर हैं।


5

फ़ाइल में अपने होम-डायर में ".gitconfig" निम्नलिखित जोड़ें

[alias]
sha = rev-parse HEAD

तब आपके पास याद रखने के लिए एक आसान आदेश होगा:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

3

गिट बैश पर, बस $ git लॉग -1 चलाएं

आप देखेंगे, आपके आदेश के बाद ये लाइनें।

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)

d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

0

यहां एक और प्रत्यक्ष-पहुंच कार्यान्वयन है:

head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(cat ".git/${head#ref: }")"
done

यह HTTP पर भी काम करता है जो स्थानीय पैकेज अभिलेखागार के लिए उपयोगी है (मुझे पता है: सार्वजनिक वेब साइटों के लिए यह .IT निर्देशिका को सुलभ बनाने के लिए अनुशंसित नहीं है):

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done


0
cat .git/HEAD

उदाहरण आउटपुट:

ref: refs/heads/master

इसे पार्स करें:

cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"

यदि आपके पास खिड़कियां हैं तो आप wsl.exe का उपयोग करने पर विचार कर सकते हैं:

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"

आउटपुट:

refs/heads/master

इस मान का उपयोग बाद में चेकआउट करने के लिए किया जा सकता है लेकिन यह इसके SHA की ओर इशारा करता है। अपने नाम से वास्तविक वर्तमान शाखा को इंगित करने के लिए इसे करें:

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"

आउटपुट:

master

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