गिट ब्रांचिंग: मास्टर बनाम मूल / मास्टर बनाम रिमोट / मूल / मास्टर


201

मुझे लगता है कि मैं git की मूल अवधारणाओं को समझने के लिए सही रास्ते पर हूँ।

मैं पहले ही सेट अप कर चुका हूं और रिमोट रिपॉजिटरी को क्लोन कर चुका हूं। मैंने एक सर्वर साइड खाली रिपॉजिटरी भी बनाई, और अपने स्थानीय रिपॉजिटरी को इससे जोड़ा।

मेरी समस्या यह है कि मैं इस अंतर को नहीं समझता:

  • मूल / मास्टर बनाम remotes / मूल / मास्टर

जहां तक ​​मैंने समझा है, मास्टर एक स्थानीय शाखा है, और रिमोट / मूल / मास्टर रिमोट है।

लेकिन वास्तव में मूल / गुरु क्या है?


1
@ChristopherWallace: आपने अपने संपादन के साथ मेटा पर दो प्रश्नों को उकसाया: " क्या हमें वास्तव में [मूल] टैग की आवश्यकता है? " और " सच्चा [मास्टर] क्या है? "।
डेडुप्लिकेटर

@Deduplicator एक समस्या है?
18

@ChristopherWallace: ठीक है, कई लोगों को लगता है कि दोनों टैग (आपके द्वारा बनाया गया और आपके द्वारा जोड़ा गया एक) खराब हैं। मैं सहमति के लिए होता हूं, लेकिन शायद आपके पास चर्चा से जुड़ी कुछ चीज़ों को जोड़ा जाए, जिन पर विचार नहीं किया गया था। यदि नहीं, तो ऐसा लगता है।
Deduplicator


सवाल का पालन करें: क्यों .git/refs/origin/masterकभी बहाव होगा .git/refs/remotes/origin/master? यह अब मेरे साथ हो रहा है और मैं फेंक रही हूं।
पॉल

जवाबों:


219

एक दूरस्थ रिपॉजिटरी का एक क्लोन लें और चलाएं git branch -a(सभी शाखाओं को दिखाने के बारे में जानकारी के बारे में जानें)। यह शायद कुछ इस तरह दिखेगा:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

यहाँ, masterस्थानीय रिपॉजिटरी में एक शाखा है। रिमोट नाम की remotes/origin/masterएक शाखा है । आप इसे इस रूप में भी देख सकते हैं :masteroriginorigin/master

git diff origin/master..master

आप इसे इस रूप में भी संदर्भित कर सकते हैं remotes/origin/master:

git diff remotes/origin/master..master

