Git - पुश.फॉल्ट "मिलान" और "सरल" में क्या अंतर है


285

मैं कुछ समय के लिए git का उपयोग कर रहा हूं, लेकिन मुझे कभी भी अपने आप में एक नया रिमोट सेट अप नहीं करना पड़ा है और मुझे ऐसा करने के लिए उत्सुकता हुई है। मैं ट्यूटोरियल पढ़ रहा हूं और मैं इस बात पर उलझन में हूं कि काम करने के लिए "गिट पुश" कैसे प्राप्त किया जाए।

यदि मैं इसका उपयोग git pushकरता हूँ तो यह मुझे एक डिफ़ॉल्ट शाखा (?) को देखने के लिए कहता है? इन दो विकल्पों के बीच अंतर क्या है जो मुझे इसकी आपूर्ति करता है?

git config --global push.default matching
git config --global push.default simple

मिलान करने से मेरे स्थानीय रेपो पर जो भी शाखाएं हैं, उन्हें धक्का देता है, और अगर वे मेरे मेल नहीं खाते हैं तो मुझे मैन्युअल रूप से यह बताना होगा कि मेरे पास जो भी नई स्थानीय शाखाएं हैं, उन्हें सही करने के लिए? क्या यह सबसे अच्छा अभ्यास है या सरल सबसे अच्छा है?



1
अब, यदि केवल pull.defaultउन सभी शाखाओं को स्थानीय रूप से अपडेट करने के लिए उपलब्ध है
नोगुरेन

जवाबों:


367

git push सभी शाखाओं या इस विन्यास पर निर्भर एक एकल धक्का कर सकते हैं:

सभी शाखाओं को पुश करें

git config --global push.default matching

यह सभी शाखाओं को दूरस्थ शाखा में धकेल देगा और उनका विलय कर देगा। यदि आप सभी शाखाओं को आगे नहीं बढ़ाना चाहते हैं, तो आप केवल वर्तमान शाखा को धक्का दे सकते हैं।

केवल वर्तमान शाखा धक्का

git config --global push.default simple

तो, यह बेहतर है, मेरी राय में, इस विकल्प का उपयोग करने और शाखा द्वारा अपनी कोड शाखा को आगे बढ़ाने के लिए। मैन्युअल रूप से और व्यक्तिगत रूप से शाखाओं को धक्का देना बेहतर है।


16
मुझे push.default current@UpAndAdam का जवाब पसंद आया । इसके बारे में नहीं जानता।
alanjds

4
ध्यान दें कि simpleअब कोई विकल्प नहीं है। 1.7.8.4जब आप पुश करने का प्रयास करते हैं, तो इसमें (और पहले?) परिणाम होता है। लेकिन currentअभी भी उपलब्ध है
साठ ४

@ sixty4bit: मैं git संस्करण 1.7.1 का उपयोग कर रहा हूं। मैं उपयोग कर रहा हूं tracking-> वर्तमान शाखा को इसकी अपस्ट्रीम शाखा पर धकेलूंगा।
केविनपारे

@ sixty4bit नहीं, यह Git के बाद के संस्करण में शामिल हो गया, जिसमें मुझे नहीं पता, लेकिन (1.7) 2016 के लिए, हालांकि नरक के रूप में पुराना है। मैं ऐसे पुराने संस्करणों का उपयोग करने की सिफारिश नहीं करूंगा।
शमौदी

Downvoted। क्षमा करें, लेकिन लिंक किए गए पृष्ठ के विवरण का simpleकोई मतलब नहीं है, इस उत्तर का खंडन करता है, और गलत है - जो इस उत्तर को भ्रमित करता है। लिंक किए गए पृष्ठ का कहना है simple"एक-एक करके शाखाओं को धक्का दिया जाएगा। ज्यादातर वर्तमान शाखा से जुड़ा हुआ है।" क्या इसका मतलब यह है कि यह समानांतर रूप से विरोध के रूप में शाखाओं को क्रमिक रूप से आगे बढ़ाएगा? "ज्यादातर जुड़े" का क्या अर्थ है? फिर, के लिए विवरण के लिए विवरण simpleको उद्धृत करने के लिए आगे बढ़ता है matching, जिसके बारे में किसी को लगता है कि इसके लिए विवरण matchingभी लागू होता है simple। लेकिन जाहिर है कि यह सच नहीं है।
टीवीज

91

GIT प्रलेखन से: Git डॉक्स

नीचे पूरी जानकारी देता है। संक्षेप में, simpleकेवल धक्का देगा current working branchऔर तब भी जब यह रिमोट पर एक ही नाम होगा। यह शुरुआती लोगों के लिए एक बहुत अच्छी सेटिंग है और इसमें डिफ़ॉल्ट बन जाएगाGIT 2.0

