2012-03-21 11 views
192

मजबूर मैं सिर्फ git rebase के साथ कुछ करता कुचल और एक git push --force (जो बुराई है, मुझे पता है) किया था।Git पुल के बाद अद्यतन

अब अन्य सॉफ्टवेयर इंजीनियर एक अलग इतिहास है और जब वे एक git pull करते हैं, Git मर्ज हो जाएंगे। rm my-repo; git clone [email protected]:my-repo.git को छोड़कर, इसे ठीक करने का कोई तरीका है?

मुझे git push --force के विपरीत कुछ चाहिए, लेकिन git pull --force ने इच्छित परिणाम नहीं दिए।

+10

वे पूरी शाखा को हटाने के बिना अपनी शाखा को हटा सकते हैं और फिर भी इसे बना सकते हैं: 'गिट चेकआउट मास्टर और गिट शाखा-डी परीक्षण और गिट चेकआउट -बी परीक्षण मूल/परीक्षण' – Florian

+1

[संभावित गिट के लिए संभावित गलती खींचने पर स्थानीय फाइलों को ओवरराइट करें] (http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull) – gpoo

उत्तर

318

नई करता

git fetch 

प्राप्त करने के लिए रीसेट

आप एक स्थानीय git reset का उपयोग कर शाखा के लिए प्रतिबद्ध रीसेट कर सकते हैं।

एक स्थानीय शाखा के लिए प्रतिबद्ध बदलने के लिए:

git reset origin/master --hard 

हालांकि सावधान रहो, प्रलेखन कहते हैं के रूप में:

पुनः निर्धारित करता है सूचकांक और काम कर पेड़। काम कर पेड़ में ट्रैक फ़ाइलों में कोई बदलाव के बाद से < प्रतिबद्ध> छोड़ दिए जाते हैं।

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

रिबेस

आप किसी भी दूसरे के शीर्ष पर अपने स्थानीय प्रतिबद्ध पुनः चलाने कर सकते हैं प्रतिबद्ध/शाखा git rebase का उपयोग कर:

git rebase -i origin/master 

इस इंटरैक्टिव मोड में rebase जहां आप प्रत्येक लागू करने के लिए चुन सकते हैं लागू करेगा व्यक्तिगत प्रतिबद्धता जो इतिहास में नहीं है, आप शीर्ष पर वापस आ रहे हैं।

(git push -f के साथ) आप हटाया प्रतिबद्ध पहले से ही स्थानीय इतिहास में खींच लिया गया है, वे के रूप में करता है कि फिर से लागू कर दिया जाएगा सूचीबद्ध किया जाएगा - होगा की जरूरत है वे रिबेस के हिस्से के रूप में हटाए जाने के लिए या वे बस फिर हो जाएगा - शाखा के इतिहास में शामिल - और अगले धक्का पर रिमोट इतिहास में फिर से दिखाई दें।

उपयोग अधिक जानकारी और इसके बाद के संस्करण (या अन्य) आदेशों में से किसी पर उदाहरण के लिए मदद git command --help

+0

क्या होगा यदि उन्होंने पहले से ही कुछ स्थानीय काम किया है? – iblue

+0

@iblue सभी परिवर्तनों को खोने, प्रतिबद्ध इतिहास को हटाने, फ़ाइल में परिवर्तन को रखने, या नए सिर के शीर्ष पर प्रत्येक प्रतिबद्धता को लागू करने का प्रयास करने के बीच चयन करें। सबसे आसान विकल्प शायद एक मुलायम रीसेट है। – AD7six

+0

@iblue जब आपके सहयोगी 'गिट रीबसे मूल/मास्टर' का उपयोग करते हैं, और इसका मतलब है, वे पहले से ही कुछ प्रतिबद्ध थे, तो गिट आपके प्रतिबद्धता के पीछे अपनी प्रतिबद्धता लिखेंगे। – Tim

11

यह उन शाखाओं को ठीक नहीं करेगा जिनके पास पहले से कोड है जो आप नहीं चाहते हैं (नीचे ऐसा करने के लिए नीचे देखें), लेकिन अगर उन्होंने कुछ शाखा खींच ली है और अब इसे साफ करना चाहते हैं (और नहीं "आगे" मूल/कुछ शाखा की) तो आप बस:

git checkout some-branch # where some-branch can be replaced by any other branch 
git branch base-branch -D # where base-branch is the one with the squashed commits 
git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

नोट: फ्लोरियन एक टिप्पणी में यह उल्लेख किया है, लेकिन जो पढ़ता है: आप इन सभी उन दोनों के बीच & & डाल

टिप्पणी 2 से गठजोड़ कर सकते हैं उत्तर की तलाश करते समय टिप्पणियां?

नोट 3: यदि आपके पास दूषित शाखाएं हैं, तो आप नई "गूंगा शाखा" के आधार पर नए बना सकते हैं और केवल चेरी-पिक पर काम कर सकते हैं।

पूर्व:

git checkout feature-old # some branch with the extra commits 
git log     # gives commits (write down the id of the ones you want) 
git checkout base-branch # after you have already cleaned your local copy of it as above 
git checkout -b feature-new # make a new branch for your feature 
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want 
# repeat previous step for each commit id 
git branch feature-old -D # delete the old branch 

अब सुविधा-नया है अतिरिक्त (संभवतः खराब) के बिना अपने शाखा करता है!

+0

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

+0

@ पीटर-मॉर्टेंसन संपादन https://stackoverflow.com/help/editing के अनुसार पर्याप्त होना चाहिए –

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

  • कोई संबंधित समस्या नहीं^_^