चेकआउट के बिना चालू करने के लिए अन्य शाखा रीसेट करें


110

मैं अपने गिट वर्कफ़्लो के लिए कुछ स्क्रिप्ट लिख रहा हूँ।

मुझे दूसरी (मौजूदा) शाखा को वर्तमान चेकआउट के बिना रीसेट करने की आवश्यकता है।

इससे पहले:

 CurrentBranch: commit A
 OtherBranch: commit B

उपरांत:

 CurrentBranch: commit A
 OtherBranch: commit A

के बराबर

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(नोट --soft: मैं काम के पेड़ को प्रभावित नहीं करना चाहता।)

क्या यह संभव है?


क्या किसी को पता है कि क्या इजीत में भी यह संभव है?
जेडू

जवाबों:


84

आपके द्वारा वर्णित वर्कफ़्लोज़ समतुल्य नहीं हैं: जब आप प्रदर्शन करते हैं reset --hardतो आप कार्यशील पेड़ में सभी परिवर्तन खो देते हैं (आप इसे बनाना चाहते हैं reset --soft)।

आपको क्या चाहिए

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch

3
यार, मैं चाहता हूं कि यह शानदार के बिना काम करे refs/heads/...
ELLIOTTCABLE

41
ऐसा करने का एक अच्छा तरीका है git push . current:other। यह बिना refs/heads(/ cc @elliottcable) के काम करता है , और यह आपको चेक-आउट शाखा को अपडेट करने से भी रोकता है। ध्यान दें कि +current:otherयदि अपडेट तेज़-फ़ॉरवर्ड नहीं है तो आपको -f (या उपयोग ) करना होगा।
लिली बॉलर

4
आप कमांड -m 'some text'द्वारा दिखाए जाने वाले रेफरी अपडेट के कारण को रिकॉर्ड करने के लिए तर्क का उपयोग भी कर सकते हैं git reflog OtherBranch, जैसे कि "करंट क्रंच के लिए सिंक"। यह याद रखना उपयोगी होगा कि आपने इसे बाद में क्यों किया।
लेवी हास्केल

18
इसके बजाय आप अधिक क्लीनर (IMO) का उपयोग क्यों git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchया git push . CurrentBranch OtherBranchकब करेंगे git branch -f OtherBranch CurrentBranch? ( नीचे git शाखा पर मेरा जवाब देखें )
कॉलिन डी बेनेट

1
@BenHymers तो "पकड़ धक्का" के लिए आदमी पृष्ठ एक बहुत झूठ है। यह कमांड को "अपडेट रिमोट रिफल्स ..." के रूप में वर्णित करता है। जब वास्तव में यह ठीक स्थानीय refs अद्यतन कर सकते हैं।
काज

228

चलाने के otherbranchरूप में एक ही प्रतिबद्ध पर इंगित करने के लिए सेट करेंcurrentbranch

git branch -f otherbranch currentbranch

-f(बल) विकल्प बताता है git branch हाँ, मैं किसी भी मौजूदा अधिलेखित करने के लिए वास्तव में मतलब otherbranchनए के साथ संदर्भ

से प्रलेखन :

-फ
--फोर्स

यदि पहले से मौजूद है, तो रीसेट करें। बिना-एफआईटी शाखा एक मौजूदा शाखा को बदलने से इनकार करती है।


6
यह सबसे आसान उत्तर है। धन्यवाद!
रॉबर्ट कार्ल

मुझे fatal: Cannot force update the current branch.ऐसा करने की कोशिश करने पर मिलता है ।
फुआ सऊद

4
@FuadSaud ऐसा इसलिए है क्योंकि आपने पहले ही otherbranchजांच कर ली है। यह SO प्रश्न विशेष रूप से किसी अन्य शाखा को एक अलग कमिट में रीसेट करने के बारे में है (अर्थात चेक-आउट शाखा को रीसेट नहीं करना)। आप जो करना चाहते हैं वह वर्तमान शाखा को रीसेट git reset targetbranchकरने के लिए चालू शाखा को इंगित करने के लिए मजबूर करता है targetbranch--hardउस सामग्री में काम के पेड़ को मजबूर करने के लिए भी जोड़ें । या --softकेवल इंडेक्स को छोड़ने के लिए और केवल शाखा को ही बदल दें।
कॉलिन डी बेनेट

ठीक है, इसलिए, मैं रीसेट के बारे में जानता हूं। मैं जिस चीज की तलाश कर रहा था, वह एक रूटीन के अंदर, हमेशा बाहर की जाँच करने के लिए स्थानीय मास्टर को अपस्ट्रीम / मास्टर की ओर इशारा करती थी। मैंने सोचा branch -fकि ऐसा कर सकते हैं।
फवाद सऊद

9
इमो, यह स्वीकृत उत्तर होना चाहिए। यह मेरे वर्कफ़्लो में इतना सुधार हुआ!
घातक-गिटार

23

आप किसी भी समय इस कमांड को अपनी शाखाओं के साथ सिंक कर सकते हैं

$ git push . CurrentBranch:OtherBranch -f

इसके अलावा, अगर यह आदेशों के इस सेट को प्रतिस्थापित करता है

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

यह उपयोगी हो सकता है जब आपको CurrentBranch में अपनी सभी फ़ाइलों की आवश्यकता नहीं होती है और इसलिए आप दूसरी शाखाओं में नहीं जा सकते।


"रिमोट: एरर: नॉन-फास्ट-फॉरवर्ड" को अस्वीकार करने का कारण हो सकता है
बेसिल्वेस

3
मैं -fविकल्प शामिल नहीं करूंगा जब तक कि यह बिल्कुल अपरिहार्य न हो। यह मेरे मामले में इसके बिना अच्छी तरह से काम करता है।
मेलेबियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.