Git में कमिट-ईश और ट्री-ईश क्या हैं?


117

प्रश्न

Git में कमिट-ईश और ट्री-ईश के विशिष्ट उदाहरण क्या हैं?

स्टैक ओवरफ्लो प्रश्न "गिट में ट्री-ईश का क्या अर्थ है?" ट्री-ईश के साथ विशेष रूप से संबंधित है, लेकिन मैं दोनों के बारे में अधिक समझना चाहता हूं ।

पृष्ठभूमि

प्रलेखन में Usages

गिट प्रलेखन "कमिट-ईश" और "ट्री-ईश" के लिए कई संदर्भ बनाता है। उदाहरण के लिए, यदि आप Git स्रोत कोड की जांच कर रहे हैं :

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

तथा

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

परिभाषाएं

Git प्रलेखन परिभाषित करता है कि "प्रतिबद्ध-ईश" और "ट्री-ईश" क्या हैं :

<tree>

एक ट्री ऑब्जेक्ट नाम इंगित करता है।

<commit>

एक प्रतिबद्ध वस्तु नाम इंगित करता है।

<tree-ish>

एक पेड़, प्रतिबद्ध या ऑब्जेक्ट नाम टैग करता है। एक कमांड जो एक <tree-ish> तर्क लेता है, अंततः एक <tree>ऑब्जेक्ट पर काम करना चाहता है, लेकिन स्वचालित रूप से डीरेफेरेंस <commit>और <tag>ऑब्जेक्ट्स जो एक बिंदु पर होते हैं <tree>

<commit-ish>

एक प्रतिबद्ध या टैग ऑब्जेक्ट नाम इंगित करता है। एक कमांड जो एक <commit-ish> तर्क लेता है, अंततः एक <commit>ऑब्जेक्ट पर काम करना चाहता है, लेकिन स्वचालित रूप से <tag>ऑब्जेक्ट्स को संदर्भित करता है जो ए पर इंगित करता है <commit>

प्रलेखन स्पष्ट पर्याप्त नहीं है

यद्यपि उपरोक्त दस्तावेज "प्रतिबद्ध-ईश" और "ट्री-ईश" को परिभाषित करते हैं, फिर भी मुझे यह बहुत अस्पष्ट और अस्पष्ट लगता है।

"कमिट-ईश" और "ट्री-ईश" के विशिष्ट उदाहरण क्या हैं, और वे एक दूसरे से कैसे भिन्न हैं?

जवाबों:


156

लघु उत्तर (टीएल; डीआर)

यहां कमिट-ईश और ट्री-आइश आइडेंटिअर्स की पूरी सूची ( Git संशोधन दस्तावेज से ):

