शाखा आधार बदलें


145

मेरे पास एक पेड़ है:

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

और मुझे मास्टर करने के लिए प्रो शाखा को स्थानांतरित करना होगा

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

मैं एक git rebase masterसे कोशिश की है Pro शाखा, लेकिन कुछ नहीं होता है।

स्पष्ट करने के लिए : मैं मास्टर में काम कर रहा था और फिर मुझे एक उत्पाद डेमो ( git checkout -b demoऔर कुछ कमिट) करना था। फिर, गलती से, मैं डेमो ( git checkout -b PROऔर कुछ कमिट्स) से एक और शाखा बनाता हूं और अब मुझे प्रो शाखा को मास्टर और डेमो इंटैक को छोड़ने की आवश्यकता है। अंत में, डेमो और PRO दोनों मास्टर से लटकाएंगे।


जवाबों:


282

--ontoउस के लिए उपयोग करें :

git rebase --onto newBase oldBase feature/branch

आपके मामले को देखते हुए:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

मूल रूप से, आप सभी कमिट को demoअप करने के बाद से लेते हैं PRO, और उन्हें masterकमिट पर रिबेट करते हैं।


अगर स्थिति विपरीत है तो क्या यह भी रास्ता है? == मैं दूसरी शाखा में मास्टर से चेक-बी करता हूं, लेकिन मैं इसे पहले से करना चाहता था। इसलिए मैंने किया था, git rebase --onto first-branch second-branch second-branchलेकिन मुझे
Fla

1
@ उस स्थिति में, यह होगाgit rebase --onto first-branch master second-branch
nVitius

9
मैंने इस गाइड को पढ़ा --onto, और उन्होंने लिखा कि कैसे मेरी मदद कीgit rebase --onto newBase oldBase feature/branch
gab

@PhilipRego यह गलत है। मेरे उदाहरण की origin/newBaseतरह, एक शाखा का नाम है newBase। यह सिर्फ इस बात पर निर्भर करेगा कि क्या आप अपने स्थानीय भंडार ( newBase), या दूरस्थ ( origin/newBase) पर मौजूद एक शाखा पर मौजूद हैं ।
loganfsmyth

@PhilipRego वे स्वतंत्र चीजें नहीं हैं। newBaseएक स्थानीय शाखा origin/newBaseका नाम है , और एक दूरस्थ शाखा का नाम है। आप जो चाहते हैं, वह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। ऐसा नहीं है कि एक काम करता है और एक नहीं करता है, यह है कि वे विभिन्न चीजों पर छूट देते हैं। मूल प्रश्न में कभी भी उल्लेख नहीं है, इसलिए मेरे उदाहरण में रीमोट का उपयोग उस प्रश्न से मेल नहीं खाएगा जो पूछा गया था।
loganfsmyth

22

मैं उतना ही सामान्य होने की कोशिश करूंगा जितना मैं कर सकता हूं। पहले, सुनिश्चित करें कि आप वांछित शाखा पर हैं:

git checkout current-branch

फिर निम्नलिखित कमांड का उपयोग करें (जहां new-base-branchवह शाखा है जिसे आप अपना नया आधार बनाना चाहते हैं, और current-base-branchवह शाखा है जो आपका वर्तमान आधार है।)

git rebase --onto new-base-branch current-base-branch

यदि आपके पास संघर्ष नहीं है, तो महान - आप कर रहे हैं। यदि आप (ज्यादातर मामलों में) करते हैं, तो कृपया पर पढ़ें।

विरोध उत्पन्न हो सकता है, और आपको उन्हें स्वयं हल करना होगा। Git अब अपनी जो "3-जिस तरह से मर्ज" करने की कोशिश करता current-branch, current-base-branchऔर new-base-branch। मोटे तौर पर यह है कि git आंतरिक रूप से कैसे काम करेगा:

  1. सबसे पहले Git सबसे current-base-branchऊपर रिबास करेगा new-base-branch। संघर्ष हो सकता है; जिसे आपको मैन्युअल रूप से हल करना होगा। उसके बाद किया जाता है, आप आमतौर पर करते हैं git add .और git rebase --continue। यह इसके लिए एक नई अस्थायी प्रतिबद्धता बनाएगा temp-commit-hash

  2. इसके बाद, Git अब आपके current-branchशीर्ष पर फिर से आ जाएगा temp-commit-hash। आगे संघर्ष हो सकता है और फिर से आपको उन्हें स्वयं हल करना होगा। एक बार हो जाने के बाद, आप फिर से जारी रखते हैं git add .और git rebase --continue, जिसके बाद आपने अपने current-branchशीर्ष पर सफलतापूर्वक विद्रोह किया है new-base-branch


नोट: यदि आप गड़बड़ करना शुरू करते हैं, तो आप git rebase --abortरिबास प्रक्रिया के दौरान कभी भी कर सकते हैं और शुरुआती बिंदु पर वापस आ सकते हैं।


rebase": अवैध नदी के ऊपर 'वर्तमान आधार शाखा' घातक" कमांड के रूप में तैनात सिर्फ मुझे देता है। इसके अलावा, GIT को यह बताना भी आवश्यक क्यों है कि वर्तमान शाखा की वर्तमान मूल शाखा क्या है - क्या यह पहले से ही नहीं पता होना चाहिए?
मैट अर्नोल्ड

21

PROशाखा में चेकआउट करें , इस शाखा की सबसे पुरानी ( कमेटी ) और नवीनतम ( कमेटी ) प्रतिबद्ध हैश की प्रतिलिपि बनाएँ और कहीं और चिपकाएँ:

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

PROशाखा हटाएं (सुरक्षा के लिए केवल एक बैकअप रखें)। नई PROशाखा से बनाएँ और चेकआउट करें master:

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'

नई शाखा में पिछली शाखा के आवागमन की सीमा ( चेरी-पिक ) लें :PROPRO

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

अब, यदि सब ठीक है, तो बल (-f) remote PROशाखा को धक्का दें और स्थानीय PRO.bacशाखा को हटा दें :

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch

1

मेरे पास रीसेट और स्टैस का उपयोग करके थोड़ा अलग दृष्टिकोण था जो शाखाओं को हटाने की आवश्यकता को समाप्त करने के साथ-साथ शाखाओं को हटाने और फिर से बनाने से बचता है:

$ git checkout PRO
$ git reset commit4 # This will set PROs HEAD to be at commit 4, and leave the modified commit 5 files in ur working index
$ git stash save -m "Commit message"
$ git reset commit 3
$ git stash save -m "Commit message"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # force if its already been push remotely

एक आधार पर शाखा को कमिट करके अपने मूल रूप से उस शाखा को इतिहास में एक समय में प्रतिबद्ध करने पर पुनर्विचार करना।


क्या आपको 4 वीं पंक्ति पर "कमिट" और "3" के बीच की जगह निकालनी चाहिए?
एलेक्सिस विल्के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.