खोज…


रेपो

git repository एक ऑन-डिस्क डेटा संरचना है जो फ़ाइलों और निर्देशिकाओं के एक सेट के लिए मेटाडेटा को संग्रहीत करती है।

यह आपके प्रोजेक्ट के .git/ फ़ोल्डर में रहता है। हर बार जब आप डेटा को इकट्ठा करने के लिए प्रतिबद्ध होते हैं, तो यह यहां संग्रहीत हो जाता है। इसके विपरीत, .git/ में हर एक .git/ होता है।

यह बुनियादी संरचना इस प्रकार है:

.git/
    objects/
    refs/

वस्तुओं

git मूल रूप से एक कुंजी-मूल्य स्टोर है। जब आप डेटा को git जोड़ते हैं, तो यह एक object बनाता है और कुंजी के रूप में object की सामग्री के SHA-1 हैश का उपयोग करता है।

इसलिए, git में किसी भी सामग्री को हैश द्वारा देखा जा सकता है:

git cat-file -p 4bb6f98

Object 4 प्रकार हैं:

  • blob
  • tree
  • commit
  • tag

हेड रेफ

HEAD एक विशेष ref । यह हमेशा वर्तमान वस्तु की ओर इशारा करता है।

आप देख सकते हैं कि यह वर्तमान में .git/HEAD फ़ाइल की जाँच करके कहाँ इंगित कर रहा है।

आम तौर पर, HEAD एक और ref :

$cat .git/HEAD
ref: refs/heads/mainline

लेकिन यह किसी object को सीधे इंगित भी कर सकता है:

$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333

यह वह है जिसे "अलग सिर" के रूप में जाना जाता है - क्योंकि HEAD किसी भी ref से जुड़ा हुआ नहीं है (बल्कि इंगित करता है), बल्कि सीधे किसी object को इंगित करता है।

refs

एक ref अनिवार्य रूप से एक सूचक है। यह एक ऐसा नाम है जो किसी object । उदाहरण के लिए,

"master" --> 1a410e...