ये एक ही चीज़ का जिक्र करने के सिर्फ दो अलग-अलग तरीके हैं (संयोग से, इन दोनों आदेशों का मतलब है "मुझे दूरस्थ masterशाखा और मेरी masterशाखा के बीच के परिवर्तन दिखाओ )।"

remotes/origin/HEADdefault branchनामित रिमोट के लिए है origin। यह आपको originइसके बजाय बस कहने देता है origin/master


5
अच्छा उत्तर। मुझे लगता है git branch -aकि दूरस्थ शाखा को दिखाना remotes/origin/masterआंशिक रूप से है क्योंकि अंतर्निहित रेफरी में संग्रहीत किया जाता है .git/refs/remotes/origin(यदि यह पैक नहीं किया गया है)। मेरी राय में, उत्पादन git branch -aबहुत स्पष्ट हो सकता है, शायद एक स्लैश के अलावा किसी अन्य चीज के साथ शाखा के नाम से रिमोट के नाम को अलग करके।
मैट हर्न

14
यह भी ध्यान दें कि git branch -r, जो केवल दूरस्थ शाखाओं को दिखाना है, शाखा को सिर्फ origin/masterइसलिए दिखाएगा क्योंकि remotes/उपसर्ग आवश्यक नहीं है।
मैट हर्न

3
@ मिस्टरबिस्किट: यह सच है। स्पष्ट करने की तुलना में आउटपुट अधिक भ्रामक है। बहुत बहुत धन्यवाद, मेरी उत्कंठा का एक बेहतरीन जवाब जिसने मुझे सही संकेत दिए
जॉन रम्पेल १12

अगर मैं देखता हूं तो मैं देखता git logहूं commit fa9sd8jasdf98 (HEAD -> master), इसका क्या मतलब है? इस उदाहरण में HEAD क्या है? मैंने सोचा था कि मैं वर्तमान में "मास्टर" था और करने के लिए आ रहा था origin/master। मुझे लगता है कि मुझे कुछ मिला हुआ है, क्या कोई मदद कर सकता है? संपादित करें: मुझे लगता है कि मुझे यह मिल गया है, क्या यह मान लेना सही है कि HEAD वर्तमान में मास्टर शाखा को इंगित कर रहा है, जिसका अर्थ है कि मैं वर्तमान में मास्टर करने की प्रक्रिया में हूं?
सेबस्टियन नीलसन

@ सेबैस्टियननेलस हाँ आप सही हैं, हेड -> मास्टर भाग का मतलब है कि आप वर्तमान में मास्टर शाखा पर हैं।
अगस्त को

108

मेरे जैसे डमी के लिए संक्षिप्त उत्तर (टॉर्क से चोरी):

  • मूल / मास्टर "है, जहां मास्टर पिछली बार मैंने जाँच की थी"
  • गुरु "वह है जहाँ मैं क्या कर रहा हूँ के आधार पर गुरु यहाँ पर है"

9
ओरिजिनल / मास्टर = रिमोट मशीन का बैकअप, पिछली बार अपडेट किए जाने पर आपने मास्टर की अपनी मूल प्रति / मास्टर की कॉपी की
sakurashinken

40

तकनीकी रूप से आपके Git रेपो में सभी 1 पर वास्तव में कोई "दूरस्थ" चीजें नहीं हैं, बस स्थानीय नाम हैं जो दूसरे, अलग रेपो के नामों के अनुरूप होना चाहिए । जिन लोगों के नाम हैं, origin/whateverवे शुरू में आपके द्वारा क्लोन किए गए रेपो के साथ मेल खाएंगे:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

अन्य रेपो की एक स्थानीय प्रति बनाता है। जिस तरह से यह वहां मौजूद सभी शाखाओं को नोट करता है, और उन संदर्भों को करता है, और उन नामों के तहत आपके स्थानीय रेपो में चिपका देता है refs/remotes/origin/

इससे पहले कि आप कितने समय के लिए आपके पास जाते हैं git fetchया "मेरे पास क्या है इसकी प्रतिलिपि के लिए बराबर है। कुछ। जहां। इसके", वे अपनी शाखाओं को बदल सकते हैं, नए बना सकते हैं, और कुछ को हटा सकते हैं। जब आप अपना काम करते हैं git fetch(या git pullजो वास्तव में प्लस मर्ज है), आपका रेपो अपने नए काम की प्रतियां बना देगा और refs/remotes/origin/<name>जरूरत के अनुसार सभी प्रविष्टियों को बदल देगा । यह fetchआईएनजी का वह क्षण है जो सब कुछ मेल खाता है (अच्छी तरह से, वह, और प्रारंभिक क्लोन, और pushआईएनजी के कुछ मामले भी - मूल रूप से जब भी गिट को जांच करने का मौका मिलता है - लेकिन नीचे चेतावनी देखें)।

Git में सामान्य रूप से आपके स्वयं के refs/heads/<name>रूप <name>में और दूरस्थ लोगों के रूप में origin/<name>, और यह सब काम करता है क्योंकि यह स्पष्ट है कि कौन सा है। कभी-कभी अपनी खुद की शाखा नाम बनाना संभव होता है जो इसे स्पष्ट नहीं करता है, लेकिन इसके बारे में चिंता न करें जब तक ऐसा नहीं होता है। :-) बस Git को सबसे छोटा नाम दें जो इसे स्पष्ट करता है, और यह वहां से जाएगा: origin/master"वह है जहां मास्टर पिछली बार मैंने जाँच की थी", और master"जहां मैं कर रहा हूं उसके आधार पर मास्टर यहां पर है" । आवश्यकतानुसार git fetch"जहाँ पर मास्टर हो वहाँ" पर Git को अपडेट करने के लिए चलाएँ ।


कैविएट: 1.8.4 से अधिक पुराने संस्करण के संस्करणों में, git fetchकुछ मोड हैं जो "जहां मास्टर खत्म हो गया है" अपडेट नहीं करते हैं (अधिक सटीक रूप से, मोड जो किसी भी रिमोट-ट्रैकिंग शाखाओं को अपडेट नहीं करते हैं)। चल रहा है git fetch origin, या git fetch --all, या बस git fetch, अद्यतन करता है । दौड़ना git fetch origin master नहीं है । दुर्भाग्य से, यह "अपडेट नहीं करता" मोड सामान्य द्वारा ट्रिगर किया गया है git pull। (यह मुख्य रूप से सिर्फ एक छोटी सी झुंझलाहट है और यह Git 1.8.4 और बाद में तय किया गया है।)


1 ठीक है, एक चीज है जिसे "रिमोट" कहा जाता है। लेकिन यह भी स्थानीय है! नाम originवह चीज है जिसे Git "रिमोट" कहता है। यह मूल रूप से आपके द्वारा उपयोग किए गए URL का केवल एक छोटा नाम है जब आपने क्लोन किया था। यह भी जहां है originमें origin/masterसे आता है। नाम origin/masterको रिमोट-ट्रैकिंग शाखा कहा जाता है , जिसे कभी-कभी "दूरस्थ शाखा" में छोटा कर दिया जाता है, विशेष रूप से पुराने या अधिक अनौपचारिक प्रलेखन में।


2
मेरे जैसे नौसिखिया के लिए उत्कृष्ट विवरण, धन्यवाद! स्पष्ट किया कि उसने origin/masterस्टिकर को localरेपो के ग्राफ पर क्यों नहीं रखा , और remoteएक पर नहीं (मैं पूरे दिल से जेसिका केर की "गिट हैपन्स" प्रस्तुति को नए लोगों के लिए प्रस्तुत करने की सलाह देता हूं git: vimeo.com/46010208 । मैं 30:00 - 30: 30 के बीच अपना सिर खरोंच रहा था। 19.)
बड़े बुजुर्ग

11

मैं शुरुआती लोगों के लिए @ ErichBSchulz के उत्तर को सरल बनाने की कोशिश करूंगा:

  • मूल / मास्टर दूरस्थ रिपॉजिटरी पर मास्टर शाखा की स्थिति है
  • मास्टर स्थानीय रिपॉजिटरी पर मास्टर शाखा की स्थिति है

1
अच्छी कोशिश लेकिन IMHO w / आउट last time I've checkedइसे महत्वपूर्ण बिंदु खो देता है
अलेक्सई मार्टिआनोव

6
  1. उत्पत्ति - यह रिमोट को इंगित करने के लिए एक कस्टम और सबसे आम नाम है।

$ git remote add origin https://github.com/git/git.git--- आप अपने github प्रोजेक्ट को मूल से जोड़ने के लिए इस कमांड को चलाएंगे। यहां उत्पत्ति उपयोगकर्ता-परिभाषित है। आप इसका नाम बदल सकते हैं$ git remote rename old-name new-name


  1. मास्टर - Git में डिफ़ॉल्ट शाखा का नाम मास्टर है। दूरस्थ और स्थानीय कंप्यूटर दोनों के लिए।

  1. मूल / मास्टर - यह दूरस्थ रेपो में मास्टर शाखा को संदर्भित करने के लिए केवल एक संकेतक है। याद रखें कि मैंने कहा था कि मूल बिंदु दूरस्थ हैं।

$ git fetch origin- वस्तुओं को डाउनलोड करता है और दूरस्थ रिपॉजिटरी से आपके स्थानीय कंप्यूटर [मूल / मास्टर] को डाउनलोड करता है। इसका मतलब है कि यह आपकी स्थानीय मास्टर शाखा को प्रभावित नहीं करेगा जब तक कि आप उनका उपयोग करके विलय नहीं करते $ git merge origin/master। याद रखें कि इस कमांड को चलाने से पहले आपको सही ब्रांच की जांच करनी होगी

नोट: प्राप्त सामग्री को दूरस्थ शाखा के रूप में दर्शाया गया है। फ़ेच आपको प्रोजेक्ट की अपनी प्रति में एकीकृत करने से पहले परिवर्तनों की समीक्षा करने का मौका देता है। आपके और दूरस्थ के बीच परिवर्तन दिखाने के लिए$git diff master..origin/master


5

एक स्पष्टीकरण (और एक बिंदु जो मुझे भ्रमित करता है):

