आप अपनी अपस्ट्रीम शाखा को अपनी devशाखा में मर्ज कर सकते हैं , एक कस्टम मर्ज ड्राइवर के साथ "KeepTheirs" :
देखें " " git merge -s theirs"आवश्यक" - लेकिन मुझे पता है कि यह मौजूद नहीं है "।
आपके मामले में, केवल एक की .gitattributesआवश्यकता होगी, और एक keepTheirsस्क्रिप्ट जैसी:
mv -f $3 $2
exit 0
git merge --strategy=theirs अनुकरण # १
पहले माता-पिता के रूप में अपस्ट्रीम के साथ मर्ज के रूप में दिखाता है।
Jefromi का उल्लेख है (टिप्पणियों में) merge -s ours, अपस्ट्रीम (या अपस्ट्रीम से शुरू होने वाली एक अस्थायी शाखा) पर अपने काम का विलय करके, और फिर उस विलय के परिणाम के लिए अपनी शाखा को तेज़ी से अग्रेषित करें:
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
इससे पहले अभिभावक के रूप में अपस्ट्रीम पूर्वज को रिकॉर्ड करने का लाभ होता है, ताकि मर्ज का अर्थ "इस विषय शाखा को नष्ट करने" के बजाय "इस आउट-ऑफ-डेट विषय शाखा को अवशोषित करें" और इसे अपस्ट्रीम से बदल दें ।
(2011 का संपादन):
ओपी द्वारा इस ब्लॉग पोस्ट में इस वर्कफ़्लो की सूचना दी गई है :
मुझे फिर से ऐसा क्यों चाहिए?
जब तक मेरे रेपो का सार्वजनिक संस्करण से कोई लेना-देना नहीं था, तब तक यह सब ठीक था, लेकिन अब चूंकि मैं अन्य टीम के सदस्यों और बाहर के योगदानकर्ताओं के साथ WIP पर टकराने की क्षमता चाहता हूं, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मेरी सार्वजनिक शाखाएं हैं दूसरों के लिए ब्रांच को बंद करने और खींचने से विश्वसनीय, यानी कोई और रिबास और उन चीजों पर रीसेट न करें जिन्हें मैंने रिमोट बैकअप पर धकेल दिया है, क्योंकि यह अब GitHub और पब्लिक पर है।
इसलिए मुझे छोड़ देना चाहिए कि मुझे कैसे आगे बढ़ना चाहिए।
99% समय मेरी कॉपी अपस्ट्रीम मास्टर में जाएगा, इसलिए मैं अपने मास्टर को काम करना चाहता हूं और ज्यादातर समय अपस्ट्रीम में धकेलना चाहता हूं।
लेकिन हर बार एक समय में, मेरे पास जो wipकुछ भी है वह अमान्य हो जाएगा जो ऊपर की तरफ जाता है और मैं अपना कुछ हिस्सा छोड़ दूंगा wip।
उस बिंदु पर मैं अपने गुरु को अपस्ट्रीम के साथ सिंक में वापस लाना चाहता हूं, लेकिन अपने सार्वजनिक रूप से धक्का दिए गए मास्टर पर किसी भी प्रतिबद्ध बिंदु को नष्ट नहीं करता। Ie मैं अपस्ट्रीम के साथ एक मर्ज चाहता हूं जो कि बदलाव के साथ समाप्त होता है जो मेरी कॉपी को अपस्ट्रीम के समान बनाता है ।
और यही करना git merge --strategy=theirsचाहिए।
git merge --strategy=theirs सिमुलेशन # 2
पहले माता-पिता के रूप में हमारे साथ, एक मर्ज के रूप में दिखाता है।
( jcwenger द्वारा प्रस्तावित )
git checkout -b tmp upstream
git merge -s ours thebranch # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs सिमुलेशन # 3
इस ब्लॉग में उल्लेख है :
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
कभी-कभी आप ऐसा करना चाहते हैं, और इसलिए नहीं कि आपके पास अपने इतिहास में "बकवास" है, बल्कि शायद इसलिए कि आप एक सार्वजनिक भंडार में विकास के लिए आधार रेखा को बदलना चाहते हैं, जहां रिबासिंग से बचा जाना चाहिए ।
git merge --strategy=theirs सिमुलेशन # 4
(वही ब्लॉग पोस्ट)
वैकल्पिक रूप से, यदि आप स्थानीय अपस्ट्रीम शाखाओं को तेजी से आगे रखना चाहते हैं, तो एक संभावित समझौता इस समझ के साथ काम करना है कि फुट / अस्थिर के लिए, अपस्ट्रीम शाखा समय-समय पर रीसेट / विद्रोहित हो सकती है (घटनाओं के आधार पर जो अंततः समाप्त हो गई है) अपस्ट्रीम प्रोजेक्ट के पक्ष पर आपके नियंत्रण का)।
यह एक बड़ी बात नहीं है और इस धारणा के साथ काम करने का मतलब है कि स्थानीय अपस्ट्रीम शाखा को ऐसी स्थिति में रखना आसान है जहां यह केवल तेजी से अग्रेषित अपडेट लेता है।
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs सिमुलेशन # 5
( बराक ए। पर्लमटर द्वारा प्रस्तावित ):
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs सिमुलेशन # 6
(वही माइकल गेबस्ट्रोस द्वारा प्रस्तावित ):
माइकल गेबट्र्रो ने इसमें धोखा दिया, यह दावा करते हुए कि मैं "धोखा" दे रहा था;) और निचले-स्तर की पाइपलाइन के साथ एक और समाधान दिया:
(यह git नहीं होगा यदि यह केवल git कमांड के साथ संभव नहीं होगा, तो अंतर / पैच के साथ git में सब कुछ एक वास्तविक समाधान है;)।
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs सिमुलेशन # 7
आवश्यक कदम के रूप में वर्णित किया जा सकता है:
- अपने वर्कट्री को अपस्ट्रीम से बदलें
- सूचकांक में परिवर्तन लागू करें
- दूसरे अभिभावक के रूप में अपस्ट्रीम जोड़ें
- कमिट
आदेश git read-treeएक अलग पेड़ के साथ सूचकांक को अधिलेखित करता है, दूसरे चरण को पूरा करता है , और पहले चरण को पूरा करते हुए काम के पेड़ को अपडेट करने के लिए झंडे होते हैं । कमिट करते समय, git दूसरे माता-पिता के रूप में .IT / MERGE_HEAD में SHA1 का उपयोग करता है, इसलिए हम इसे मर्ज कमिट बनाने के लिए पॉप्युलेट कर सकते हैं। इसलिए, यह पूरा किया जा सकता है:
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit