खोज…
रेपो
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