"सरल" बनाम "वर्तमान" पुश। विकेन्द्रीकृत वर्कफ़्लो के लिए गिट में बदलाव


122

कार्यात्मक रूप से, विकेंद्रीकृत वर्कफ़्लो में, मुझे विन्यास सेटिंग के बीच simpleऔर currentविकल्पों में अंतर नहीं दिखता है push.default

currentवर्तमान शाखा को निर्दिष्ट रिमोट पर एक पहचानी जाने वाली शाखा को धक्का देगा। simpleप्रभावी रूप से एक ही चीज़ के साथ-साथ ट्रैक किए गए और वर्तमान शाखा के लिए कोई भी अनपेक्षित उपाय दोनों के लिए करेगा (यह दोनों मामलों में समान शाखा नामों को लागू करता है)।

क्या कोई विकेन्द्रीकृत वर्कफ़्लोज़ के लिए दोनों के बीच किसी महत्वपूर्ण अंतर की व्याख्या कर सकता है जो मुझे याद आ रही है?



2
@ ट्रेवर - जो मेरे प्रश्न से संबंधित नहीं है।
void.pointer

जवाबों:


185

अंतर यह है कि simple, git push(बिना किसी रिस्पेक्ट को पास किए) विफल हो जाएगा यदि वर्तमान शाखा रिमोट अपस्ट्रीम शाखा को ट्रैक नहीं कर रही है (भले ही उसी नाम की एक शाखा रिमोट पर मौजूद हो):

$ git checkout -b foo
Switched to a new branch 'foo'

$ git config push.default simple
$ git push
fatal: The current branch foo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin foo

दूसरी ओर, currentइस बात की परवाह नहीं करता है कि वर्तमान शाखा एक अपस्ट्रीम को ट्रैक करती है या नहीं, यह सिर्फ उसी शाखा को धकेलना चाहती है जिसका नाम समान हो:

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo

दस्तावेज़ीकरण

से Git विन्यास प्रलेखन :

  • upstream - करंट ब्रांच को इसके अपस्ट्रीम ब्रांच पर धकेलें ...

  • simple - अपस्ट्रीम की तरह, लेकिन अगर अपस्ट्रीम ब्रांच का नाम लोकल से अलग हो तो पुश करने से मना कर देता है ...

  • current - वर्तमान शाखा को उसी नाम की एक शाखा पर धकेलें।


4
मुझे लगता है कि केवल "बोनस" प्रश्न "क्यों" है। मुझे लगता है कि एक अपस्ट्रीम ट्रैकिंग शाखा को मजबूर करने से गलती हो जाती है (गलती से उस शाखा पर गलत तरीके से ओवरराइटिंग हो जाती है)।
void.pointer

7
सरल लगता है सुरक्षित "सीट बेल्ट" विकल्प।
जोनाथन

2
एक लंबे समय के बाद मेरे अपने प्रश्न पर दोबारा गौर करना :-) कैसे currentपता चला कि कौन सा रिमोट चुनना है? यदि आपके पास एक ट्रैकिंग शाखा सेट नहीं है, तो यह कहां धकेलता है?
void.pointer

2
यह डिफ़ॉल्ट रिमोट -> का अर्थ है कि मूल। मैन गिट-पुश से: जब कमांड लाइन यह निर्दिष्ट नहीं करती है कि <रिपॉजिटरी> तर्क, शाखा के साथ कहां पुश करना है। * वर्तमान ब्रांच के लिए रिमोट कॉन्फ़िगरेशन को यह निर्धारित करने के लिए परामर्श दिया जाता है कि कहां पुश करना है। यदि कॉन्फ़िगरेशन अनुपलब्ध है, तो यह मूल के लिए डिफ़ॉल्ट है।
रेग्नेज़

2
मैंने हमेशा वर्षों तक 'करंट' का उपयोग किया है, बिल्कुल कोई समस्या नहीं है। अधिकांश मामलों के लिए यह काम करता है: एक रेपो को खींचना / धक्का देना, नई शाखाएं बनाना या मौजूदा शाखाओं की जांच करना जहां नामकरण संघर्ष की संभावना नहीं है। बस काम करता है, कोई मुद्दा नहीं। यह नहीं कहा जा सकता है कि यह डिफ़ॉल्ट होना चाहिए (क्योंकि यह असुरक्षित है) लेकिन शुक्र है कि यह मौजूद है।
ट्रिसवेब

10

अंतर यह है कि simpleइसकी ट्रैकिंग शाखा में धक्का दिया जाता है यदि इसका एक ही नाम है, जबकि currentकिसी भी ट्रैकिंग शाखा की परवाह किए बिना उसी नाम की एक शाखा को धक्का देगा:

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.