শাখা বেস পরিবর্তন করুন


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পিআরও শাখা থেকে চেষ্টা করেছি , কিন্তু কিছুই হয় না।

স্পষ্ট করার জন্য : আমি মাস্টারে কাজ করছিলাম এবং তারপরে আমাকে একটি পণ্য ডেমো তৈরি করতে হয়েছিল ( git checkout -b demoএবং কিছু কমিট করে)। তারপরে, ভুল করে, আমি ডেমো থেকে অন্য একটি শাখা তৈরি করেছি ( git checkout -b PROএবং কিছু কমিট করে) এবং এখন আমার পিআরও শাখাটি মাস্টারে স্থানান্তরিত করতে হবে এবং ডেমো অক্ষত রাখতে হবে। শেষে, ডেমো এবং জন উভয়ই মাস্টার থেকে স্তব্ধ হয়ে যাবে।


উত্তর:


281

তার --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
এনভিটিয়াস

9
আমি এই পড়া নির্দেশিকা উপর --onto, এবং কিভাবে তারা আমাকে সাহায্য লিখেছেনgit rebase --onto newBase oldBase feature/branch
গেব

@ ফিলিপরেগো এটি ভুল। origin/newBaseএকটি শাখার নাম যেমন ঠিক newBaseআমার উদাহরণে। এটি কেবল নির্ভর করবে যদি আপনি আপনার স্থানীয় সংগ্রহস্থল ( newBase) -এ উপস্থিত কোন শাখায় বা রিমোটের ( origin/newBase) তে বিদ্যমান কোনও শাখায় প্রত্যাবর্তন করছেন ।
লগানফস্মিথ

@ ফিলিপরেগো এগুলি স্বাধীন জিনিস নয়। newBaseস্থানীয় শাখার origin/newBaseনাম এবং এটি একটি প্রত্যন্ত শাখার নাম। কোনটি আপনি চাইছেন তার উপর নির্ভর করে আপনি কী রিবাজন করছেন। এটি এমন নয় যে একজন কাজ করে এবং কেউ কাজ করে না, এটি হ'ল তারা বিভিন্ন জিনিসকে পুনরায় সাজান। মূল প্রশ্নটি কখনই রিমোটগুলি উল্লেখ করে না, সুতরাং আমার উদাহরণে রিমোটগুলি ব্যবহার করা জিজ্ঞাসা করা প্রশ্নের সাথে মেলে না।
লগানফস্মিথ

22

আমি যতটা সম্ভব জেনেরিক হওয়ার চেষ্টা করব। প্রথমে নিশ্চিত হয়ে নিন যে আপনি পছন্দসই শাখায় রয়েছেন:

git checkout current-branch

তারপরে নিম্নলিখিত কমান্ডটি ব্যবহার করুন ( new-base-branchআপনি যে নতুন current-base-branchশাখাটি আপনার নতুন বেস হতে চান সেই শাখাটি কোথায় এবং আপনার বর্তমান বেসটি সেই শাখাটি রয়েছে))

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

আপনার যদি দ্বন্দ্ব না হয় তবে দুর্দান্ত - আপনার কাজ শেষ। আপনি যদি (বেশিরভাগ ক্ষেত্রে) করেন তবে দয়া করে পড়ুন।

দ্বন্দ্ব দেখা দিতে পারে এবং আপনাকে সেগুলি ম্যানুয়ালি সমাধান করতে হবে। Git এখন আপনার মধ্যে একটি "3-ওয়ে একত্রীকরণ" do করার চেষ্টা করে current-branch, current-base-branchএবং new-base-branch। মোটামুটিভাবে এইভাবে অভ্যন্তরীণভাবে গিট কাজ করবে:

  1. গিট প্রথমে current-base-branchউপরের অংশটি রিবেস করবে new-base-branch। কোন্দল হতে পারে; যা আপনাকে ম্যানুয়ালি সমাধান করতে হবে। এটি সম্পন্ন হওয়ার পরে, আপনি সাধারণত git add .এবং করেন git rebase --continue। এটি এর জন্য একটি নতুন অস্থায়ী প্রতিশ্রুতি তৈরি করবে temp-commit-hash

  2. এর পরে, গিট এখন আপনার current-branchশীর্ষে পুনঃতফসিল করবে temp-commit-hash। আরও দ্বন্দ্ব হতে পারে এবং আবার আপনাকে সেগুলি ম্যানুয়ালি সমাধান করতে হবে। একবার হয়ে গেলে আপনি আবার চালিয়ে যান git add .এবং এর git rebase --continueপরে আপনি সফলভাবে আপনার current-branchশীর্ষে ফিরে এসেছেন new-base-branch


দ্রষ্টব্য: আপনি যদি বিশৃঙ্খলা শুরু করেন, তবে আপনি git rebase --abortরিবেস প্রক্রিয়া চলাকালীন যে কোনও সময় করতে পারেন এবং শুরুতে ফিরে যেতে পারেন।


rebaseপোস্ট করা কমান্ডটি কেবল আমাকে "মারাত্মক: অবৈধ আপস্ট্রিম 'কারেন্ট-বেস-ব্রাঞ্চ' দেয়। এছাড়াও, বর্তমান শাখার বর্তমান প্যারেন্ট ব্রাঞ্চটি কী তা জিআইটিকে বলা দরকার - এটি ইতিমধ্যে এটি জানা উচিত নয়?
ম্যাট আর্নল্ড

21

PROশাখায় চেকআউট করুন, এই শাখার সর্বাধিক প্রাচীন ( কমিট 4 ) এবং সর্বশেষ ( কমিট 5 ) হ্যাশগুলি অনুলিপি করুন এবং অন্য কোথাও পেস্ট করুন:

$ 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

এখন, যদি সবকিছু ঠিকঠাক হয়, তবে remote PROশাখায় চাপ দিয়ে (-f) চাপ দিন এবং স্থানীয় মুছুন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

প্রতিশ্রুতিবদ্ধ ভিত্তিতে শাখাটি পুনরায় সেট করে আপনার মূলত কেবল সেই শাখার ইতিহাসকে একবারে প্রতিশ্রুতিবদ্ধ করে re


আপনার কি চতুর্থ লাইনের "প্রতিশ্রুতিবদ্ধ" এবং "3" এর মধ্যে স্থানটি সরিয়ে নেওয়া উচিত?
অ্যালেক্সিস উইল্কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.