मैं एक गीदड़ नंगे रिपॉजिटरी में अंतिम प्रतिबद्ध को कैसे अनफिट कर सकता हूं?


91

इस बात को ध्यान में रखते हुए कि कई git कमांड हैं जो नंगे रिपॉजिटरी में कोई मतलब नहीं रखते हैं (क्योंकि नंगे रिपॉजिटरी इंडेक्स का उपयोग नहीं करते हैं और वर्किंग डायरेक्टरी नहीं है)

git reset --hard HEAD^ 

इस तरह के भंडार में अंतिम परिवर्तन को हल करने के लिए एक समाधान नहीं है।

इंटरनेट के माध्यम से खोजा जा रहा है, सब मैं विषय से संबंधित मिल सकता है इस है, जिसमें मैं यह कर के तीन तरीके प्रस्तुत कर रहा हूँ:
1. "मैन्युअल रूप से रेफरी अद्यतन (जो पाइपलाइन शामिल है)";
2. " git push -fएक गैर-नंगे भंडार से";
3. " git branch -f this $that"।

यो उपाय को कौन सा उपाय अधिक उचित लगता है या ऐसा करने के अन्य तरीके क्या हैं? दुर्भाग्य से, मैंने जो दस्तावेज़ नंगे रिपॉजिटरी के बारे में पाया वह काफी खराब है।


8
@ Lavinia-Garbriela Dobrovol नीचे जटिल सामग्री का उपयोग न करें। आप HEAD को एक अलग कमिट में स्थानांतरित करने का प्रयास कर रहे हैं और यही वह स्थिति है जिसके लिए रीसेट रीसेट का इरादा नंगे रेपो में भी है। नीचे मेरे जवाब के अनुसार, उपयोग करें: git रीसेट --soft <प्रतिबद्ध> With --soft के साथ, आप एक काम करने वाले पेड़ और सूचकांक को बदलने की कोशिश नहीं करते हैं जो मौजूद नहीं है, इसलिए गिट आपको रीसेट करने में कोई समस्या नहीं होने देता है।
हेजोक

जवाबों:


130

आप git update-refकमांड का उपयोग कर सकते हैं । अंतिम प्रतिबद्ध हटाने के लिए, आप उपयोग करेंगे:

$ git update-ref HEAD HEAD^

या यदि आप उस शाखा में नहीं हैं, जहाँ से आप अंतिम प्रतिबद्ध को हटाने के लिए कैंट कर सकते हैं:

$ git update-ref refs/heads/branch-name branch-name^

यदि आप चाहते हैं तो आप एक sha1 भी पास कर सकते हैं:

$ git update-ref refs/heads/branch-name a12d48e2

Git-update-ref कमांड का प्रलेखन देखें ।


@ Lavinia-Gabriela Dobrovolschi: सही है, मैं सटीक वाक्यविन्यास से परिचित नहीं था।
VonC

@VonC आप git update-ref <ref> <newvalue>उदाहरण के लिए, उदाहरण के लिए, " रेफ / हेड / मास्टर" की तरह, सही शाखा होने के लिए <ref> निर्दिष्ट कर सकते हैं । मुझे आशा है कि मैंने आपके प्रश्न को गलत नहीं समझा।
लाविनिया-गैब्रिएला डोब्रोवोल्स्की 13

@ सिल्वैन: +1 अच्छा संपादन। @ लाविनिया-गैब्रिएला डोब्रोवोल्स्की ने आपको पूर्वाग्रहों के लिए धन्यवाद दिया। यह बहुत अधिक व्यावहारिक है (यदि आपके पास दूरस्थ सर्वर तक सीधी पहुंच है, तो मुझे लगता है)।
VonC

3
उदाहरण branch-nameतर्क के संबंध में भ्रामक हैं । update-ref"शाखा" के साथ उपयोग करते समय आपको शाखा का पूरा रेफरी नाम निर्दिष्ट करना चाहिए (यानी refs/heads/सामान्य छोटी शाखा के नाम से पहले से बताएं )। यदि आप केवल संक्षिप्त नाम का उपयोग करते हैं तो आप $GIT_DIR/branch-nameइसके बजाय बनाना / अपडेट करना समाप्त कर देंगे $GIT_DIR/refs/heads/branch-name। दोनों का अस्तित्व branch-nameऔर refs/heads/branch-name"प्रतिमान ... अस्पष्ट है" चेतावनी का कारण होगा।
क्रिस जॉन्सन

यह जवाब बहुत अधिक जटिल है तो ज़च ने क्या प्रस्तावित किया। और उसका समाधान ठीक काम करता है।
क्रिस्टियन

