2010-06-11 8 views
8

आधा दर्जन विभिन्न शाखाओं और विलय के साथ कई हफ्तों तक काम करने के बाद, मेरे लैपटॉप और काम और घर पर मेरे डेस्कटॉप दोनों पर, मेरा इतिहास थोड़ा सा हो गया है। उदाहरण के लिए, मैंने अभी एक fetch किया, फिर मूल/मास्टर के साथ मास्टर विलय किया। अब, जब मैं Git शो-शाखाओं करते हैं, उत्पादन इस तरह दिखता है:एक गड़बड़ इतिहास को साफ करने के लिए गिट रिबेस का उपयोग कैसे करें

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

मैं एक Git रिबेस के साथ इस को साफ करना चाहते हैं। मैंने इस उद्देश्य के लिए एक नई शाखा, रीबेस-मास्टर बनाई, और इस शाखा पर गिट रिबेस < आम-पूर्वजों > की कोशिश की। हालांकि, मुझे कई संघर्षों को हल करना है, और शाखा रिबेस-मास्टर पर अंतिम परिणाम मास्टर पर संबंधित संस्करण से मेल नहीं खाता है, जिसका पहले से ही परीक्षण किया गया है और काम करता है!

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

मैं इस परियोजना पर एकमात्र डेवलपर हूं, इसलिए कोई और नहीं होगा जो प्रभावित होगा। , कि केवल है

git rebase --interactive 

लेकिन फिर से:

+9

;-) दार्शनिक नोट: इतिहास घुल जाता है। यह जीवन का तथ्य है। इससे छुटकारा मिले। –

उत्तर

5

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

रिबेस सत्र से, आप trimming Git commits and squash history कर सकते हैं, ताकि आप जिस प्रकार की इतिहास चाहते हैं उसे प्राप्त कर सकें।

+0

यह भी देखें http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC

+0

umm ... यह है रिमोट से खींचने के बिना बहुत मान्य है। आप आसानी से रीबेज कर सकते हैं -i (या मूल रूप से बहुत कुछ भी) स्थानीय शाखा, रिमोट शाखा, प्रतिबद्ध। – xenoterracide

10

एक ठोस इतिहास को साफ करने का सबसे अच्छा तरीका इतिहास रैखिक रखना है। आप तेजी से आगे के अलावा किसी भी प्रकार की विलय से बचकर ऐसा करते हैं।

कार्य प्रवाह इस तरह से चला जाता है।

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

जब शाखा को मास्टर में एकीकृत करने का समय हो, तो इसे विलय न करें। इसके बजाय, मास्टर के खिलाफ इस शाखा को दोबारा दोहराएं। इससे शाखा अब शाखा की तरह दिखाई देगी, लेकिन पेड़ के शीर्ष पर बस अधिक वृद्धि होगी। आप रिबेस के दौरान किसी मर्ज टकराव को हल करते हैं।

$ git fetch origin 
$ git rebase origin/master 

अब, शाखा को मास्टर में विलय करें। यह एक तेजी से आगे विलय होगा।

$ git checkout master 
$ git merge foobranch 

और अब कार्य को अपस्ट्रीम दबाएं।

$ git push 
संबंधित मुद्दे