एक जटिल इतिहास को साफ करने के लिए git rebase का उपयोग कैसे करें




merge (2)

एक जटिल इतिहास को साफ करने का सबसे अच्छा तरीका इतिहास रैखिक रखना है। आप ऐसा करते हैं कि फास्ट फ़ॉरवर्ड के अलावा किसी भी प्रकार के मर्ज से बचें।

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

$ 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

https://code.i-harness.com

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

! [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 rebase --interactive

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

रीसाइज़ सत्र से, आप जिस प्रकार के इतिहास की ज़रूरत होती है, उसके लिए आप गिट कमिट और स्क्वैश इतिहास को छू सकते हैं।







rebase