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


1366

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

git push origin sandbox

अगर मैं कहूं

git push origin

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

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

निम्नलिखित git pushआदेशों को कौन सी शाखाएँ और उपाय बताता है?

git push 
git push origin

origin ऊपर एक रिमोट है।

मैं समझता हूं कि git push [remote] [branch]यह केवल उस शाखा को रिमोट तक पहुंचाएगा।


सामान्य रूप से भिन्न औजारों के विन्यास के बारे में, और नई स्क्रिप्ट गिट डिफिसटूल, मैंने इस अन्य SO प्रश्न में एक नया उत्तर जोड़ा है: stackoverflow.com/questions/255202/…
VONC

67
मैंने एक ब्लॉग पोस्ट किया git push, जिसके आश्चर्यजनक व्यवहार के बारे में , जो कि रुचि का हो सकता है
मार्क लॉन्गेयर

1
@ मर्क: अन्य कार्यों में, केवल वर्तमान शाखा को उसके ट्रैक किए गए अपस्ट्रीम पर धकेलना। अच्छा लगा।
VonC


help.github.com/articles/pushing-to-a-remote इस लिंक को मेरे जैसे नौसिखियों की तत्काल मदद के लिए यहां डाल दें
MycrofD

जवाबों:


1591

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

push.default

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

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

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

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

    यह डिफ़ॉल्ट हुआ करता था, लेकिन Git 2.0 के बाद से ( simpleनया डिफ़ॉल्ट नहीं है)।

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

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

  • simple: (नई Git 1.7.11 में) अपस्ट्रीम की तरह, लेकिन अपस्ट्रीम ब्रांच का नाम लोकल से अलग होने पर पुश करने से इनकार कर देता है

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

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

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

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

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

git config --global push.default

नया कॉन्फ़िगरेशन सेट करने के लिए:

git config --global push.default current

11
यह शायद यह ध्यान देने योग्य है कि यह v1.6.3 में नया है: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
यह "push.default" मल्टीपल रिपोज के साथ काम करने के लिए सबसे बड़ी चीज है। इसे "ट्रैकिंग" पर सेट करें और आप सभी अच्छे हैं। ब्रांच -सेट-अपस्ट्रीम के साथ संयुक्त होने से ये पुश और पुल को अधिक सुविधाजनक बनाते हैं।
jpswain

13
"ट्रैकिंग" "अपस्ट्रीम" के लिए पदावनत पर्यायवाची शब्द है: kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
यह ध्यान देने योग्य है कि Git 1.7.11 के रूप में, एक नया simpleमोड है। यह मोड भविष्य में डिफ़ॉल्ट बनने का इरादा रखता है। simpleकी तरह काम करता है upstream, लेकिन currentयह आवश्यक है कि दोनों सिरों पर शाखा के नाम समान हों।
काई

9
यह ध्यान देने योग्य है कि Git 2.0 के रूप में simpleव्यवहार अब डिफ़ॉल्ट है।
do0g

209

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

git config push.default current

या यदि आपके पास कई रिपॉजिटरी हैं और सभी के लिए समान हैं

git config --global push.default current

वर्तमान इस स्थापना का मतलब है कि डिफ़ॉल्ट रूप से आप होगा केवल वर्तमान शाखा धक्का जब आप ऐसा करेंगे Git धक्का

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

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

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

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

git config --global push.default simple

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


29
हां, मैं उस उत्तर को पढ़ता हूं जिसका आप उल्लेख कर रहे हैं, लेकिन यह उत्तर केवल यह बताता है कि क्या करना है और कैसे नहीं। इसलिए मैंने अपना उत्तर जोड़ा, इसलिए इसे सेट करने के लिए आवश्यक सभी जानकारी एक ही पृष्ठ पर है।
क्रिस्टोफर

3
ठीक; उक्त पोस्ट को संपादित करने का सुझाव देना बेहतर है, क्योंकि कोई भी आपके उत्तर को नहीं देखेगा, क्योंकि इसमें अधिक वोट प्राप्त करने की संभावना नहीं है
चार्ल्स

वर्तमान शाखा में जाने के बारे में कोई क्या करेगा? git पुल उत्पत्ति?
फ्रेंकोइस

200

