चेकआउट के बिना शाखा सूचक को अलग-अलग प्रतिबद्ध में स्थानांतरित करें


759

एक चेक आउट शाखा के शाखा सूचक को स्थानांतरित करने के लिए, कोई भी git reset --hardकमांड का उपयोग कर सकता है । लेकिन एक अलग-अलग बिंदु पर इंगित करने के लिए एक नॉट-चेक आउट शाखा के शाखा सूचक को कैसे स्थानांतरित किया जाए (सभी अन्य सामान जैसे ट्रैक किए गए दूरस्थ शाखा को रखने के लिए)?


11
लगता है कि तुम सब करना चाहते थे एक अलग प्रतिबद्ध से एक शाखा है कि यह अब से बनाया गया है। अगर मेरी समझ सही है, तो आप git branch <branch-name> <SHA-1-of-the-commit>पुरानी शाखा को इस्तेमाल करने और उसे डंप करने के लिए बस एक नई शाखा क्यों नहीं बनाते ?
यसुसर

6
@yasouser - मुझे यकीन नहीं है कि जो भी "मास्टर" शाखा डंपिंग एक अच्छा विचार है।
Bulwersator

जवाबों:


578

आप इसे मनमाने ढंग से रेफ के लिए कर सकते हैं। यह शाखा सूचक को स्थानांतरित करने का तरीका है:

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

सामान्य रूप:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

यदि आप चाहें तो आप रिफ्लॉग संदेश के बारे में निट्स चुन सकते हैं - मेरा मानना ​​है कि जो branch -fएक से अलग है reset --hard, और यह उनमें से बिल्कुल भी नहीं है।


39
संदेश कहां के लिए अच्छा है? यह कहाँ संग्रहीत है और इसे बाद में कैसे पढ़ा जाए?
मोट

4
नोट: यह नंगे रिपोजिटरी पर काम नहीं करता है। नंगे रिपॉजिटरी पर, आपको शाखा को अपडेट करने के लिए 'गिट ब्रांच -फ मास्टर <कमिट>' का उपयोग करना होगा (नीचे उत्तर देखें)।
जून रोड्स

37
अगर, मेरी तरह, आप गलती से रेफ्स / हेड्स / <ब्रांच> के बजाय <शाखा> का उपयोग करते हैं, तो आप अपनी .गित निर्देशिका में .IT / <ब्रांच> में एक नई फ़ाइल के साथ समाप्त करेंगे, और आपको संदेश मिलेंगे। जब आप इसके साथ काम करने की कोशिश करते हैं तो "refname 'मास्टर' अस्पष्ट है"। आप अपने .git निर्देशिका से फ़ाइल को ठीक करने के लिए हटा सकते हैं।
डेविड माइनर

34
यह संतोष की व्याख्या नहीं की गई है कि यह किसी से बेहतर क्यों है git branch -f। विशिष्ट होने के लिए, यह विधि प्रतीत होती है: (ए) का उपयोग करना कठिन (बी) को याद रखना कठिन है, और (सी) अधिक खतरनाक है
स्टीवन लू

10
"वास्तव में मनमाने ढंग से रेफरी द्वारा क्या मतलब है" - शाखाएं केवल एक प्रकार का रेफरी नहीं हैं जो एक कमिट को इंगित करती हैं। टैग हैं, और आप मनमाने ढंग से Refs / whatevs / myref शैली भी बना सकते हैं, जो न तो शाखाएं हैं और न ही टैग। मेरा मानना ​​है कि स्टीवन लू के इस सवाल का भी जवाब है कि यह "बेहतर" क्या हो सकता है। यदि आप शाखाओं के साथ काम कर रहे हैं तो मैं शाखा-एफ सबसे सरल हूं।
एडम ए

962
git branch -f <branch-name> <new-tip-commit>

24
या मनमाने ढंग refs के लिए, git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>। (यदि आप चाहें तो आप रिफ्लॉग संदेश के बारे में निट्स चुन सकते हैं - मेरा मानना ​​है कि वह branch -fएक से अलग है reset --hard, और यह दोनों में से कोई भी नहीं है।)
कास्केबेल

4
जेफ्रोमी, कृपया एक अलग उत्तर लिखें ताकि आपको वोट मिल सकें। :)
मोट

16
यह एक बेहतर जवाब है क्योंकि यह 99% मामले को संभालता है और वास्तव में प्रलेखन के अनुरूप है। git help branch"-f, --force रीसेट करें <ब्रांचनेम> से <startpoint> अगर <ब्रांचमेम> पहले से मौजूद है। बिना -फिट शाखा एक मौजूदा ब्रांच को बदलने से इनकार करती है।"
अलेक्सचैफी

12
मैं कर रहा हूँ git branch -f master <hash>और यह मुझे बता रहा है fatal: Cannot force update the current branch.उम्म्म मुझे अब क्या करना है, मुझे इस कमांड का उपयोग करने की अनुमति देने से पहले कुछ अन्य यादृच्छिक शाखा देखें?
क्वर्टी