जबकि स्थानीय रूप से सभी शाखाओं matchingको धक्का देगा जिनका रिमोट पर समान नाम है। (आपकी वर्तमान कार्य शाखा की परवाह किए बिना)। इसका मतलब है कि संभावित रूप से कई अलग-अलग शाखाओं को धकेल दिया जाएगा, जिनमें आप भी साझा नहीं करना चाह सकते हैं।

मेरे व्यक्तिगत उपयोग में, मैं आमतौर पर एक अलग विकल्प का उपयोग करता हूं: currentजो वर्तमान कार्य शाखा को धक्का देता है, (क्योंकि मैं हमेशा किसी भी परिवर्तन के लिए शाखा करता हूं)। लेकिन एक शुरुआत के लिए मैं सुझाव देता हूंsimple

push.default यह
परिभाषित करता है कि यदि कोई रिफस्पेक्ट स्पष्ट रूप से नहीं दिया गया है तो कार्रवाई को धक्का देना चाहिए। विशिष्ट वर्कफ़्लोज़ के लिए विभिन्न मूल्य अच्छी तरह से अनुकूल हैं; उदाहरण के लिए, विशुद्ध रूप से केंद्रीय वर्कफ़्लो में (यानी फ़ोकस स्रोत पुश डेस्टिनेशन के बराबर है), अपस्ट्रीम शायद वही है जो आप चाहते हैं। संभावित मूल्य हैं:

कुछ भी नहीं - जब तक स्पष्ट रूप से एक refspec नहीं दिया जाता है, तब तक किसी भी चीज (त्रुटि) को धक्का न दें। यह मुख्य रूप से उन लोगों के लिए है जो हमेशा स्पष्ट होने से गलतियों से बचना चाहते हैं।

करंट - वर्तमान ब्रांच को प्राप्त करने वाले सिरे पर उसी नाम के साथ ब्रांच को अपडेट करने के लिए पुश करें। केंद्रीय और गैर-केंद्रीय दोनों वर्कफ़्लो में काम करता है।

अपस्ट्रीम - वर्तमान शाखा को उस शाखा पर वापस धकेलें, जिसके परिवर्तन आमतौर पर वर्तमान शाखा में एकीकृत होते हैं (जिसे @ {अपस्ट्रीम} कहा जाता है)। यह मोड केवल तभी समझ में आता है यदि आप उसी रिपॉजिटरी पर जोर दे रहे हैं जिसे आप सामान्य रूप से (यानी केंद्रीय वर्कफ़्लो) से खींचेंगे।

सरल - केंद्रीकृत वर्कफ़्लो में, अपस्ट्रीम ब्रांच के नाम के साथ काम करने से इंकार करने के लिए अपस्ट्रीम ब्रांच का नाम लोकल से अलग है।

जब आप ऐसे रिमोट से धक्का देते हैं जो आपके द्वारा खींचे जाने वाले रिमोट से अलग होता है, तो करंट के रूप में काम करते हैं। यह सबसे सुरक्षित विकल्प है और शुरुआती लोगों के लिए अनुकूल है।

यह मोड Git 2.0 में डिफ़ॉल्ट हो जाएगा।

मिलान - दोनों छोरों पर समान नाम वाली सभी शाखाओं को धक्का दें। यह उस रिपॉजिटरी को बनाता है जिसे आप उन शाखाओं के सेट को याद करने के लिए धकेल रहे हैं जिन्हें बाहर धकेला जाएगा (जैसे कि यदि आप हमेशा मेन्ट और मास्टर को धक्का देते हैं और कोई अन्य शाखा नहीं है, तो आप जिस रिपॉजिटरी को धक्का देते हैं, उसकी इन दो शाखाएँ होंगी, और आपका स्थानीय मेन्ट और मास्टर वहाँ धकेल दिया जाएगा)।

इस मोड का प्रभावी ढंग से उपयोग करने के लिए, आपको यह सुनिश्चित करना होगा कि आप जिन सभी शाखाओं को बाहर निकालेंगे वे गिट पुश को चलाने से पहले धक्का देने के लिए तैयार हैं, क्योंकि इस मोड का पूरा बिंदु आपको एक ही बार में सभी शाखाओं को धक्का देने की अनुमति देता है। यदि आप आमतौर पर केवल एक शाखा पर काम खत्म करते हैं और परिणाम को बाहर निकालते हैं, जबकि अन्य शाखाएं अपूर्ण हैं, तो यह मोड आपके लिए नहीं है। साथ ही यह मोड एक साझा केंद्रीय भंडार में धकेलने के लिए उपयुक्त नहीं है, क्योंकि अन्य लोग वहां नई शाखाएँ जोड़ सकते हैं, या अपने नियंत्रण के बाहर मौजूदा शाखाओं की नोक को अपडेट कर सकते हैं।