"remotes / मूल / HEAD डिफ़ॉल्ट शाखा है" वास्तव में सही नहीं है।

रिमोट रिपॉजिटरी (अंतिम बार जब आपने जाँच की) में रिमोट / ब्रांच की डिफ़ॉल्ट शाखा थी। हेड एक शाखा नहीं है, यह सिर्फ एक शाखा को इंगित करता है।

HEAD को अपने कार्य क्षेत्र के रूप में सोचें। जब आप इस तरह से सोचते हैं तो 'git checkout branchname' आपके कार्य क्षेत्र की फाइलों को किसी विशेष शाखा में बदलने के संबंध में समझ में आता है। आप अपने कार्य क्षेत्र में "चेकआउट" शाखा फ़ाइलों को करते हैं। सभी व्यावहारिक उद्देश्यों के लिए HEAD वह है जो आपके कार्य क्षेत्र में आपको दिखाई देता है।


अधिक सटीक रूप से, HEAD"एक शाखा का सूचक" है (आपके स्थानीय रेपो में वास्तविक फ़ाइल में अक्सर स्ट्रिंग होता है ref: refs/heads/master, उदाहरण के लिए ... जब तक कि यह "अलग" नहीं होता है, जो पूरी तरह से एक और चीज है)। हालांकि, clone"रिमोट हेड" की व्याख्या करने के तरीके में एक बग है : ट्रांसफर प्रोटोकॉल एक अप्रत्यक्ष शाखा को बिल्कुल नहीं भेज सकता है, बस एक कच्चा एसएचए -1, इसलिए गिट में एक कीचड़ होता है जो इसे "ज्यादातर काम" बनाता है। हर बार एक समय में कोई एक अजीब मामले में ठोकर खाता है, हालांकि। मैं इच्छा Git की तरह बनाया था नहीं remotes/origin/HEADसब पर है, खासकर जब यह गलत बाहर आता है ...
torek

2

मुझे लगता है कि यह git स्लैश नोटेशन शायद आपके .gitफ़ोल्डर के अंदर देखकर सबसे अच्छा समझा जाता है ।


उदाहरण के लिए, यहाँ लिबर ऑफिस सोर्स बेस के लिए मेरा .गित का कुछ संक्षिप्त पेड़ है।

में linux sudo apt-get install tree इस देखने के लिए उपयोगी है।
में विंडोज मुझे लगता है कि treeआदेश काम हो सकता है अभी भी।

नीचे स्क्रॉल करें और नीचे के पास रेफ (उर्फ 'संदर्भ') पर एक नज़र डालें:

$ tree  
.  
├── branches  
├── config  
├── description  
├── FETCH_HEAD  
├── gitk.cache  
├── HEAD  
├── hooks  
│   ├── applypatch-msg.sample  
    ...
├── index  
├── info  
│   └── exclude  
├── logs  
│   ├── HEAD  
│   └── refs  
│       ├── heads  
│       │   ├── master  
│       │   └── remotes  
│       │       └── origin  
│       └── remotes  
│           └── origin  
│               ├── distro  
│               │   ├── cib  
│               │   │   └── libreoffice-6-0  
│               │   ├── collabora  
│               │   │   └── cp-6.0  
│               │   └── lhm  
│               │       └── libreoffice-5-2+backports  
│               ├── HEAD  
│               ├── libreoffice-6-2  
│               ├── master  
│               └── private  
│                   └── mst  
│                       └── sw_redlinehide_4a  
├── objects  
│   ├── info  
│   └── pack  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack  
│       ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx  
│       └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack  
├── ORIG_HEAD  
├── packed-refs  
└── refs  
    ├── heads  
    │   ├── master  
    │   └── remotes  
    │       └── origin  
    ├── remotes  
    │   └── origin  
    │       ├── distro  
    │       │   ├── cib  
    │       │   │   └── libreoffice-6-0  
    │       │   ├── collabora  
    │       │   │   └── cp-6.0  
    │       │   └── lhm  
    │       │       └── libreoffice-5-2+backports  
    │       ├── HEAD  
    │       ├── libreoffice-6-2  
    │       ├── master  
    │       └── private  
    │           └── mst  
    │               └── sw_redlinehide_4a  
    └── tags  
        └── libreoffice-6-2-branch-point  

32 directories, 45 files

