2012-12-19 13 views
19

मैं अभी भी गिट के (मूलभूत) बेहतर अंक सीखने की कोशिश कर रहा हूं और खुद को परेशानी में डाल पाया है। मुझे एहसास हुआ कि मैंने सिर पर कुछ गलतियां की हैं, एक पुरानी प्रतिबद्धता की जांच की है और वहां से कोडिंग शुरू कर दी है। जब मैं धक्का का प्रयास करता हूं तो मुझे बताया जाता है कि मेरी वर्तमान प्रतिबद्धता पीछे है और मुझे सिर के साथ विलय करने की जरूरत है। गिट "गिट पुल" की सिफारिश करता है। हालांकि, हेड में वह कोड है जिसे मैं अनदेखा करना चाहता हूं। मैं इस समस्या का समाधान कैसे कर सकता हूं। मदद के लिए बहुत बहुत धन्यवाद।मैं गिट में एक पुरानी प्रतिबद्धता कैसे कर सकता हूं?

फ़्लोचार्ट:

-------- HEAD (bad) ---------------------- + (behind conflict, requires 
    \         / merge with HEAD, which is 
     \------- Current commit (good) ----/ bad and needs to be ignored) 

उत्तर

9

अपने भंडार अन्य लोगों द्वारा इस्तेमाल नहीं किया जा रहा है, तो आप सुरक्षित रूप से git push -f कर सकते हैं दूरस्थ शाखा अधिलेखित करने के लिए।

+6

-1: 'गिट पुश-एफ' वास्तव में "सुरक्षित रूप से" के साथ नहीं जाता है ... मेरा सुझाव है कि आप या तो नुकसान को स्पष्ट करें, या "देखभालफू" जैसे किसी शब्द को बदलें लिली "- विपरीत अर्थ। – ANeves

+1

@ एनेव्स मैं अपने शब्द से खड़ा हूं। यदि आप रिपोजिटरी का उपयोग करने वाले एकमात्र व्यक्ति हैं तो यह पूरी तरह से सुरक्षित है। उनका इरादा इरादा है कि मूल रूप से शाखा के मौजूदा राज्य को अपने स्थानीय काम के साथ ओवरराइट करें। यह * बिल्कुल * 'गिट पुश-एफ' का उद्देश्य है। – meagar

+1

मुझे लगता है कि ऐसा लगता है कि उसे सिर्फ 'push -f' की आवश्यकता है। –

2

एनीव्स सही है, "गिट पुश-एफ" केवल काम करता है क्योंकि आप रिपोजिटरी का उपयोग करने वाले एकमात्र व्यक्ति थे। यह ज्यादातर लोगों के लिए एक स्वीकार्य समाधान नहीं है।

आपके वर्तमान प्रतिबद्ध इतिहास है:

---A-B < HEAD (bad) 
    \ 
    C < my_branch (good) 

यह समाधान आप चाहते है: How do I 'overwrite', rather than 'merge', a branch on another branch in Git?

सारांश यह है

git checkout my_branch 
git merge -s ours HEAD 

यह सिर की शाखा पर सारे बदलाव stomp होगा, और आपको निम्नलिखित देता है:

--A-B-D < HEAD, my_branch (both good) 
    \/
    C 

डी प्रभावी रूप से इस मामले में सी के समान ही है, इसमें केवल अलग-अलग माता-पिता हैं।

+0

'हेड' का प्रयोग न करें। यह 'हमारी पुरानी शाखा' विलय होना चाहिए। जब आप चेकआउट करते हैं तो HEAD बदल जाता है। –

15

यहाँ आप क्या कर सकते हैं:

git checkout <branch-to-modify-head> 
git reset --hard <commit-hash-id-to-put-as-head> 
git push -f 

आप पुश बल नहीं है, Git इस त्रुटि फेंक देगा: अपडेट अस्वीकार कर दिया गया है क्योंकि अपने वर्तमान शाखा की नोक के पीछे है।

ध्यान दें कि यह आपके गिट इतिहास को छेड़छाड़ करेगा, इसलिए ऐसा करने का एक और तरीका प्रत्येक प्रतिबद्धता को वापस कर रहा है जिसे आप नहीं चाहते हैं। इस तरह आप अपने इतिहास को बनाए रखें:

git revert commit-id 

चीयर्स

4

तरह से मैं यह कर रहा है:

git reset --hard <commit-SHA> 
git push origin HEAD:<name-of-remote-branch> 

यह रास्ता Git की सिफारिश की गई है और git push -f करने में हर किसी के लिए एक छोटे से समस्याग्रस्त किया जा सकता है विकास दल

संबंधित मुद्दे

 संबंधित मुद्दे