Git में दूर से शाखाओं का नाम बदलना


407

यदि कोई ऐसा भंडार है, जिसकी git://पहुँच मेरे पास है (और आमतौर पर सिर्फ पुश + पुल होगा), तो क्या उस भंडार में शाखाओं का नाम बदलने का एक तरीका है जिस तरह से मैं स्थानीय स्तर पर करूँगा git branch -m?


48
लिंक किया हुआ "डुप्लिकेट" प्रश्न एक शाखा का नाम बदलने के लिए कहता है "स्थानीय और दूरस्थ दोनों"। यह प्रश्न, हालांकि, केवल शाखाओं को दूर से नाम बदलने के लिए कैसे पूछता है, जो एक सरलीकरण की अनुमति देता है। चेकआउट करने और / या स्थानीय शाखा बनाने की आवश्यकता के बिना सर्वर पर एक शाखा का नाम बदलने के लिए मैं यह करता हूं git push origin origin/old_name:refs/heads/new_name && git push origin :old_name:।
sschuberth

1
@sschuberth: आप दोनों कमांड एक बार में दे सकते हैं। और यह वास्तव में इस प्रश्न का उत्तर होना चाहिए।
जोकिम ब्रेइटनर

2
@JoachimBreitner आप सही हैं, मैंने उस अनुकूलन को पहले से ही इस स्क्रिप्ट में किया था ।
sschuberth 11

1
@sschuberth, आपको अपनी टिप्पणी एक उत्तर के रूप में पोस्ट करनी चाहिए, क्योंकि मुझे यह नीचे के अन्य लोगों की तुलना में बेहतर लगता है।
फतमान

जवाबों:


480

आपको केवल वांछित नाम के साथ एक नई स्थानीय शाखा बनानी है, इसे अपने रिमोट पर धकेलें, और फिर पुरानी दूरस्थ शाखा को हटा दें:

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

फिर, पुराने शाखा नाम को देखने के लिए, रिपॉजिटरी के प्रत्येक ग्राहक को करना होगा:

$ git fetch origin
$ git remote prune origin

नोट: यदि आपकी पुरानी शाखा आपकी मुख्य शाखा है, तो आपको अपनी मुख्य शाखा सेटिंग्स बदलनी चाहिए। अन्यथा, जब आप दौड़ते हैं $ git push origin :old-branch-name, तो आपको "वर्तमान शाखा निषिद्ध हटाने" की त्रुटि मिलेगी ।


8
ठीक है, अगर पुराने और नए नाम समान हैं, तो इसका मतलब है कि आपको शाखा का नाम बदलने की आवश्यकता नहीं है, इसलिए पहली जगह में कमांड चलाने का कोई मतलब नहीं है ;-)
सिल्वेन डिफ्रेंसने

9
ज़रूर। मेरा सिर्फ इतना मतलब है कि अगर आप इसे स्वचालित तरीके से (किसी अन्य स्क्रिप्ट के एक कार्य भाग के रूप में) कह रहे हैं, तो हो सकता है कि आपके पास इससे बचने के लिए गलत काम न हो।
मिस्टीरियस डैन

9
दान का तरीका: आदेशों को फिर से व्यवस्थित करें ताकि वे हमेशा काम करें। अर्थ इंजन का तरीका: हमेशा चेक करना याद रखें, या आप डेटा खो दें। मुझे पता है कि मैं कौन सा चुनूंगा।
डोरादस

2
उपयोगकर्ता केवल चला सकते हैं: git fetch origin --prune(प्रभावी रूप से नई शाखाओं को लाने के लिए और रिमोट पर अब संदर्भों से छुटकारा पाने के लिए)।
डॉल्फिनड्रीम

2
गिट के नए संस्करणों में उपयोग -dया --deleteइसके बजाय कर सकते हैं :
ज़िट्रैक्स

285

यदि आप वास्तव में एक ही समय में किसी भी स्थानीय शाखाओं का नाम लिए बिना दूरस्थ रूप से शाखाओं का नाम बदलना चाहते हैं , तो आप एकल कमांड के साथ ऐसा कर सकते हैं:

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

मैंने यह स्क्रिप्ट ( git-rename-रिमोट-ब्रांच ) लिखी है जो उपरोक्त आसानी से करने के लिए एक आसान शॉर्टकट प्रदान करती है।

एक समारोह के रूप में:

