2010-02-11 14 views
328

मैं अपने प्रोजेक्ट की पहली प्रतिबद्धता में कुछ बदलना चाहता हूं जिसमें सभी आगामी कामों को खो दिया जा सके। क्या इसे करने का कोई तरीका है?गिट के साथ परियोजना की पहली प्रतिबद्धता बदलें?

मैंने गलती से स्रोत कोड के भीतर एक टिप्पणी में मेरी कच्चे ईमेल सूचीबद्ध है, और के रूप में मैं GitHub का अनुक्रमण बॉट से स्पैम हो रही मैं इसे बदलना चाहते हैं।

उत्तर

484

ecdpalmabelow ने उल्लेख किया git rebase के लिए, git 1.7.12+ (अगस्त 2012) विकल्प --root में इजाफा किया है मिल सकता है:

"git rebase [-i] --root $tip" अब रूट इतिहास में "$tip" के लिए अग्रणी सभी इतिहास को फिर से लिखने के लिए उपयोग किया जा सकता है।

नए व्यवहार शुरू में discussed here था:

मैं व्यक्तिगत रूप से लगता है कि "git rebase -i --root" बस "--onto" की आवश्यकता के बिना काम करने के लिए और आप करते हैं "संपादित करें" यहां तक ​​कि इतिहास में पहली से एक बना दिया जाना चाहिए।
यह समझ में आता है कि कोई भी परेशान नहीं होता है, क्योंकि लोग अन्यथा की तुलना में इतिहास की शुरुआत के बहुत पीछे फिर से लिखते हैं।

patch followed


(मूल जवाब, फरवरी 2010)

Git FAQ (और इस SO question) में उल्लेख किया है, विचार है:

  1. नए अस्थायी शाखा बनाएं
  2. करने के लिए इसे रिवाइंड क्या आप git reset --hard
  3. का उपयोग करके बदलना चाहते हैं कि प्रतिबद्धता बदलें (यह वर्तमान HEAD के शीर्ष पर होगा, और आप कर सकते हैं बदल के लिए प्रतिबद्ध शीर्ष पर किसी भी फ़ाइल की सामग्री)
  4. रिबेस शाखा को संशोधित का उपयोग कर:

    git rebase --onto <tmp branch> <commit after changed> <branch>` 
    

चाल यकीन है कि जानकारी आप हटाने के लिए एक से पुनः शुरू नहीं कर रहा है चाहता हूँ बाद में प्रतिबद्ध होना है आपकी फाइल में कहीं और। यदि आपको संदेह है, तो आपको यह सुनिश्चित करने के लिए filter-branch --tree-filter का उपयोग करना होगा कि उस फ़ाइल की सामग्री में समझदार जानकारी किसी भी प्रतिबद्धता में शामिल न हो।

दोनों मामलों में, आप हर की SHA1 पुनर्लेखन प्रतिबद्ध है, इसलिए सावधान रहना है, तो आप पहले से ही शाखा आप की सामग्री को संशोधित कर रहे हैं प्रकाशित किया है अंत।आपको शायद तब तक ऐसा नहीं करना चाहिए जब तक कि आपकी परियोजना अभी तक सार्वजनिक नहीं है और अन्य लोगों ने उन चीजों से काम नहीं किया है जिन्हें आप फिर से लिखना चाहते हैं।

+4

पर ओएस एक्स माउंटेन शेर प्रणाली से स्थापित Git 1.7.9.6 के साथ उपयोग कर सकते हैं (एप्पल Git-31.1) मैं सेट '<के बाद बदल प्रतिबद्ध>' करने के लिए एक ही हैश मैं 'गीट रीसेट - हार्ड' कमांड में इस्तेमाल किया। उस मामूली परिवर्तन के अलावा, यह रिपो में सभी कामों में लेखक की जानकारी को अपडेट करने के लिए खूबसूरती से काम करता है। – berto

+4

क्या आप $ टिप क्या होना चाहिए इसका उदाहरण प्रदान कर सकते हैं। 'गिट rebase -i --root' मेरे लिए काम किया। –

+0

@ रेमीबेनोइट हां, '$ टिप 'कोई भी प्रतिबद्धता हो सकती है जो आप चाहते हैं। 'मास्टर' (जिसका मतलब है 'मास्टर हेड' प्रतिबद्ध) ठीक है। – VonC

0

आप बदलना चाहते हैं तो केवल पहली, प्रतिबद्ध आप Git रिबेस कोशिश करते हैं और संशोधन के लिए प्रतिबद्ध है, जो इस पोस्ट के लिए इसी तरह की है हो सकता है: How to modify a specified commit in git?

और तुम सब करता जो कच्चे शामिल संशोधित करना चाहते हैं, तो ईमेल, फ़िल्टर-शाखा सबसे अच्छी पसंद है। वहाँ कैसे पुस्तक प्रो Git पर विश्व स्तर पर ईमेल पता परिवर्तित करने का एक उदाहरण है, और आप इस लिंक उपयोगी http://git-scm.com/book/en/Git-Tools-Rewriting-History

71

git rebase -i आपको रूट प्रतिबद्धता को छोड़कर किसी भी पिछले काम, को आसानी से संपादित करने की अनुमति देता है। निम्न आदेश आपको दिखाते हैं कि इसे मैन्युअल रूप से कैसे करें।

# tag the old root, "git rev-list ..." will return the hash of first commit 
git tag root `git rev-list HEAD | tail -1` 

# switch to a new branch pointing at the first commit 
git checkout -b new-root root 

# make any edits and then commit them with: 
git commit --amend 

# check out the previous branch (i.e. master) 
git checkout @{-1} 

# replace old root with amended version 
git rebase --onto new-root root 

# you might encounter merge conflicts, fix any conflicts and continue with: 
# git rebase --continue 

# delete the branch "new-root" 
git branch -d new-root 

# delete the tag "root" 
git tag -d root 
+10

मैंने इन निर्देशों का पालन किया जैसे कि n00b और उन्होंने पूरी तरह से काम किया - धन्यवाद! हो सकता है कि आप '-a' को 'git commit --amend'' या 'git add'' का उपयोग करके उल्लेख करना चाहें क्योंकि मैं पहली बार भूल गया था! –

+1

यह अब सत्य नहीं है, कृपया स्वीकृत उत्तर –

+0

देखें, आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैं एक Centos 7 का उपयोग कर रहा हूं और गिट संस्करण 1.7.1 कमांड पर बहुत सी सीमाओं के साथ है। स्वीकृत उत्तर मेरे लिए काम नहीं करता है और यह _ ** ** ** ** ** ** ** ** –

126

रूप 1.7.12 Release Notes में कहा गया है, तो आप

$ git rebase -i --root 
+2

गिट संस्करण 1.7.9 शिकायत से भंडार इतिहास के पुनर्निर्माण के लिए एक आकर्षण की तरह काम करता है: 'आपको निर्दिष्ट करना होगा - -onto का उपयोग करते समय --root' –

+2

यह गिट 1.9.4 –

+2

के साथ ठीक काम करता है, गिट 1.9.4 का उपयोग करके भी मेरे लिए अद्भुत काम करता है। –

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