Git push.default = current और push.default = upstream में क्या अंतर है?


89

Git-config के लिए मैन पेज push.default के लिए इन विकल्पों को सूचीबद्ध करता है:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

ज्यादातर मामलों में मैं यह मानूंगा कि किसी शाखा के अपस्ट्रीम शाखा में धकेलना उसी नाम की एक शाखा पर धकेलना होगा, क्योंकि ऊपर की शाखा का सामान्य रूप से एक ही नाम होगा, और उसी नाम की शाखा से ("वर्तमान") ) आम तौर पर (या हमेशा, परिभाषा के द्वारा?) ऊपर की ओर होगा। तो क्या अंतर है?

अद्यतन : git-config के लिए मैन पेज को अपडेट किया गया है (जैसा कि कोई उम्मीद करेगा), इसलिए वहां किए गए अंतरअब बहुत स्पष्ट हो सकते हैं।


2
डेवलपर्स के लिए यह वास्तव में अलग करने के लिए कष्टप्रद है, इसलिए 'सरल' पेश किया गया है, और गिट-पुश के लिए डिफ़ॉल्ट व्यवहार होगा। वास्तव में यह git 1.7.11
xhlwill

14
हाल की गिट चेतावनी के push.default is unset; its implicit value is changing in Git 2.0बारे में अधिक और matchingबनाम simpleदेखें stackoverflow.com/questions/13148066/…
रात

iconoclaust: मुझे नहीं लगता कि मेरे संपादन ने प्रश्न की अखंडता को बदल दिया है, और पुरानी जानकारी को अभी ठीक करने की आवश्यकता है। उपयोगकर्ता लिंक पर क्लिक करने का अतिरिक्त कार्य क्यों करता है?
फ्लिम

जवाबों:


72

आपने अपने प्रश्न में अंतर का सारांश दिया है। कॉन्फ़िगर अपस्ट्रीम शाखा upstreamको धक्का देता है , जबकि यह मानता है कि अपस्ट्रीम शाखा का वर्तमान के समान नाम हैcurrent स्थानीय शाखा , और उस विशिष्ट नाम को धक्का देता है। वास्तव में, स्थानीय शाखा के अपस्ट्रीम ट्रैकिंग शाखा के स्थानीय शाखा के समान नाम होने का कोई कारण नहीं है।

उदाहरण के लिए, यदि आप एक से अधिक रिपॉजिटरी में काम करते हैं या कई साझा डेवलपर रीमोट में काम करते हैं, तो आप अक्सर एक ही शाखा के अलग-अलग कांटे, जैसे कि allen-masterया susan-master, दोनों masterक्रमशः एलन और सुसान के रेपो में शाखा को ट्रैक करते हैं। इस मामले में, currentगलत सेटिंग होगी, क्योंकि उन शाखाओं के नाम उनके रिमोट पर मौजूद नहीं हैं। upstreamहालाँकि, यह ठीक काम करेगा।

एक अधिक व्यावहारिक उदाहरण एक developmentऔर productionभंडार दोनों पर नज़र रख सकता है। आपका वर्कफ़्लो प्रत्येक के लिए एक अलग मेनलाइन शाखा का उपयोग कर सकता है, लेकिन यह भ्रमित हो सकता है। मान लीजिए कि आप एक कोड इंटीग्रेटर थे और दोनों रिपॉजिटरी की masterशाखाओं को अलग-अलग ट्रैक करना चाहते थे ।

git checkout -b production --track production/master
git checkout -b development --track development/master

अब आपके पास दो शाखाएँ हैं जो उनके संबंधित भंडार को ट्रैक करती हैं, जिनमें से किसी का भी masterनामकरण सम्मेलन का उपयोग नहीं करते हैं । शाखा नामों के बारे में थोड़ा भ्रम है: वे स्पष्ट रूप से वर्णन करते हैं कि वे क्या ट्रैक करते हैं। फिर भी, push.default = currentकोई मतलब नहीं होगा, क्योंकि न तो दूरदराज के एक होता है developmentया productionशाखा।