git-rename-remote-branch(){
  if [ $# -ne 3 ]; then
    echo "Rationale : Rename a branch on the server without checking it out."
    echo "Usage     : $(basename $0) <remote> <old name> <new name>"
    echo "Example   : $(basename $0) origin master release"
    exit 1 
  fi

  git push $1 $1/$2:refs/heads/$3 :$2
}

@ Ksrb की टिप्पणी को एकीकृत करने के लिए : यह मूल रूप से एक ही कमांड में दो पुश करता है, पहले git push <remote> <remote>/<old_name>:refs/heads/<new_name>पुराने रिमोट ट्रैकिंग शाखा पर आधारित एक नई रिमोट शाखा को पुश करने के लिए और फिर git push <remote> :<old_name>पुरानी रिमोट शाखा को हटाने के लिए।


10
उन लोगों के लिए जो उस आदेश का एक उपनाम चाहते हैं: नाम बदलें = "! F () {git push मूल उत्पत्ति / $ 1: refs / heads / $ 2: $ 1;}; f" इसे "git rename" <_name> <के रूप में उपयोग किया जा सकता है; new_name>
जोनाथन श्मिट 12

33
उन लोगों के बारे में जो इस आदेश का वास्तव में मतलब है के लिए यह अनिवार्य रूप से 2 पुश का git push <remote>/<old_name>:refs/heads/<new_name>मतलब है एक नया रिमोट धक्का जो src के रूप में पुराने रिमोट का उपयोग करता है तो git push [space]:<old_name> इसका मतलब है कि पुराने रिमोट को हटा दें
ksrb

3
आपको उपयोग करने की आवश्यकता क्यों है refs/heads/name? क्या आप केवल nameपहली कमांड बनाते हुए सीधे उपयोग नहीं कर सकते git push <remote> <remote>/<old_name>:<new_name>?
ड्रू नोक

6
नहीं, क्योंकि दूरस्थ शाखा <new_name>अभी तक मौजूद नहीं है। यदि शाखा मौजूद नहीं है, तो गिट को आपको पूर्ण नाम का उपयोग करने की आवश्यकता होती है, अन्यथा <new_name>टैग नाम का भी उल्लेख कर सकते हैं।
sschuberth

3
हम अपने निर्माण प्रणाली में इस दृष्टिकोण का उपयोग करते हैं। यदि हम refs/heads/<new_name> पहले से ही मौजूद हैं , तो केवल चेतावनी । हटाना अभी भी सफल है, जिसके परिणामस्वरूप <remote>/<old_name>केवल हटाया जा रहा है। हाथ से पहले कुछ जाँच आसानी से इससे बच सकते हैं।
एपिरॉन

172

पहले उस शाखा का चेकआउट करें जिसका आप नाम बदलना चाहते हैं:

git branch -m old_branch new_branch
git push -u origin new_branch

से एक पुरानी शाखा को हटाने के लिए remote:

git push origin :old_branch

12
जब आप नामांकित शाखा (new_branch) को दूरस्थ (मूल) पर धकेलते हैं, तो आपको शाखा को नए नाम (जैसे git push -u origin new_branch) के साथ ट्रैक करने के लिए इसके अपस्ट्रीम को भी सेट करना चाहिए अन्यथा नामांकित शाखा (new_branch) मूल (old_branch) को ट्रैक करना जारी रखेगी। और जब आप दूरस्थ old_branch को हटा देते हैं, तो new_branch अभी भी मूल / old_branch को ट्रैक करेगा, यद्यपि अब वह शाखा समाप्त हो चुकी है।
डॉल्फिनड्रीम

@ डॉल्फिनड्रीम मैंने आपके उपयोगी अपस्ट्रीम परिवर्तन को शामिल करने के लिए उत्तर को संपादित किया।
18

10

ज़रूर। बस स्थानीय रूप से शाखा का नाम बदलें, नई शाखा को धक्का दें, और पुराने को हटा दें।

एकमात्र वास्तविक मुद्दा यह है कि रिपॉजिटरी के अन्य उपयोगकर्ताओं का नाम बदलकर स्थानीय ट्रैकिंग शाखा नहीं होगी।


1
इसलिए जब मास्टर को हटाने की कोशिश कर रहा हूं, मैंने $ git क्लोन की कोशिश की है ../src $ cd src $ git branch notmaster $ git checkout notit $ git branch -d master $ git push ../src: master: लेकिन यह शिकायत करता है: गंतव्य refspec न तो रिमोट पर मौजूदा रेफरी से मेल खाता है और न ही Refs / से शुरू होता है, और हम स्रोत रेफ के आधार पर एक उपसर्ग का अनुमान लगाने में असमर्थ हैं। त्रुटि: कुछ रेफल्स को '../alpha/' पर धकेलने में विफल रही, रिमोट में वास्तव में एक शाखा होती है जिसे मास्टर कहा जाता है
kdt

2

टी एल; डॉ

एक दूरस्थ शाखा का "नामकरण" वास्तव में एक 2 कदम प्रक्रिया है (जरूरी नहीं कि आदेश दिया गया हो):

  • पुरानी दूरस्थ शाखा git push [space]:<old_name>को हटाना ( जैसा कि ksrb समझाया गया है );
  • एक नई दूरस्थ शाखा में धक्का दें (नीचे दिए गए कुछ उत्तरों के बीच अंतर)।

हटाया जा रहा है

मैं TortoiseGit का उपयोग करता हूं और जब मैंने पहली बार कमांड लाइन के माध्यम से शाखा को हटाने की कोशिश की, तो मुझे यह मिला:

$ git push origin :in
  • घातक: 'उत्पत्ति' एक गैट भंडार के रूप में प्रकट नहीं होता है

  • घातक: दूरस्थ भंडार से नहीं पढ़ सकता था।

कृपया सुनिश्चित करें कि आपके पास सही एक्सेस अधिकार हैं और रिपॉजिटरी मौजूद है।

इस संभावना की वजह से था तमाशा नहीं होने निजी कुंजी (जो लोड TortoiseGit भार में स्वचालित रूप से तमाशा )। इसके अलावा, मैंने देखा कि TortoiseGit कमांड में originरेफरी नहीं है (जैसे git.exe push --progress "my_project" interesting_local:interesting)।

मैं Bitbucket और अन्य वेब-आधारित ऑनलाइन गिट प्रबंधकों (GitHub, GitLab) के वेब प्रबंधकों के रूप में भी उपयोग कर रहा हूं, मैं उनके इंटरफ़ेस (शाखाओं पृष्ठ) के माध्यम से सीधे दूरस्थ शाखा को हटाने में सक्षम था:

शाखा Bitbucket हटाएं

हालाँकि, TortoiseGit में आप ब्राउज़ संदर्भ के माध्यम से दूरस्थ शाखाओं को भी हटा सकते हैं :

संदर्भ मेनू ब्राउज़ करें

किसी दूरस्थ शाखा पर राइट-क्लिक करके (सूची को हटाता है) दूरस्थ शाखा को हटाएं विकल्प दिखाता है:

TortoiseGit दूरस्थ शाखा हटाएं

धक्का

पुरानी दूरस्थ शाखा को हटाने के बाद मैंने सीधे कछुआगेट के माध्यम से एक नई दूरस्थ शाखा में धकेल दिया, रिमोट का नया नाम टाइप करके : पुश विंडो का क्षेत्र और यह शाखा स्वचालित रूप से बनाई गई थी और बिटबकेट में दिखाई दे रही थी

हालांकि, अगर आप अभी भी इसे मैन्युअल रूप से करना पसंद करते हैं, तो एक बिंदु जिसका अभी तक इस धागे में उल्लेख नहीं किया गया है, वह है -u= --set-upstream

से git pushडॉक्स , -uबस का एक अन्य नाम है --set-upstream, के जवाब में इतना आदेशों सिल्वेन (-set-upstream new-branch ) और शशांक ( -u origin new_branch) , बराबर हैं दूरदराज के रेफरी के बाद से चूक करने के लिएorigin , अगर कोई अन्य रेफरी पहले से परिभाषित किया गया है:

  • git push origin -u new_branch= git push -u new_branch से डॉक्स विवरण :

    यदि कॉन्फ़िगरेशन अनुपलब्ध है, तो यह करने के लिए डिफ़ॉल्ट है origin

अंत में, मैंने अन्य उत्तरों द्वारा सुझाए गए आदेशों में से कोई भी मैन्युअल रूप से टाइप या इन का उपयोग नहीं किया, इसलिए शायद यह एक समान स्थिति में दूसरों के लिए उपयोगी हो सकता है।


समस्या यह है कि आपके रिमोट को कॉल नहीं किया जाता है origin। कमांड चलाने से आपको अपने रिमोट का नाम देना होगा git remote। Git से sshतात्पर्य है कि आप सार्वजनिक + निजी कुंजी का उपयोग कर रहे हैं। मुझे लगता है कि Autoload Putty keysTortoiseGit की बस आपके दूरस्थ संदर्भ के साथ कुछ भी करने के लिए आपके लिए आवश्यक कुंजी स्वतः पूर्ण कर रही है। अंतिम बात यह है कि git push -uदूरस्थ शाखा में धकेलने के लिए एक उपनाम नहीं है, यह एक दूरस्थ शाखा में धकेलने के लिए एक उपनाम है जिसे स्थानीय रूप से बनाया गया था और इसका दूरस्थ संदर्भ अभी तक इस शाखा में नहीं है
जुआनकैबेलो

1
@ संजाब -uका एक उपनाम है --set-upstreamऔर "यदि कॉन्फ़िगरेशन गायब है, तो यह चूक हैorigin "। सिल्वेन और शशांक इसका उपयोग नव निर्मित रिमोट शाखा में धकेलने के लिए करते हैं । जब मैंने शेल पर कोशिश की तो पेजेंट के लोड नहीं होने के कारण यह महत्वपूर्ण मुद्दा हो सकता है । इसलिए मैं आपके पतन को नहीं समझता, मैंने केवल अन्य उत्तरों में मेरा और गैर-संबोधित विवरणों को इंगित किया, उन्हें समझाया और उन्हें हल किया। git push origin :in
CPHPython

आप गलत बातें बता रहे हैं और इस जवाब का बहुत कुछ सवाल ही नहीं है। यदि आप इंगित कर रहे हैं कि आपके लिए क्या काम किया है, तो मैं आपको उत्तर देने के लिए प्रोत्साहित करता हूं कि यह क्या काम करता है और यदि आप वास्तव में स्पष्टीकरण देना चाहते हैं, तो कृपया अपने आप को बेहतर सूचित करें। Btw: के -uलिए एक उपनाम है --set-upstreamलेकिन यह एक दूरस्थ शाखा में धकेलने के लिए एक उपनाम नहीं है जैसा आपने कहा था। एक दूरस्थ शाखा में जाने के लिए जिसकी आपको विशिष्ट आवश्यकता है git push <remote>, और यदि यह अभी तक दूरस्थ में नहीं है, तो आप जोड़ते हैं git push -u <remote>। इसलिए, -uरिमोट में शाखा का एक संदर्भ बनाने के लिए उपयोग किया जाता है।
जुआनकैबेलो

1
@ संजाब शायद जिसे आप गलत समझ रहे थे, वह ज्यादातर उर्फ चेतास या शब्दों का चुनाव था। मैंने अपने उत्तर का पुनर्गठन किया और एक दूरस्थ शाखा का नाम बदलने के लिए पाया गया समाधान (एस) का पूर्ण विवरण प्रदान करने के लिए इसे फिर से परिभाषित किया ।
CPHPython

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

1

मुझे पता नहीं क्यों लेकिन @ सिल्वेन डिफ्रेंस का जवाब मेरे लिए कारगर नहीं है।

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

मुझे अपस्ट्रीम को अनसेट करना होगा और फिर मैं स्ट्रीम को फिर से सेट कर सकता हूं। निम्नलिखित यह है कि मैंने इसे कैसे किया।

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

0

मुझे नहीं पता कि यह सही है या गलत है, लेकिन मैंने शाखा के "पुराने नाम" को शाखा के "नए नाम" पर धकेल दिया, फिर पुरानी शाखा को निम्नलिखित दो पंक्तियों के साथ पूरी तरह से हटा दिया:

git push origin old_branch:new_branch
git push origin :old_branch

जहाँ तक मैं बता सकता हूँ, यह वही है जो अन्य सभी उत्तर देता है। आपका जवाब सिर्फ और अधिक रसीला है।
क्लीयर

-1

आप पुराने नाम की शाखा के आधार पर एक नई शाखा बना सकते हैं। बस इस तरह, फिर पुरानी शाखा को हटा दें, !!!यहां छवि विवरण दर्ज करें


वह गिटहब है, गिट नहीं। ;)
बाउंसर

-4

पहले से दिए गए उत्तरों को जोड़ते हुए, यहां एक संस्करण दिया गया है जो पहले जांचता है कि क्या नई शाखा पहले से मौजूद है (इसलिए आप इसे स्क्रिप्ट में सुरक्षित रूप से उपयोग कर सकते हैं)

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(जाँच इस उत्तर से है )


मैं git show-ref --quiet --verify -- refs/heads/$new_nameइसके बजाय इस्तेमाल किया होता ls-remote | cut | sed | grep
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.