वे सादे पाठ फ़ाइलों में `.it / refs / प्रमुखों / में संग्रहीत हैं।

$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333

इसे आमतौर पर branches कहा जाता है। हालाँकि, आप ध्यान देंगे कि git में branch जैसी कोई चीज नहीं है - केवल एक ref

अब, यह नेविगेट करने के लिए संभव है git विशुद्ध रूप से अलग करने के लिए चारों ओर कूद कर objects सीधे उनके हैश द्वारा। लेकिन यह बहुत असुविधाजनक होगा। एक ref आपको objects को संदर्भित करने के लिए एक सुविधाजनक नाम देता है। यह बहुत आसान है कि git को हैश के बजाय नाम से किसी विशिष्ट स्थान पर जाने के लिए कहें।

प्रतिबद्ध वस्तु

एक commit शायद object के लिए प्रकार सबसे परिचित git , उपयोगकर्ताओं के रूप में यह है कि वे क्या के साथ बनाने के लिए उपयोग किया जाता है है git commit आदेशों।

हालाँकि, commit सीधे तौर पर कोई बदली हुई फाइल या डेटा नहीं होता है। बल्कि, इसमें ज्यादातर मेटाडेटा और अन्य objects लिए पॉइंटर्स होते हैं, जिसमें commit की वास्तविक सामग्री होती है।

एक commit में कुछ चीजें होती हैं:

  • एक tree का हैश
  • एक माता पिता के हैश commit
  • लेखक का नाम / ईमेल, कमिट करने वाला नाम / ईमेल
  • संदेश देना

आप किसी भी तरह की सामग्री देख सकते हैं:

$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>

First commit!

पेड़

एक बहुत महत्वपूर्ण बात यह है कि tree ऑब्जेक्ट आपके प्रोजेक्ट में हर फाइल को संग्रहीत करता है, और यह पूरी फाइलों को अलग नहीं करता है। इसका मतलब यह है कि प्रत्येक commit में पूरे प्रोजेक्ट का एक स्नैपशॉट है *।

* तकनीकी रूप से, केवल परिवर्तित फ़ाइलें संग्रहीत हैं। लेकिन यह दक्षता के लिए कार्यान्वयन विवरण अधिक है। एक डिजाइन के नजरिए से, एक commit को प्रोजेक्ट की पूरी कॉपी के रूप में माना जाना चाहिए

माता-पिता

parent पंक्ति में एक अन्य commit ऑब्जेक्ट का हैश होता है, और इसे "पैरेंट पॉइंटर" के रूप में सोचा जा सकता है जो "पिछली प्रतिबद्ध" की ओर इशारा करता है। यह स्पष्ट रूप से प्रतिबद्ध ग्राफ के रूप में ज्ञात आवागमन का ग्राफ बनाता है। विशेष रूप से, यह एक निर्देशित चक्रीय ग्राफ (या DAG) है।

ट्री ऑब्जेक्ट

एक tree मूल रूप से एक पारंपरिक फाइल सिस्टम में एक फ़ोल्डर का प्रतिनिधित्व करता है: फाइलों या अन्य फ़ोल्डरों के लिए नेस्टेड कंटेनर।

एक tree में शामिल हैं:

  • 0 या अधिक blob वस्तुओं
  • 0 या अधिक tree वस्तुएं

जैसे आप किसी फ़ोल्डर की सामग्री को सूचीबद्ध करने के लिए ls या dir का उपयोग कर सकते हैं, वैसे ही आप किसी tree ऑब्जेक्ट की सामग्री को सूचीबद्ध कर सकते हैं।

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

आप पहले कमेटी में tree के हैश को ढूंढकर एक commit में फाइलों को देख सकते commit , और फिर उस tree देख सकते हैं:

$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ... 
 
$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

बूँद वस्तु

एक blob में मनमानी बाइनरी फ़ाइल सामग्री होती है। आमतौर पर, यह स्रोत कोड या ब्लॉग लेख जैसे कच्चे पाठ होंगे। लेकिन यह आसानी से एक PNG फ़ाइल या किसी और चीज़ के बाइट्स हो सकते हैं।

यदि आपके पास एक blob का हैश है, तो आप इसकी सामग्री देख सकते हैं।

$ git cat-file -p d429810
package com.example.project

class Foo {
 ...
}
...

उदाहरण के लिए, आप ऊपर के रूप में एक tree ब्राउज़ कर सकते हैं, और फिर उसमें से किसी एक blobs को देख सकते हैं।

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
100644 blob cae391ff   Readme.txt

$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...

नए कमिट बनाना

git commit कमांड कुछ चीजें करता है:

  1. अपनी परियोजना निर्देशिका का प्रतिनिधित्व करने के लिए blobs और trees बनाएँ - .git/objects में संग्रहीत
  2. आपके लेखक की जानकारी के साथ एक नई commit वस्तु बनाता है, संदेश देता है, और चरण 1 से मूल tree - .git/objects में भी संग्रहीत किया जाता है
  3. अद्यतन .git/HEAD में HEAD रेफरी को नए बनाए गए commit के हैश में अपडेट करता है

अपनी परियोजना का एक नया स्नैपशॉट में यह परिणाम में जोड़ा जा रहा git कि पहले वाली स्थिति से जुड़ा है।

चल रहा है

जब आप एक कमिट (हैश या रेफ द्वारा निर्दिष्ट) पर git checkout चलाते हैं, तो आप git को अपनी कार्यशील निर्देशिका को वैसा ही बनाने के लिए कह रहे होते हैं, जैसे स्नैपशॉट लेने पर यह कैसा होता है।

  1. मैच के लिए काम कर निर्देशिका में फ़ाइलों को अद्यतन tree के अंदर commit
  2. निर्दिष्ट हैश या रेफ को इंगित करने के लिए HEAD को अपडेट करें

चारों ओर घूमता रहता है

चल रहे git reset --hard निर्दिष्ट हैश / रेफ को दर्शाता है।

MyBranch को MyBranch पर ले b8dc53 :

$ git checkout MyBranch      # moves HEAD to MyBranch
$ git reset --hard b8dc53    # makes MyBranch point to b8dc53     

नए Ref बनाना

रनिंग git checkout -b <refname> एक नया रेफरी बनाएगा जो वर्तमान commit को इंगित commit

$ cat .git/head
1f324a

$ git checkout -b TestBranch

$ cat .git/refs/heads/TestBranch
1f324a


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow