मैंने अभी हाल ही में इस विषय पर ब्लॉग किया है:
हम इस सुविधा शाखा को कैसे अद्यतित रखते हैं? नवीनतम अपस्ट्रीम कमिट्स को मर्ज करना आसान है, लेकिन आप मर्ज कमिट बनाने से बचना चाहते हैं, क्योंकि इसे अपस्ट्रीम में धकेलने पर सराहना नहीं होगी: आप तब प्रभावी रूप से अपस्ट्रीम में बदलाव कर रहे हैं, और उन अपस्ट्रीम कमिट्स को एक नया हैश मिलेगा जैसा कि उन्हें एक नया अभिभावक मिलता है)। यह विशेष रूप से महत्वपूर्ण है, क्योंकि वे मर्ज किए गए कमिट आपके GitHub पुल अनुरोध में दिखाई देंगे, जब आप उन अपडेट को अपनी व्यक्तिगत GitHub सुविधा शाखा में धक्का देते हैं (भले ही आप पुल अनुरोध जारी करने के बाद भी ऐसा करते हों।)
इसलिए हमें विलय के बजाय रिबास करने की आवश्यकता है:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
दोनों रिबेट विकल्प और रीटेस कमांड को गिट करने के लिए आपके पेड़ को साफ रखेंगे, और मर्ज होने से बचें। लेकिन ध्यान रखें कि वे आपके पहले कमिट हैं (जिनके साथ आपने अपना पहला पुल अनुरोध जारी किया था) जिन्हें रिबूट किया जा रहा है, और जिनके पास अब एक नया कमिट हैश है, जो मूल हैश से अलग है जो अभी भी आपके दूरस्थ गिटब रेपो शाखा में हैं ।
अब, उन अद्यतनों को आपकी व्यक्तिगत GitHub सुविधा शाखा में धकेलने से यहाँ विफल हो जाएगा, क्योंकि दोनों शाखाएँ अलग-अलग हैं: स्थानीय शाखा वृक्ष और दूरस्थ शाखा वृक्ष "सिंक से बाहर" हैं, क्योंकि वे अलग-अलग हैश हैं। Git आपको पहले बताएगा git pull --rebase
, फिर फिर से धक्का देगा, लेकिन यह एक सरल फास्ट-फॉरवर्ड पुश नहीं होगा, क्योंकि आपका इतिहास फिर से लिखा गया है। ऐसा मत करो!
यहाँ समस्या यह है कि आप फिर से अपने पहले बदले गए कमिट्स को प्राप्त करेंगे क्योंकि वे मूल रूप से थे, और वे आपकी स्थानीय शाखा के शीर्ष पर विलीन हो जाएंगे। आउट-ऑफ-सिंक स्थिति के कारण, यह पुल साफ रूप से लागू नहीं होता है। आपको एक टूटा हुआ इतिहास मिलेगा जहाँ आपके कमिट दो बार दिखाई देंगे। जब आप इन सभी को अपनी GitHub सुविधा शाखा में धकेलेंगे, तो वे परिवर्तन मूल पुल अनुरोध पर परिलक्षित होंगे, जो बहुत, बहुत बदसूरत हो जाएंगे।
AFAIK, वास्तव में इसका कोई पूरी तरह से साफ समाधान नहीं है। मुझे जो सबसे अच्छा समाधान मिला वह है अपनी स्थानीय शाखा को अपनी GitHub शाखा में धकेलने के लिए (वास्तव में एक गैर-फास्ट-फॉरवर्ड अपडेट को मजबूर करना):
प्रति-धक्का के अनुसार (1):
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
तो खींचो मत, बस इस तरह से जोर लगाओ:
git push svg +user-non-unique
या:
git push svg user-non-unique --force
यह वास्तव में स्पष्ट रूप से आपकी दूरस्थ शाखा को अधिलेखित करेगा, आपकी स्थानीय शाखा में सब कुछ के साथ। जो कम्फ़र्ट रिमोट स्ट्रीम में होते हैं (और फेल होने के कारण) वहीं बने रहेंगे, लेकिन कमिटिंग कमिट्स होंगे, जो अंततः git-gc (1) द्वारा डिलीट हो जाएंगे। कोई बड़ी बात नहीं।
जैसा कि मैंने कहा, यह AFAICS सबसे साफ समाधान है। इसका नकारात्मक पक्ष यह है कि आपके पीआर को उन नवीनतम कमिटों के साथ अपडेट किया जाएगा, जिन्हें बाद की तारीख मिलेगी, और पीआर के कमेंट हिस्ट्री में सिंक के बाहर दिखाई दे सकते हैं। कोई बड़ी समस्या नहीं है, लेकिन यह संभवतः भ्रामक हो सकता है।