----------------------------------------------------------------------
|    Commit-ish/Tree-ish    |                Examples
----------------------------------------------------------------------
|  1. <sha1>                | dae86e1950b1277e545cee180551750029cfe735
|  2. <describeOutput>      | v1.7.4.2-679-g3bee7fb
|  3. <refname>             | master, heads/master, refs/heads/master
|  4. <refname>@{<date>}    | master@{yesterday}, HEAD@{5 minutes ago}
|  5. <refname>@{<n>}       | master@{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | master@{upstream}, @{u}
|  9. <rev>^                | HEAD^, v1.5.1^0
| 10. <rev>~<n>             | master~3
| 11. <rev>^{<type>}        | v0.99.8^{commit}
| 12. <rev>^{}              | v0.99.8^{}
| 13. <rev>^{/<text>}       | HEAD^{/fix nasty bug}
| 14. :/<text>              | :/fix nasty bug
----------------------------------------------------------------------
|       Tree-ish only       |                Examples
----------------------------------------------------------------------
| 15. <rev>:<path>          | HEAD:README.txt, master:sub-directory/
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

आइडेंटिफ़ायर # 1-14 सभी "कमिट-ईश" हैं, क्योंकि वे सभी कमिट करने के लिए नेतृत्व करते हैं, लेकिन क्योंकि कमिट्स भी डायरेक्टरी ट्री की ओर इशारा करते हैं, वे सभी अंततः (सब) डायरेक्टरी ट्री ऑब्जेक्ट्स की ओर जाते हैं, और इसलिए उन्हें "ट्री" के रूप में भी इस्तेमाल किया जा सकता है -ish "।

# 15 का उपयोग ट्री-ईश के रूप में भी किया जा सकता है जब यह एक (उप) निर्देशिका को संदर्भित करता है, लेकिन इसका उपयोग विशिष्ट फ़ाइलों की पहचान करने के लिए भी किया जा सकता है। जब यह फाइलों को संदर्भित करता है, तो मुझे यकीन नहीं है कि यह अभी भी "ट्री-ईश" माना जाता है, या यदि "ब्लॉब-ईश" की तरह कार्य करता है (Git फाइलों को "ब्लब्स" के रूप में संदर्भित करता है)।

दीर्घ उत्तर

Git में Commits और Directory Trees

अपने न्यूनतम स्तरों पर, Git चार मूलभूत वस्तुओं का उपयोग करके स्रोत कोड का ट्रैक रखता है:

  1. एनोटेट टैग, जो इंगित करता है।
  2. Commits, जो आपके प्रोजेक्ट के रूट डायरेक्टरी ट्री को इंगित करता है।
  3. पेड़, जो निर्देशिका और उपनिर्देशिका हैं।
  4. बूँदें, जो फाइलें हैं।

इन ऑब्जेक्ट्स में से प्रत्येक की अपनी sha1 हैश आईडी है, क्योंकि लिनस टोरवाल्ड्स ने Git को एक कंटेंट- एड्रेसेबल फाइलसिस्टम की तरह डिजाइन किया है , अर्थात फाइल को उनके कंटेंट के आधार पर पुनर्प्राप्त किया जा सकता है (sha1 ID फाइल कंटेंट से जेनरेट होता है)। प्रो गिट पुस्तक इस उदाहरण आरेख देता है :

प्रो गिट बुक से 9-3 चित्र

कमिट-ईश बनाम ट्री-ईश

कई Git कमांड कमिट और (उप) डायरेक्टरी ट्री के लिए विशेष पहचानकर्ता स्वीकार कर सकते हैं:

  • "कमिट-ईश" पहचानकर्ता हैं जो अंततः एक प्रतिबद्ध वस्तु का नेतृत्व करते हैं। उदाहरण के लिए,

    tag -> commit

  • "ट्री-ईश" पहचानकर्ता हैं जो अंततः पेड़ (यानी निर्देशिका) वस्तुओं की ओर ले जाते हैं।

    tag -> commit -> project-root-directory

क्योंकि प्रतिबद्ध वस्तुएं हमेशा एक निर्देशिका ट्री ऑब्जेक्ट (आपकी परियोजना की मूल निर्देशिका) को इंगित करती हैं, कोई भी पहचानकर्ता जो "प्रतिबद्ध-ईश" है, परिभाषा के अनुसार, "ट्री-ईश" भी है। दूसरे शब्दों में, किसी भी पहचानकर्ता जो एक प्रतिबद्ध वस्तु की ओर जाता है, का उपयोग एक (उप) निर्देशिका ट्री ऑब्जेक्ट को लीड करने के लिए भी किया जा सकता है

लेकिन चूंकि डाइरेक्ट ट्री ऑब्जेक्ट्स कभी भी Git के वर्जनिंग सिस्टम में कमिट करने की ओर इशारा नहीं करते हैं, न कि प्रत्येक पहचानकर्ता जो एक (सब) डायरेक्टरी ट्री की ओर इशारा करता है, का उपयोग कमिट को इंगित करने के लिए भी किया जा सकता है। दूसरे शब्दों में, "कमिट-ईश" पहचानकर्ताओं का सेट "ट्री-ईश" पहचानकर्ताओं के सेट का एक सख्त उपसमुच्चय है।

कि पेड़-ish पहचानकर्ता के सेट के रूप में इस्तेमाल नहीं किया जा सकता प्रतिबद्ध-ish हैं

  1. <rev>:<path>है, जो सुराग सीधे निर्देशिका के पेड़ के लिए, वस्तुओं का वायदा नहीं किया। उदाहरण के लिए, HEAD:subdirectory

  2. निर्देशिका ट्री ऑब्जेक्ट्स के Sha1 पहचानकर्ता ।


3
मत भूलना stash@{0}। मैं जानना चाहता हूं कि यह सब कहां फिट बैठता है। क्या स्टाश ( my-thing@{0}) जैसी कोई अन्य चीजें हैं ? क्या स्टैश सिर्फ एक है <refname>?
नैट

यह स्पष्ट रूप से स्पष्ट नहीं किया गया है कि वृक्ष-ईश पहचानकर्ता एक कम-ईश पहचानकर्ता की तुलना में अधिक विशिष्ट पहचानकर्ता प्रतीत होता है । शायद मैं अजीब हूँ, लेकिन यह समझ में आने वाला एकमात्र तरीका है IMO
स्टीवन लू

29

गैर-देशी अंग्रेजी [sic!] बोलने वालों के लिए ध्यान दें: "-ish" एक प्रत्यय है जिसे "विशेष" या "थोड़ा" जैसे गुणों को इंगित करने के लिए विशेषण पर लागू किया जा सकता है - देखें http://chambers.co.uk / खोज /? क्वेरी = ish और title = 21 वीं

4. "पेड़-ईश" - जैसे "पेड़" .... "कमिट-ईश" - जैसे "कमिट"

उदाहरण के लिए "मंगल एक लाल तारे की तरह दिखाई देता है" ("d" दोगुना है!); "प्लेट पर खाना गर्म नहीं था, लेकिन गर्म था"

मेरा मानना ​​है कि इससे "क्या हैं ..." बेहतर व्याख्या करने में मदद मिलती है, इसमें वह भाषा के उपयोग की व्याख्या करता है।


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

मैं आपकी बात देख रहा हूं, लेकिन मैं सिर्फ देशी अंग्रेजी बोलने वाले के रूप में मुझे जो आभास दे रहा था!
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.