20
यदि आप जिस शाखा को स्थानांतरित करने का प्रयास कर रहे हैं, वह आपकी वर्तमान शाखा नहीं है (तो HEADयह इंगित करता है)।
व्लादिमीर पेंटेलेव

135

आप git reset --hardएक कमिटमेंट पास भी कर सकते हैं ।

उदाहरण के लिए:

git checkout branch-name
git reset --hard new-tip-commit

मुझे लगता है कि मैं इस अर्ध-अक्सर ऐसा कुछ करता हूं:

इस इतिहास को मानते हुए

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master

यह उस समय में सबसे अधिक समझ में आता है कि आमतौर पर शाखा टिप को समय पर वापस लाने के लिए HEAD या HEAD ^ का उपयोग किया जाता है। तो यह आगे प्रतिबद्ध निर्दिष्ट करने के लिए संगत है।
justingordon

11
यह ठीक है अगर आपका काम करने वाला पेड़ साफ है। यदि आपके पास बहुत सारे मंचन या अस्थिर परिवर्तन हैं, तो संभवतः यह बेहतर है git update-refजैसा कि ऊपर चर्चा की गई है।
एक भुगतान किया बेवकूफ

16
क्या आपने देखा कि आपका "जवाब" कुछ भी नहीं जोड़ता है जो पहले से ही सवाल का हिस्सा नहीं है ?? - ओपी ने कहा: अगर इसकी जाँच की जाती है ... तो आप git reset --hard ...इसे यहाँ दोहराने की कोई ज़रूरत नहीं है! :-(
बजे रॉबर्ट सिएमर

6
@ रॉबर्ट: मैं असहमत हूं। सवाल यह नहीं कहा कि इसका उपयोग कैसे करें और यह करता है। यह अच्छा है कि कैसे के लिए देखो जाना नहीं था।
विल्सन एफ

7
@WilsonF, शायद आपके लिए यहां यह पता करना अच्छा था, लेकिन यह सवाल का जवाब नहीं दे रहा है। हो सकता है कि यह किसी और सवाल का जवाब हो, लेकिन यहां यह गलत है
रॉबर्ट सिएमर

52

बस चर्चा को समृद्ध करने के लिए, यदि आप myBranchअपनी वर्तमान प्रतिबद्धताओं के लिए शाखा को स्थानांतरित करना चाहते हैं, तो उसके बाद दूसरे तर्क को छोड़ दें-f

उदाहरण:

git branch -f myBranch


मैं आम तौर पर ऐसा करता हूं जब मैं rebaseएक अलग अवस्था में रहता हूं :)


13

इन gitk --all:

  • आप जो चाहते हैं, उस पर राइट क्लिक करें
  • -> नई शाखा बनाएं
  • किसी मौजूदा शाखा का नाम दर्ज करें
  • उस नाम की पुरानी शाखा को बदलने की पुष्टि करने वाले संवाद पर वापस लौटें ।

मौजूदा शाखा को संशोधित करने के बजाय पुन: बनाने से सावधान रहें कि ट्रैकिंग-शाखा की जानकारी खो जाएगी । (यह आमतौर पर सरल उपयोग के मामलों के लिए कोई समस्या नहीं है, जहां केवल एक रिमोट है और आपकी स्थानीय शाखा का रिमोट में संबंधित नाम के समान नाम है। अधिक विवरण के लिए टिप्पणियां देखें। धन्यवाद @mbdevpl इस नकारात्मक पक्ष को इंगित करने के लिए।)

यदि gitkसंवाद बॉक्स में 3 विकल्प होते हैं तो यह शांत होगा : ओवरराइट करें, मौजूदा को संशोधित करें, या रद्द करें।


यहां तक ​​कि अगर आप आम तौर पर खुद की तरह एक कमांड लाइन नशेड़ी हैं, git guiऔर gitkवे अच्छी तरह से git उपयोग के सबसेट के लिए डिज़ाइन किए गए हैं जो वे अनुमति देते हैं। मैं उच्च स्तर पर उनका उपयोग करने की सलाह देता हूं जो वे अच्छे हैं (जैसे कि चुनिंदा रूप से git gui में अनुक्रमणिका से बाहर / में हॉकिंग करते हैं, और सिर्फ कमिटिंग भी करते हैं। (ctrl-s to sign-off: line, ctrl-enter to प्रतिबद्ध) ।)

gitk कुछ शाखाओं का ट्रैक रखने के लिए बहुत अच्छा है जब आप एक अच्छा पैच श्रृंखला में अपने परिवर्तनों को अपस्ट्रीम, या कुछ और जहां आप कई शाखाओं के साथ आप के बीच में हैं का ट्रैक रखने की जरूरत है।

मेरे पास एक ग्राफ़िकल फ़ाइल ब्राउज़र भी नहीं है, लेकिन मुझे gitk / git gui बहुत पसंद है।


1
इतना आसान! मैं बस gitg से gitk में परिवर्तित हो सकता हूं।
माइकल कोल