git push originस्थानीय शाखाओं पर सभी बदलावों को आगे बढ़ाएंगे, जिनके originलिए आस- पास की दूरदराज की शाखाओं का मिलान होता हैgit push

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

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


2
हां, यह स्पष्ट करता है। मैं शायद git (1.6.1.1 Mac OS X) का एक पुराना संस्करण चला रहा हूं जिसमें मैन पेज में ये उदाहरण नहीं हैं।
प्लेगहैमर

संभवतः मैं 1.6.3.1 चला रहा हूं। मैंने इसे उस साइट पर पाया, जिसे मैंने लिंक किया था।

2
इसलिए, मेरे मामले में, जहां सभी स्थानीय शाखाओं में एक ही रिमोट "मूल" है, "गिट पुश" बिल्कुल "गिट पुश ओरिजिन" के समान होगा, जो केवल उन स्थानीय शाखाओं को धक्का देगा जिनकी रिमोट में एक संबंधित शाखा है।
प्लेग हैमर

@Debajit पर सही! वैसे शानदार सवाल। मैंने हमेशा यह मान लिया था कि गिट पुश केवल वर्तमान शाखा को धक्का देगा। जाहिरा तौर पर नहीं! जानकर बहुत अच्छा लगा।
ब्यूडटैक

5
यह सवाल पुराना है लेकिन किसी के लिए भी नया, @docgnome सही है। केवल 'git पुश ओरिजिन' को चलाने से केवल करंट ब्रांच की बजाय सभी ब्रांचों को धक्का लगेगा। 'Git push -f -v -n origin development' का उपयोग करके विकास नामक शाखा को आगे बढ़ाने के लिए मजबूर करें। Git पुश परिणाम का अनुकरण करने के लिए एक ध्वज का उपयोग करें ताकि आप पहले से देख सकें कि कौन सी शाखा (तों) प्रभावित होगी। अगर यह अच्छा लगता है तो 'git push -f -v origin development' चलाएं। यह उपयोगी stackoverflow.com/questions/3741136/git-push-f-vs
डायलन वालेड

54

मैंने सिर्फ एक शाखा में अपना कोड डाला और इसे इस तरह से जीथब पर धकेल दिया:

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

3
आप `गीट कमिटम 'के लिए प्रतिबद्ध कर सकते हैं ..." ``
जेम्स हैरिंगटन

17
क्या इस जवाब का सवाल से कोई लेना देना है ?? :
असीम केटी

26

यहाँ Git Push : Git Push: Just the Tip के बारे में बहुत ही उपयोगी और उपयोगी जानकारी दी गई है

गिट पुश का सबसे आम उपयोग आपके स्थानीय परिवर्तनों को आपके सार्वजनिक अपस्ट्रीम रिपॉजिटरी में धकेलना है। यह मानते हुए कि अपस्ट्रीम एक रिमोट है जिसका नाम "ओरिजिनल" (डिफ़ॉल्ट रिपॉजिटरी अगर आपका रिपॉजिटरी क्लोन है) है और जिस ब्रांच को / से अपडेट किया जाना है उसे "मास्टर" (डिफॉल्ट ब्रांच नेम) नाम दिया गया है, इसके साथ यह किया जाता है:git push origin master

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

git push origin master स्थानीय मास्टर शाखा से दूरस्थ मास्टर शाखा में परिवर्तन को धक्का देगा।

git push origin master:staging यदि यह मौजूद है तो स्थानीय मास्टर शाखा से दूरस्थ स्टेजिंग शाखा में परिवर्तन को धक्का देगा।


git push origin branch_nameकिसी कारण के लिए न केवल branch_nameशाखा, बल्कि अन्य मेरी स्थानीय शाखाएं (गिट संस्करण १.९.१) को भी धक्का दें ।
मर्गलूम

git push origin master:stagingएक भयानक छिपा हुआ मणि है!
शकील

19

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

देखें " कृपया चर्चा करें: जब" पुश पुश "आपको क्या करना चाहिए, तो आपको क्या करना चाहिए? "

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

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

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

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

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

चर्चा में शामिल होने के लिए, अपने संदेश भेजें: git@vger.kernel.org


18

मैं इसे अपने .gitconfig उपनाम अनुभाग में रखता हूँ और प्यार करता हूँ कि यह कैसे काम करता है:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

के साथ git pubया किसी अन्य रेपो की उत्पत्ति के लिए वर्तमान शाखा को धक्का देगा git pub repo-name। स्वादिष्ट।


4
यह अच्छा है, लेकिन यह दुर्भाग्य से मानता है कि शाखा का अन्य रिपॉजिटरी पर एक ही नाम है। git push -u --repo="origin" $1;इसके बजाय कोशिश करें । यह काफी अच्छी तरह से काम करता है, सिवाय इसके कि अगर आप किसी अन्य रिपॉजिटरी में जाते हैं, तो ब्रांच का नाम दूसरे रिपॉजिटरी द्वारा उपयोग किया जाने वाला नाम होगा, न कि आप जिस से धक्का दे रहे हैं
केसबश

धन्यवाद! मुझे एक और पूर्ण संस्करण बनाना चाहता है जो धक्का देने से पहले ट्रैकिंग स्थिति की जांच करता है। लेकिन मैं अब के लिए मेरे साथ रहना होगा क्योंकि मैं शायद ही कभी repos के बीच अलग शाखा नाम है।
Mat Schaffer


8

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

उपनाम "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" को निष्पादित करने से मेरे "वर्तमान में" शाखा पर जोर दिया जाएगा।


3
यदि आप हमेशा gpush का व्यवहार चाहते हैं, तो आप दूरस्थ .origin.push = HEAD (जैसे "git config Remote.origin.push HEAD") को भी सेट कर सकते हैं, जैसा कि git-push man पेज के उदाहरण अनुभाग में बताया गया है।
ट्रेवर रॉबिन्सन

5
यह आवश्यक नहीं है यदि आप "ब्रायन एल" द्वारा उपरोक्त पोस्ट को देखते हैं।
jpswain

1
यह है, के रूप में कोई बराबरी नहीं है। पुल के लिए पुल.डाल्ट
सैमगुडी

8

आप उस डिफ़ॉल्ट व्यवहार को अपने में बदल सकते हैं .gitconfig, उदाहरण के लिए:

[push]
  default = current

वर्तमान सेटिंग्स की जाँच करने के लिए, चलाएँ:

git config --global --get push.default

3

उपनामों का उपयोग करने के बजाय, मैं git-XXX स्क्रिप्ट बनाना पसंद करता हूं, ताकि मैं उन्हें और अधिक आसानी से नियंत्रित कर सकूं (हमारे देवों के पास इस प्रकार की चीज़ के लिए उनके मार्ग पर एक निश्चित स्रोत नियंत्रित dir है)।

यह स्क्रिप्ट (कहा जाता है git-setpush) मान के लिए कॉन्फिगरेशन remote.origin.pushवैल्यू को किसी ऐसी चीज पर सेट करेगा जो केवल करंट ब्रांच को आगे बढ़ाएगी:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

ध्यान दें, जैसा कि हम उपयोग कर रहे हैं Gerrit, यह refs/for/XXXएक समीक्षा शाखा में धकेलने का लक्ष्य निर्धारित करता है । यह भी मानता है कि मूल आपका दूरस्थ नाम है।

के साथ एक शाखा की जाँच के बाद इसे लागू करें

git checkout your-branch
git setpush

यह स्पष्ट रूप से चेकआउट करने के लिए भी अनुकूलित किया जा सकता है, लेकिन मुझे एक काम करना और इसे अच्छी तरह से करना स्क्रिप्ट पसंद है


महान विचार की स्थापना Remote.origin.push gerrit उपयोग के लिए। मेरी स्थानीय सुविधा शाखाएँ feature/fix_fubarसभी masterया उससे अधिक सामान्य अपस्ट्रीम शाखाओं developको इंगित की जाती हैं, इसलिए यह गलत अपस्ट्रीम पर इंगित होती हैं। जेरिट नियंत्रित रेपो के लिए आपका स्थानीय प्रवाह कैसा दिखता है?
शुक्राणु

यदि आपके पास केवल एक "टारगेट" शाखा है, तो बस कोशिश करें git config remote.origin.push HEAD:refs/for/master
फ्रैक्ज़

2

मैंने इन कार्यों को स्वचालित करने के लिए अपने .bashrc फ़ाइल में निम्न कार्य जोड़े हैं। यह करंट ब्रांच का git push / git pull + नाम करता है।

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