6
जब upstreamआप पसंद करते हैं, तो आप दो उदाहरण दे रहे हैं current। मुझे लगता है कि यह बहुत स्पष्ट है, इसलिए आपको विपरीत मामले के लिए एक उदाहरण देना चाहिए।
आंद्रेकेआर

1
@AndreKR AFAIK currentइस मामले में बेहतर है कि आप एक नए-ईश डेवलपर हैं क्योंकि आपको git configविशेष रूप से ज़रूरत नहीं है अगर आपने कहीं से क्लोन किया है। यदि आपके पास पहले से मौजूद नहीं है, तो आपके लिएcurrent दूरस्थ रेपो पर पुश-इन-होम पुश शाखाओं को बनाता है या बनाता है , जबकि एक समान नाम वाली शाखा पहले से मौजूद नहीं होने पर इसे एकमुश्त करने से इंकार कर देगी। इस मामले में एक ही व्यवहार है जब तक कि एक अपस्ट्रीम शाखा को स्पष्ट रूप से निर्धारित नहीं किया गया है या यवारा के उत्तर में उल्लिखित है । simpleupstream
शायद ही कभी 'कहाँ मोनिका' जरूरतमंद

6

current रिमोट रेपो पर एक ही नाम के साथ वर्तमान शाखा को एक शाखा में धकेल देगा।

upstream वर्तमान शाखा को अपस्ट्रीम शाखा में धकेल देगा।

अपस्ट्रीम शाखा एक शाखा है जिसे स्पष्ट रूप से या आपके वर्तमान शाखा से अपस्ट्रीम के रूप में स्पष्ट रूप से परिभाषित किया गया है। इसका मतलब है कि डिफ़ॉल्ट रूप से पुश और पुल इस शाखा के साथ सिंक हो जाएगा। अपस्ट्रीम ब्रांच वर्तमान रेपो के समान ही रेपो में हो सकती है। आप अपनी स्थानीय सुविधा (विषय) शाखा से अपस्ट्रीम के रूप में अपनी स्थानीय मास्टर शाखा को सेट करने और उनके बीच धक्का देने और खींचने जैसी रोचक चीजें कर सकते हैं ।

branch.autosetupmergeविन्यास अपस्ट्रीम सेटअप विन्यास मूल्य के माध्यम से किया जाता है । आप git configमदद पृष्ठ में प्रलेखन पा सकते हैं । कमांड के -uविकल्प के साथ स्पष्ट अपस्ट्रीम सेटअप किया जाता है git branch। विवरण के लिए सहायता पृष्ठ देखें।


मुझे नहीं लगता branch.autoSetupMerge कि जैसा सोचता है वैसा ही होता है -u/ --set-upstream। कम से कम, मुझे प्रलेखन में ऐसा कुछ भी नहीं दिखाई दे रहा है कि यह स्पष्ट रूप से व्यवहार करता है जैसे कि इसे -uडिफ़ॉल्ट रूप से बुलाया गया था , जो कि यह मुझे लगता है कि आप कह रहे हैं। क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है?
वॉरड्रायस

@waldyrious सुनिश्चित; जब आप एक दूरस्थ ट्रैकिंग शाखा की जाँच कर रहे होते हैं, तो branch.autoSetupMergeडिफ़ॉल्ट रूप से कॉन्फ़िगरेशन एक नई स्थानीय शाखा बनाता है और दूरस्थ ट्रैकिंग शाखा के रूप में इसका अपस्ट्रीम सेट करता है। यह निहित कार्रवाई स्पष्ट रूप से या तो -t( --track) या -u ...( --set-upstream-to=...) झंडे का उपयोग करके की जा सकती है , जो कि थोड़े अलग वाक्यविन्यास के साथ एक ही काम करते हैं।
यवर

1
मैं देखता हूं कि यहां क्या हुआ - चूंकि यह सवाल है git push, मैंने (गलती से) मान लिया था कि आप इसके -uविकल्प के git pushबजाय विकल्प के बारे में बोल रहे -uहैं git branch। भ्रम के लिए खेद है :)
वाल्डिएरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.