git - निर्दिष्ट शाखा के बिना "गिट पुश" का डिफ़ॉल्ट व्यवहार




branch git-branch (8)

(मार्च 2012)
सावधान रहें: वह डिफ़ॉल्ट " matching " नीति जल्द ही बदल सकती है
(कभी-कभी git1.7.10 + के बाद) :

देखें " कृपया चर्चा करें: क्या" गिट पुश "करना चाहिए जब आप यह नहीं कहें कि क्या धक्का देना है? "

वर्तमान सेटिंग में (यानी push.default=matching ), तर्क के बिना git push पुश उन सभी शाखाओं को धक्का देगा जो स्थानीय रूप से और दूरस्थ रूप से उसी नाम से मौजूद हैं
यह आमतौर पर उपयुक्त होता है जब कोई डेवलपर अपने सार्वजनिक भंडार को धक्का देता है, लेकिन साझा भंडार का उपयोग करते समय खतरनाक नहीं होने पर भ्रमित हो सकता है।

प्रस्ताव डिफ़ॉल्ट को ' upstream ' में बदलना है , यानी केवल वर्तमान शाखा को धक्का देना, और इसे शाखा गिट पुल पर धक्का देना होगा।
एक और उम्मीदवार ' current ' है; यह केवल उसी शाखा की रिमोट शाखा में वर्तमान शाखा को धक्का देता है।

इस धागे में अब तक चर्चा की जा सकती है:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

पिछली प्रासंगिक चर्चाओं में शामिल हैं:

चर्चा में शामिल होने के लिए, अपने संदेश यहां भेजें: [email protected]

मैं अपनी दूरस्थ शाखा को धक्का देने के लिए निम्न आदेश का उपयोग करता हूं:

git push origin sandbox

अगर मैं कहूं

git push origin

क्या यह मेरी दूसरी शाखाओं में भी धक्का बदलता है, या क्या यह केवल मेरी वर्तमान शाखा को अपडेट करता है? मेरे पास तीन शाखाएं हैं: master , production और sandbox

git push दस्तावेज इस बारे में बहुत स्पष्ट नहीं है, इसलिए मैं इसे अच्छे से स्पष्ट करना चाहता हूं।

निम्नलिखित git push कमांड वास्तव में कौन सी शाखाएं और रिमोट अपडेट करते हैं?

git push 
git push origin

उपरोक्त origin एक रिमोट है।

मैं समझता हूं कि git push [remote] [branch] केवल उस शाखा को रिमोट पर धक्का देगी।


आप push.default के साथ अपने गिट के लिए डिफ़ॉल्ट व्यवहार सेट अप कर सकते हैं

git config push.default current

या यदि आपके पास कई रिपोजिटरी हैं और फिर सभी के लिए वही चाहते हैं

git config --global push.default current

इस सेटअप में वर्तमान का अर्थ है कि डिफ़ॉल्ट रूप से आप केवल मौजूदा शाखा को दबाएंगे जब आप गिट पुश करते हैं

अन्य विकल्प हैं:

  • कुछ भी नहीं: कुछ भी धक्का मत दो
  • मिलान: सभी मिलान करने वाली शाखाओं को पुश करें (डिफ़ॉल्ट)
  • ट्रैकिंग: वर्तमान शाखा को जो कुछ भी ट्रैक कर रहा है उसे दबाएं
  • वर्तमान: वर्तमान शाखा को धक्का दें

अद्यतन - यह करने के लिए नया तरीका

गिट 1.7.11 के अनुसार निम्नलिखित कार्य करें:

git config --global push.default simple

यह एक नई सेटिंग पेश की गई है जो वर्तमान में काम करती है, और अफवाहों के अनुसार v 2.0 से गिट करने के लिए डिफ़ॉल्ट हो जाएगी


आप अपने गिट कॉन्फ़िगरेशन में push.default को सेट करके डिफ़ॉल्ट व्यवहार को नियंत्रित कर सकते हैं। गिट-कॉन्फिग (1) दस्तावेज से :

push.default

कमांड लाइन पर कोई रेफस्पेक नहीं दिया गया है, तो एक्शन गिट पुश को परिभाषित करना चाहिए, रिमोट में कोई रेफस्पेक कॉन्फ़िगर नहीं किया गया है, और कमांड लाइन पर दिए गए विकल्पों में से कोई भी रेफस्पेक नहीं है। संभावित मूल्य हैं:

  • nothing : कुछ भी धक्का मत करो

  • matching : सभी मिलान शाखाओं को धक्का

    दोनों सिरों में एक ही नाम वाले सभी शाखाओं को मिलान माना जाता है।

    यह गिट 1.x में डिफ़ॉल्ट है।

  • upstream : वर्तमान शाखा को अपनी अपस्ट्रीम शाखा में धक्का दें ( tracking अपस्ट्रीम के लिए एक बहिष्कृत समानार्थी है)

  • current : मौजूदा शाखा को उसी नाम की शाखा में दबाएं

  • simple : (गिट 1.7.11 में नया) अपस्ट्रीम की तरह, लेकिन अगर ऊपर की ओर शाखा का नाम स्थानीय से अलग है तो धक्का देने से इंकार कर दिया

    यह सबसे सुरक्षित विकल्प है और शुरुआती लोगों के लिए उपयुक्त है।

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

सरल, वर्तमान और अपस्ट्रीम मोड उन लोगों के लिए हैं जो काम खत्म करने के बाद एक शाखा को धक्का देना चाहते हैं, भले ही अन्य शाखाएं अभी तक बाहर निकलने के लिए तैयार न हों

कमांड लाइन उदाहरण:

वर्तमान कॉन्फ़िगरेशन देखने के लिए:

git config --global push.default

एक नई विन्यास सेट करने के लिए:

git config --global push.default current

आप मौजूदा शाखा को कमांड के साथ धक्का दे सकते हैं

git push origin HEAD

( here से लिया गया)


एक गिट पुश रिमोट सर्वर पर सभी स्थानीय शाखाओं को आजमाएगा और धक्का देगा, यह संभव है कि आप जो नहीं चाहते हैं। मेरे पास इस से निपटने के लिए कुछ सुविधाएं स्थापित हैं:

उपनाम "gpull" और "gpush" उचित रूप से:

मेरे ~ / .bash_profile में

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

इस प्रकार, "gpush" या "gpull" निष्पादित करने से केवल मेरी "वर्तमान में" शाखा धक्का देगी।


मैंने इन कार्यों को स्वचालित करने के लिए मेरे .bashrc फ़ाइल में निम्न फ़ंक्शंस जोड़े हैं। यह गिट पुश / गिट पुल + वर्तमान शाखा का नाम करता है।

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}

मैंने बस एक शाखा में अपना कोड किया और इसे गिटूब पर धक्का दिया, इस तरह:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

git push origin स्थानीय शाखाओं पर सभी परिवर्तनों को धक्का देगा जो origin रूप से रिमोट शाखाओं से मेल खाते origin जैसे git push

git push <remote> जैसे काम करता है, जहां <remote> वर्तमान शाखा का रिमोट है (या मूल, यदि वर्तमान शाखा के लिए कोई रिमोट कॉन्फ़िगर नहीं किया गया है)।

git-push मैन पेज के उदाहरण अनुभाग से





git-push