2010-07-07 20 views

उत्तर

971

हटाएँ हाल ही में प्रतिबद्ध है, काम आपके द्वारा किए गए रखते हुए:

git reset --soft HEAD~1 

, काम को नष्ट करने के लिए प्रतिबद्ध सबसे हाल ही में हटाएं आपके द्वारा किए गए:

git reset --hard HEAD~1 
+5

सुनिश्चित करें कि हेड शाखा में इंगित कर रहा है .. (इसे पहले देखें) –

+54

और सुनिश्चित करें कि हेड ~ 1 प्रतिबद्ध है ... आप 'गिट रीसेट - हार्ड मूल' – Daenyth

+7

थॉट 'गिट रिमोट' मेरे लिए मूल सूची, 'गिट रीसेट - हार्ड मूल' कहता है 'घातक: संदिग्ध तर्क' उत्पत्ति ': अज्ञात संशोधन या पथ काम करने वाले पेड़ में नहीं।'। क्यूं कर? – trss

9

एक कार्य करें git rebase -i FAR_ENOUGH_BACK और उस प्रतिबद्धता के लिए लाइन ड्रॉप करें जिसे आप नहीं चाहते हैं।

+0

कर पाया जा सकता है यह इतना बेहतर है! पुनर्जन्म से डरो मत! – Chris

6

आप प्रश्न में प्रतिबद्ध है, ले जाने के लिए है कि एक और शाखा के लिए प्रतिबद्ध मिल SHA

git rev-parse HEAD 

तो वर्तमान शाखा

git checkout other-branch 

और cherry-pickother-branch

के लिए प्रतिबद्ध स्विच चाहते हैं
git cherry-pick <sha-of-the-commit> 
+0

मेरे अनुभव से, यह मूल शाखा से प्रतिबद्धता को पूर्ववत नहीं करता है, इस प्रकार 'गीट रीसेट - हार्ड ~ 1' बाद में जरूरी है। मुझे लगता है कि 'रीसेट - सॉफ्ट' का उपयोग करके शाखाओं को स्विच करना और फिर से काम करना अतिरिक्त काम बचा लेगा। फिर फिर मैं अपनी अधिकांश मूलभूत सामग्री करने के लिए SourceTree का उपयोग कर रहा था, केवल मेरी त्रुटि के बाद इसे इसके साथ कमांड लाइन कर रहा था। – jusopi

43

इसे हटाएं नहीं: केवल एक प्रतिबद्ध git cherry-pick पर्याप्त है।

लेकिन अगर आप गलत शाखा पर कई करता था, वह यह है कि जहां git rebase --onto चमकता:

मान लीजिए आप इस राशि:

x--x--x--x <-- master 
      \ 
      -y--y--m--m <- y branch, with commits which should have been on master 

, तो आप master चिह्नित कर सकते हैं और इसे स्थानांतरित जहां बनना चाहते हैं:

git checkout master 
git branch tmp 
git checkout y 
git branch -f master 

x--x--x--x <-- tmp 
      \ 
      -y--y--m--m <- y branch, master branch 

, वाई शाखा को रीसेट करें जहां यह होना चाहिए:

git checkout y 
git reset --hard HEAD~2 # ~1 in your case, 
         # or ~n, n = number of commits to cancel 

x--x--x--x <-- tmp 
      \ 
      -y--y--m--m <- master branch 
       ^
       | 
       -- y branch 

, और अंत में अपने प्रतिबद्ध (उन्हें पुन: लागू, वास्तव में नए प्रतिबद्ध बनाने)

git rebase --onto tmp y master 
git branch -D tmp 


x--x--x--x--m'--m' <-- master 
      \ 
      -y--y <- y branch 
2

आपके संदर्भ के लिए ले जाते हैं, मेरा मानना ​​है कि आप कर सकते हैं "हार्ड कट" अपने वर्तमान शाखा में से केवल के साथ नहीं करता है Git --hard रीसेट, लेकिन यह भी निम्न आदेश के साथ:

git checkout -B <branch-name> <SHA> 

वास्तव में, यदि आप बाहर की जाँच के बारे में परवाह नहीं है, आप शाखा जो कुछ भी आप के साथ चाहते हैं करने के लिए सेट कर सकते हैं:

git branch -f <branch-name> <SHA> 

