studio - gita



गिट-पुश वर्तमान बनाम पुश अपस्ट्रीम(ट्रैकिंग) (2)

सवाल यह है कि आप क्या धक्का दे रहे हैं, और कहां :

  • current :

    • " क्या " केवल आपकी वर्तमान शाखा है (कोई अन्य शाखाएं नहीं)
    • अपस्ट्रीम रेपो में " कहां " एक ही नाम की शाखा है (यदि यह अस्तित्व में नहीं है)।
  • upstream :

    • " क्या " केवल वर्तमान शाखा है,
    • अपस्ट्रीम रेपो पर जो भी शाखा है (उसी नाम की जरूरी नहीं है) को स्थानीय शाखा के लिए अपस्ट्रीम शाखा के रूप में असाइन किया गया है जिसे आप दबा रहे हैं।

जैसा कि यहां बताया गया है , Git2.0 अतिरिक्त रूप से push.default लिए एक नया डिफ़ॉल्ट प्रस्तुत करेगा: simple

simple upstream की तरह है, लेकिन अपस्ट्रीम के पास भी वही नाम होना चाहिए या पुश असफल हो जाएगा।

केवल एक शाखा को धक्का देना (मोड " simple ", " current " या " upstream " के साथ) परिदृश्य से बचाता है जहां सभी मिलान करने वाली शाखाओं को धक्का दिया जाता है (मोड " matching ", जो लंबे समय तक डिफ़ॉल्ट था), भले ही आप में से कुछ शाखाओं को धक्का देने के लिए तैयार नहीं हो सकता है।

(master)> git push
...
To [email protected]:jkubicek/my_proj.git
   21b430d..dd378ca  master -> master
 ! [rejected]        release -> release (non-fast-forward)
error: failed to push some refs to '[email protected]:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. 
hint: If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

दो ( current और upstream ) के बीच का अंतर पुल में है (रिमोट से आपकी शाखा में क्या खींचना है?):

  • " current " को धक्का देने का मतलब यह नहीं है कि आपकी वर्तमान शाखा B में remote/B की अपस्ट्रीम शाखा है।
    Ie: branch.B.merge सेट नहीं है, जब आप " current " शाखा को branch.B.merge रहे हैं।
    Ie: B को खींचते समय, गिट को पता नहीं चलेगा कि कौन सी शाखा खींचनी है।

  • " upstream " को धक्का देना मतलब है कि आपकी वर्तमान शाखा B में remote/B की अपस्ट्रीम शाखा है।
    Ie: branch.B.merge सेट है, जब आप " upstream " शाखा को branch.B.merge रहे हैं।
    Ie: B को खींचते समय, गिट जानता है कि कौन सी शाखा खींचने के लिए (साथ ही रिमोट रेपो: branch.B.remote )

https://src-bin.com

मैंने पुश कमांड के बारे में गिट मैन को पढ़ा है, लेकिन मैं अभी भी push.default में सेट होने के लिए वर्तमान और अपस्ट्रीम के बीच सटीक अंतर को नहीं समझता

मैं चाहता हूं कि हमारी टीम सिर्फ धक्का देगी, और केवल उस शाखा में परिवर्तन जो वे वर्तमान में काम कर रहे हैं, को धक्का दिया जाएगा। जैसा कि मैं समझता हूं, यह शाखा वह है जो * (स्टार) के साथ चिह्नित होती है जब मैं गिट शाखा करता हूं।

मदद करने के लिए धन्यवाद।


Answer #1

push.default गिट कॉन्फ़िगर ( man git config ) के मैन पेज में सबसे अच्छा कवर किया गया है।

push.default लिए "अपस्ट्रीम" और "वर्तमान" के बीच के अंतर को समझने के लिए, आपको अपस्ट्रीम शब्द पता होना चाहिए:

अपस्ट्रीम एक सामान्य स्थानीय शाखा से स्थानीय रिमोट-ट्रैकिंग शाखा में स्थानीय सूचक है। (हाँ, ये सभी स्थानीय हैं।) उदाहरण:

  • शाखा ब्लैब्ला मूल / ब्लैब्ला अपस्ट्रीम के रूप में कॉन्फ़िगर किया गया है (बहुत आम)
  • शाखा ब्लब्ला में मूल / foo अपस्ट्रीम के रूप में है (शाखा का एक अलग स्थानीय नाम है, इतना आम नहीं है)
  • शाखा ब्लब्ला में मूल 2 / foo अपस्ट्रीम के रूप में है

ध्यान दें कि मूल / * शाखाएं स्थानीय हैं और (प्रत्येक) मूल से प्रत्येक fetch पर सेट है। इन्हें "स्थानीय रिमोट-ट्रैकिंग शाखा" कहा जाता है। वे अंतिम fetch के समय रिमोट "मूल" पर शाखाओं की स्थिति का प्रतिनिधित्व करते हैं।

प्रत्येक (सामान्य) स्थानीय शाखा में अपस्ट्रीम कॉन्फ़िगर किया जा सकता है, लेकिन यह कोई जरूरी नहीं है: अपस्ट्रीम रिलेशनशिप की कॉन्फ़िगरेशन केवल कुछ गिट कमांड के लिए सुविधा के लिए है!

यदि आप उदाहरण के लिए git status करते हैं, तो गिट आपको बताता है कि "x पीछे / आगे" होता है अगर यह अपस्ट्रीम जानता है (इसलिए गिट इसकी तुलना कर सकता है)।

एक सामान्य प्रारंभिक git checkout blabla आम तौर पर आपके लिए अपस्ट्रीम कॉन्फ़िगरेशन सेट करता है (यदि मूल / ब्लैब्ला मौजूद है, तो यह चेक आउट हो गया है और अपस्ट्रीम के रूप में सेटअप है - अन्यथा चेकआउट विफल हो जाता है)।

git push एक शाखा की अपस्ट्रीम कॉन्फ़िगरेशन का भी उपयोग कर सकता है, यानि आपके नए कामों को रिमोट शाखा में कॉपी करने के लिए जो अपस्ट्रीम का प्रतिनिधित्व करता है। (यह push.default = upstream ।)

push.default = current एक git push को उसी नाम के तहत रिमोट पर नए काम git push प्रतिलिपि देता है। यह अपस्ट्रीम कॉन्फ़िगरेशन को पूरी तरह से अनदेखा करता है। - यदि आपका स्थानीय शाखा नाम हमेशा रिमोट के समान होता है, तो दोनों कॉन्फ़िगरेशन का एक ही प्रभाव होता है, सिवाय इसके कि push.default = upstream साथ push.default = upstream git push को विफल कर दिया जाएगा, अगर अपस्ट्रीम अभी तक कॉन्फ़िगर नहीं किया गया है।

पीडी: हाँ, * git branch के उत्पादन में वर्तमान शाखा दिखाती है।





git