यह इस तरह से रखी गई थी, तो कम भ्रमित हो सकता है, लेकिन यह नहीं था:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──origin1
│  └──master
└──origin2
   └──master

हमारे पास तीन मूल प्रकार के संदर्भ हैं: सिर , रिमोट और टैग

  • .it / refs / heads हमारे स्थानीय स्वामी को रखते हैं

  • .it / refs / remotes में कई रीमोट हो सकते हैं, हालांकि फिलहाल हमारे पास केवल इसका मूल है।

  • .it / refs / टैग (अन्यत्र चर्चा की गई है)।

इस प्रकार मूल , हमारा एक और केवल दूरस्थ है। यह मूल / गुरु रखता है ।


हम पाते हैं कि हमारे पास 2 HEADS (वर्तमान शाखाओं के लिए संकेत), एक स्थानीय और एक रिमोट है:

$ cat .git/HEAD                        #         local:  HEAD -> master
ref: refs/heads/master

$ cat .git/refs/remotes/origin/HEAD    # remote origin:  HEAD -> master
ref: refs/remotes/origin/master

यदि आप अपनी शाखाएं सूचीबद्ध करते हैं :

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/aoo/aw080
  remotes/origin/aoo/trunk
  remotes/origin/distro/capgemini/cg-4.1
  remotes/origin/distro/cib/libreoffice-5-0
  remotes/origin/distro/cib/libreoffice-5-1
  remotes/origin/distro/cib/libreoffice-5-2
  ...
  • सूचीबद्ध पहली शाखा ( मास्टर ) केवल एक ही है जो रिमोट नहीं है। तो इस मामले में हमारी एक स्थानीय शाखा है। यह वह जगह है जहाँ हम अपनी नई शाखाओं और बाद में आने के लिए अपना काम शुरू करेंगे।

अगला, आपके पास कई दूरस्थ ट्रैकिंग शाखाएँ हो सकती हैं, और हम यहाँ करते हैं। आप जानते हैं कि ये दूरस्थ ट्रैकिंग शाखाएँ हैं क्योंकि वे ' रीमोट्स / ' के साथ उपसर्ग करती हैं । यहाँ दिखाए गए रिमोट नाम की उत्पत्ति के लिए हैं।

  • तो दूसरी पंक्ति उत्पत्ति की वर्तमान शाखा सूचक है। रिमोट / मूल: HEAD - पॉइंट्स से -> मास्टर। इससे पता चलता है कि दूरदराज के भंडार में, वर्तमान शाखा उनकी शाखा नामित है मास्टर , (हमारे स्थानीय शाखा नामित साथ भ्रमित होने की नहीं मास्टर )।

  • शेष शाखाएँ आपके .गित / रेफ्स / ट्री में नहीं पाई जाती हैं, बल्कि आप उन्हें खोज लेंगे .git/packed-refs

जब हम लाते हैं तो हम दूरस्थ रिपॉजिटरी से हमारे रिमोट ट्रैकिंग रिपॉजिटरी में परिवर्तन डाउनलोड करते हैं।

जब हम मर्ज करते हैं तो हम इस कार्य में स्थानीय, दूरस्थ ट्रैकिंग रिपॉजिटरी को हमारी कार्यशील स्थानीय शाखा या शाखाओं में मर्ज करते हैं, इस मामले में हमारी मास्टर शाखा में।

(जब हम खींचते हैं तो हम इन दोनों चरणों को एक ऑपरेशन में करते हैं।)


यह भी दिलचस्प है कि इन स्थानीय और दूरस्थ यूयूआईडी को मास्टर के लिए वर्तमान में एक ही नोड (उर्फ 'कमिट) में इंगित करना दिलचस्प है :

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/origin/master          # remote origin master
1ca409292272632f443733450313de5a82c54a9c

तो हमारे स्थानीय मास्टर रिमोट के मूल मास्टर के रूप में उसी स्थान पर इंगित करते हैं:

[local] master = [remote] origin master

अंत में, मुझे लगता है कि इसे देखना भी उपयोगी है .git/packed-refs

$ cat packed-refs 
# pack-refs with: peeled fully-peeled 
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1
....

इसमें कोई संदेह नहीं है कि यह उत्तर से अधिक प्रश्न छोड़ता है, लेकिन मुझे लगता है कि यह आपके सवालों के जवाब देने में मदद कर सकता है कि क्या है।

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