यह वर्तमान में डिफ़ॉल्ट है, लेकिन Git 2.0 डिफ़ॉल्ट को सरल में बदल देगा।


हां, लेकिन मैं पुश.डफॉल्ट सेटिंग के साथ यह भी मान लेता हूं कि यदि आप "$ git पुश ओरिजिन मास्टर " करते हैं, तो यह केवल वर्तमान शाखा को एक ही नाम के साथ मूल पर शाखा की ओर धकेल देगा ... सही? आपको उल्लेख करना चाहिए कि डिफॉल्ट रिमोट भी है
अलेक्जेंडर मिल्स

1
मुझे यकीन नहीं है कि मैं समझता हूं कि आप क्या कर रहे हैं। किसी भी MODE में अगर आप कहते हैं कि git push origin masterयह वही काम करेगा। मोड और डिफॉल्ट की बात आम तौर पर तब होती है जब आप बस कहते हैं git pushऔर आप इसे रिमोट या ब्रांच नहीं बताते हैं। क्या डिफ़ॉल्ट सेटिंग? तुम push.default की डिफ़ॉल्ट सेटिंग का मतलब है? डिफ़ॉल्ट सेटिंग के किस संस्करण में git ... यदि आप इसे प्राप्त नहीं करते हैं तो आपकी टिप्पणी अत्यंत अस्पष्ट है।
UpAndAdam

'पुश.डफॉल्ट परिभाषित करता है कि एक्शन गिट पुश को लेना चाहिए अगर कोई रिफस्पेक स्पष्ट रूप से नहीं दिया गया है' यदि आप कहते हैं कि गिट पुश ओरिजिन मास्टर आप इसे अधिक जानकारी दे रहे हैं और यह अभी भी वह नहीं कर सकता है जो आप वर्णन करते हैं; आपके द्वारा सेट किए गए रीस्पेक के आधार पर .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam

2

Git v2.0 नोट्स जारी करें

पिछड़े संगतता नोट

जब git push [$there]यह नहीं कहा जाता है कि क्या धक्का देना है, तो हमने अब तक पारंपरिक "मिलान" शब्दार्थ का उपयोग किया है (आपकी सभी शाखाएं रिमोट को तब तक भेजी गई थीं जब तक कि वहां पहले से ही एक ही नाम की शाखाएं हैं)। Git 2.0 में, डिफ़ॉल्ट अब "सरल" शब्दार्थ है, जो धक्का देता है:

  • केवल एक ही नाम वाली शाखा में वर्तमान शाखा, और केवल तब जब वर्तमान शाखा उस दूरस्थ शाखा के साथ एकीकृत करने के लिए सेट होती है, यदि आप उसी रिमोट पर जोर दे रहे हैं जिस तरह से आप लाते हैं; या

  • केवल एक ही नाम वाली शाखा में वर्तमान शाखा, यदि आप एक ऐसे रिमोट पर जोर दे रहे हैं, जहां आप आमतौर पर नहीं आते हैं।

इसे बदलने के लिए आप कॉन्फ़िगरेशन चर "push.default" का उपयोग कर सकते हैं। यदि आप एक पुराने-टाइमर हैं जो "मिलान" शब्दार्थ का उपयोग करना चाहते हैं, तो आप उदाहरण के लिए "मिलान" के लिए चर सेट कर सकते हैं। अन्य संभावनाओं के लिए प्रलेखन पढ़ें।

जब git add -uऔर git add -Aजो कमांड लाइन पर जोड़ने के लिए पथ निर्दिष्ट किए बिना एक उपनिर्देशिका के अंदर चलाए जाते हैं, वे पूरे पेड़ पर संगति git commit -aऔर अन्य आदेशों के लिए संचालित होते हैं (ये आदेश केवल वर्तमान उपनिर्देशिका पर काम करते थे)। कहो git add -u .या git add -A .यदि आप ऑपरेशन को वर्तमान निर्देशिका तक सीमित करना चाहते हैं।

git add <path>git add -A <path>अब के रूप में ही है , ताकि git add dir/आप निर्देशिका से हटाए गए रास्तों को नोटिस करेंगे और हटाने को रिकॉर्ड करेंगे। पुराने संस्करणों में Git, git add <path>निष्कासन को अनदेखा करता था। यदि आप वास्तव में चाहते हैं तो आप git add --ignore-removal <path>केवल जोड़े गए या संशोधित पथों को जोड़ने के लिए कह सकते हैं <path>

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