32

यदि आप नंगे रेपो में निम्नलिखित का उपयोग करते हैं:

git reset --soft <commit>

उसके बाद आप नंगे रेपो में आपके द्वारा उपयोग किए जा रहे मुद्दों --hardऔर --mixedविकल्पों में नहीं चलते हैं क्योंकि आप नंगे रेपो को बदलने की कोशिश नहीं कर रहे हैं (यानी काम करने वाले पेड़ और सूचकांक)। आपके मामले में विशेष रूप से आप (नंगे रेपो से) का उपयोग करना चाहेंगे:

git reset --soft HEAD^

दूरस्थ रेपो पर शाखाओं को स्विच करने के लिए:

git symbolic-ref HEAD refs/heads/<branch_name>

वर्तमान चयनित शाखा उपयोग देखने के लिए:

git symbolic-ref HEAD

https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html


3
आप उस शाखा का चयन कैसे करते हैं जिसे आप स्थानांतरित करना चाहते हैं? आपका उदाहरण मास्टर पर ठीक काम करता है लेकिन git checkout other_branchनंगे में काम नहीं करता है।
गॉथियर

1
हम्म् ... मैं सोच रहा हूं कि इस पर मुझे किसने वोट दिया। सवाल यह नहीं पूछा कि रिमोट रेपो पर शाखाओं को कैसे स्विच किया जाए, यह पूछा गया कि नंगे रेपो पर कैसे रीसेट किया जाए। किसी दूरस्थ रेपो में डिफ़ॉल्ट शाखा को बदलने के लिए, git प्रतीकात्मक-रेफ HEAD refs / heads / <branch_name> का उपयोग करें।
हजोक

7

git push -fठीक से काम करना चाहिए:
अगर आपको लगता है कि नंगे रेपो क्लोन, हटाने पिछले प्रतिबद्ध ( git reset --hard HEAD^के रूप में आप का उल्लेख है, लेकिन एक स्थानीय गैर-नंगे रेपो में) और धक्का वापस ( -f):

  • आप किसी भी SHA1 को उस दूसरे कमिट के लिए नहीं बदलते हैं जिसे आप हटाते हैं।
  • आप सुनिश्चित हैं कि आप नंगे रेपो माइनस की सटीक सामग्री को अतिरिक्त कमिट पर वापस धकेल देते हैं (क्योंकि आपने इसे पहले क्लोन किया था)।

@ VonC हाय वॉन, मैंने देखा है कि आपने Git पर बहुत सारे git reset --soft <sha1>उत्तर दिए हैं , इसलिए आपसे पूछना चाहता हूं ... मैं उत्सुक था, मेरे जवाब में ऐसा क्यों नहीं दिखाया जाएगा जो नंगे रेपो पर HEAD को चलाने के लिए अनुशंसित अभ्यास हो?
हज़ोक

मुझे लगता है कि एक और कारण मुझे लगता है कि नंगे रेपो के लिए सॉफ्ट रीसेट का उपयोग करना ऐसी जानकारी नहीं है जो आसानी से उपलब्ध हो और कई मंचों पर अनावश्यक रूप से जटिल वर्कअराउंड लगता है जब यह लगता है कि सॉफ्ट रीसेट कम से कम टाइपिंग और कम से कम मौका के कारण सबसे अच्छा अभ्यास है त्रुटि के लिए।
हजोक

2
@Zach: एक reset --softनंगे रेपो पर सीधे काम करना चाहिए। मुझे संदेह है कि यह शायद ही कभी किया गया है क्योंकि एक नंगे रेपो आम तौर पर एक अपस्ट्रीम रेपो (यानी एक रेपो जिससे आप डेटा को धक्का दे रहे हैं), और अधिकांश समय, आपके पास इसका सीधा स्थानीय उपयोग नहीं होता है। लेकिन अगर आप करते हैं, तो यह निश्चित रूप से आपके reset --softउपयोग का एक और अच्छा उदाहरण है (जैसा कि stackoverflow.com/questions/5203535/… ) So +1 आपके उत्तर के लिए।
VonC

2

आप git refspec संकेतन का उपयोग कर सकते हैं और ऐसा कुछ कर सकते हैं:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

यह गंतव्य शाखा का अद्यतन करता है (जैसे कि रेफरी द्वारा दर्शाया गया) +<object ref>भाग द्वारा निरूपित स्रोत के लिए ।


2
सिवाय इसके कि जब शाखा में एक एसीएल होता है - जो आमतौर पर ऐसा होता है यदि आपको "नंगे रेपो पर ही करने की आवश्यकता होती है" ...
डेविड श्मिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.