खोज…
रेपो
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
कमांड कुछ चीजें करता है:
- अपनी परियोजना निर्देशिका का प्रतिनिधित्व करने के लिए
blobs
औरtrees
बनाएँ -.git/objects
में संग्रहीत - आपके लेखक की जानकारी के साथ एक नई
commit
वस्तु बनाता है, संदेश देता है, और चरण 1 से मूलtree
-.git/objects
में भी संग्रहीत किया जाता है - अद्यतन
.git/HEAD
मेंHEAD
रेफरी को नए बनाए गएcommit
के हैश में अपडेट करता है
अपनी परियोजना का एक नया स्नैपशॉट में यह परिणाम में जोड़ा जा रहा git
कि पहले वाली स्थिति से जुड़ा है।
चल रहा है
जब आप एक कमिट (हैश या रेफ द्वारा निर्दिष्ट) पर git checkout
चलाते हैं, तो आप git
को अपनी कार्यशील निर्देशिका को वैसा ही बनाने के लिए कह रहे होते हैं, जैसे स्नैपशॉट लेने पर यह कैसा होता है।
- मैच के लिए काम कर निर्देशिका में फ़ाइलों को अद्यतन
tree
के अंदरcommit
- निर्दिष्ट हैश या रेफ को इंगित करने के लिए
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