उदाहरण के लिए, यह एक शाखा से काम को हटाने के लिए एक प्रोग्रामेटिक तरीका होगा, ताकि नए कामों को प्रतिलिपि बनाने के लिए (रीबेस का उपयोग कर)।

मान लीजिए कि आपके पास ऐसी शाखा है जो मास्टर से डिस्कनेक्ट हो गई है क्योंकि आपने किसी अन्य स्थान से स्रोत ले लिए हैं और इसे शाखा में छोड़ दिया है।

अब आपके पास एक शाखा है जिसमें आपने परिवर्तन लागू किए हैं, चलिए इसे "विषय" कहते हैं।अब

git branch topic_duplicate topic 
git rebase --onto dump master topic_duplicate 

अपने परिवर्तनों के आधार शाखा topic_duplicate में फिर से लागू कर रहे हैं:

अब आप अपने विषय शाखा का डुप्लिकेट पैदा करेगा और उसके बाद स्रोत कोड डंप कि शाखा में बैठा होता है पर इसे rebase "डंप" "डंप" का प्रारंभ बिंदु लेकिन केवल "मास्टर" के बाद से हुआ यह काम करता है। तो मास्टर के बाद से आपके परिवर्तन अब "डंप" के शीर्ष पर पुनः लागू किए गए हैं लेकिन परिणाम "topic_duplicate" में समाप्त होता है।

फिर आप ऐसा करके "topic_duplicate" के साथ "डंप" की जगह सकता है: बस

git branch -D dump 

शायद आप कर सकते थे डंप को त्यागकर द्वारा

git branch -f dump topic_duplicate 
git branch -D topic_duplicate 

या

git branch -M topic_duplicate dump 

या साथ वर्तमान "topic_duplicate" को साफ़ करने के बाद भी चेरी-पिक करें।

मैं क्या कहने की कोशिश कर रहा हूँ कि अगर आप वर्तमान अद्यतन करना चाहते "नकल" शाखा आप पहली बार हटाना होगा पहले "cherrypicked" एक अलग पूर्वज के आधार पर एक git reset --hard <last-commit-to-retain> या git branch -f topic_duplicate <last-commit-to-retain> कर और फिर दूसरे को कॉपी करके करता है या तो रिबिसिंग या चेरी-पिकिंग द्वारा (मुख्य विषय शाखा से) पर काम करता है।

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

cherrypicking बहुत आसान है:

git reset --hard <latest-commit-to-keep> 
git cherry-pick master..topic 

जब अपने विषय-डुप्लिकेट शाखा की जाँच कर दिया गया है

git cherry-pick master..topic 

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

तो बस प्रदर्शित करने के लिए:

  • रीसेट करने के लिए एक अलग करने के लिए अपने शाखा बिंदु कर देगा (--hard भी सूचकांक में पिछले प्रतिबद्ध, --soft जोड़ा रहता फ़ाइलें बाहर की जाँच करता है (कि प्रतिबद्ध होना होगा यदि आप फिर से प्रतिबद्ध) और डिफ़ॉल्ट (--mixed) की जाँच नहीं होंगे पिछले प्रतिबद्ध (अपने स्थानीय परिवर्तन पोंछते) लेकिन यह सूचकांक साफ हो जाएगा (अभी तक कुछ नहीं प्रतिबद्ध)
  • तुम सिर्फ एक शाखा मजबूर कर सकते हैं के लिए जोड़ दिया गया है एक अलग करने के लिए बात करने के लिए प्रतिबद्ध
  • आप ऐसा करते हुए तुरंत बाहर की जाँच कर सकते हैं कि रूप में अच्छी तरह प्रतिबद्ध
  • रिबेसिंग पर काम करता है अपने वर्तमान शाखा में मौजूद करता
  • चेरी पिकिंग

आशा एक अलग शाखा से की प्रतिलिपि को यह किसी को मदद करता है मतलब है। मैं इसे फिर से लिखने का मतलब था, लेकिन अब मैं प्रबंधन नहीं कर सकता। सादर।

0

आप (.git फ़ोल्डर सहित) अपने कोड का बैकअप है, तो अपने नवीनतम codebase से .git फ़ोल्डर हटाना। पुराने कोडेबेस में पुराना .git फ़ोल्डर कॉपी करें। git pull निष्पादित करें।

नोट: इस समाधान केवल यदि आप समय से बाहर चल रहे हैं और एक बहुत भ्रमित कर रहे हैं का उपयोग करें।

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