इस तरह, हालांकि, ट्रैकिंग शाखा की जानकारी खो गई है।
mbdevpl

@mbdevpl: मैं वास्तव में एक गिट विशेषज्ञ नहीं हूं। मुझे लगता है कि मैं समझ रहा हूं कि आपका क्या मतलब है, लेकिन निहितार्थ नहीं। मैंने इसे काफी बार इस्तेमाल किया है, और अभी भी उन शाखाओं को रिमोट पर एक ही नाम की शाखाओं में धकेलने में सक्षम है। एक शाखा और इसके दूरस्थ-ट्रैकिंग शाखा के बीच संबंध आपके लिए क्या करता है?
पीटर कॉर्डेस


1
@PeterCordes Ineed, जब शाखा के नाम इससे मेल नहीं खाते। साथ ही जब एक से अधिक रिमोट हों। जब आप शाखा स्थिति को प्रदर्शित करने के लिए git प्रॉम्प्ट का उपयोग कर रहे हैं, तो यह आपकी ट्रैकिंग शाखा (यदि यह सेट है) से दूरी दिखाएगा। साथ ही, git statusआउटपुट प्रभावित होता है। इसके अतिरिक्त, कुछ मामलों में git fetchऔर git pushयदि आप ट्रैकिंग शाखा को सेट नहीं करते हैं, तो दूरस्थ रूप से निर्दिष्ट किए बिना काम नहीं करेगा। मुझे सभी मामलों के बारे में पता नहीं है, लेकिन मेरे लिए अंगूठे का सामान्य नियम यह है कि काम की सुविधा और गति के लिए, ट्रैकिंग शाखाओं को क्रम में रखना बेहतर है।
mbdevpl

7

सुझाए गए समाधानgit branch -f branch-pointer-to-move new-pointer में TortoiseGit :

  • "गेट शो लॉग"
  • "सभी शाखाएँ" जांचें
  • उस लाइन पर जिसे आप चाहते हैं कि ब्रांच पॉइंटर (नया-पॉइंटर) पर चला जाए:
    • राइट क्लिक करें, "इस संस्करण में शाखा बनाएँ"
    • "शाखा" के पास, स्थानांतरित करने के लिए शाखा का नाम दर्ज करें (शाखा-सूचक-से-चाल)
    • "आधार पर" के तहत, जांचें कि नया सूचक सही है
    • चेक "फोर्स"
    • ठीक है

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


4

ईमानदारी से, मैं आश्चर्यचकित हूं कि git pushकमांड के बारे में किसी ने कैसे नहीं सोचा :

git push -f . <destination>:<branch>

डॉट (।) स्थानीय रिपॉजिटरी को संदर्भित करता है, और आपको -f विकल्प की आवश्यकता हो सकती है क्योंकि गंतव्य "अपने दूरस्थ समकक्ष के पीछे" हो सकता है ।

हालाँकि इस कमांड का उपयोग आपके सर्वर में आपके परिवर्तनों को सहेजने के लिए किया जाता है, लेकिन परिणाम ठीक उसी तरह होता है जैसे कि रिमोट ब्रांच ( <branch>) को उसी ब्रांच के लिए प्रतिबद्ध करते हुए ( <destination>)


आप यह भी कर सकते हैं कि -fस्थानीय कुछ भी क्लोबिंग से बचने के लिए; उदाहरण के लिए, git fetch origin && git push . origin/develop:developgit checkout develop && git pull --ff-only
मारट

1

फ़ाइल खोलें .git/refs/heads/<your_branch_name>, और वहां संग्रहीत हैश को उस स्थान पर बदलें जहां आप अपनी शाखा के प्रमुख को स्थानांतरित करना चाहते हैं। बस किसी भी टेक्स्ट एडिटर के साथ फाइल को एडिट और सेव करें। बस यह सुनिश्चित करें कि संशोधित करने वाली शाखा वर्तमान सक्रिय नहीं है।

डिस्क्लेमर: संभवत : इसे करने के लिए एक उचित तरीका नहीं है, लेकिन काम हो जाता है।


1
निश्चित नहीं है कि यह अराजक है या बुरा तरीका है। 🤔 Ke
कीथ रसेल

पी: @KeithRussell दोनों हो सकता है
गिलर्मो Gutiérrez

0

मामले में आप जिस बिंदु को इंगित करना चाहते हैं, वह वर्तमान शाखा से आगे है (जो तब तक होना चाहिए जब तक कि आप वर्तमान शाखा के अंतिम कमानों को पूर्ववत नहीं करना चाहते), आप बस कर सकते हैं:

git merge <commit>

यदि शाखा की जाँच नहीं की जाती है, तो क्या करना है, इस बारे में प्रश्न।
कीथ रसेल

उफ़, मुझे वह बात याद आ गई। उस मामले में आप git push . <commit>:<branch>पहले से ही सुझाए गए अनुसार कर सकते हैं ।
जीन पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.