গিট: একটি নির্দিষ্ট প্রতিশ্রুতি পুনর্বাসনা কিভাবে?


154

আমি অন্য শাখার প্রধানকে নয়, একটি নির্দিষ্ট প্রতিশ্রুতিতে পুনর্বাসিত করতে চাই:

A --- B --- C          master
 \
  \-- D                topic

প্রতি

A --- B --- C          master
       \
        \-- D          topic

পরিবর্তে

A --- B --- C          master
             \
              \-- D    topic

আমি কীভাবে এটি অর্জন করতে পারি?


4
আপনি কি git checkout Bদৌড়ানোর আগে করার চেষ্টা করেছেন git rebase?
পিটার-পল ভ্যান জেমার্ডেন

নাহ, এই সাহায্য করা উচিত? আমি অনুমান করি যে rebaseকমান্ডের কেবল উল্লেখগুলিই গুরুত্বপূর্ণ matters
ওন্দ্র ŽiŽka

উত্তর:


98

আপনি নিজের পছন্দ মতো কমিটের উপর একটি টেম্প শাখা তৈরি করে ওন্টো প্যারামিটার ব্যবহার এড়াতে পারেন এবং তারপরে তার সহজ আকারে রিবেস ব্যবহার করতে পারেন:

git branch temp master^
git checkout topic
git rebase temp
git branch -d temp

5
আমি এই RISC- মত পদ্ধতির আরো পছন্দ :) চেষ্টা করবে। ধন্যবাদ।
ওন্দ্র Žižka

10
আমি ভাবছি কেন এটি আমার পক্ষে কিছুটা ভিন্ন দৃশ্যে কাজ করে না । আমি গ্রুপটি পিপ 8 এড়িয়ে চলে এবং মাস্টারের ভিত্তিতে থাকতে চাই । git rebase temp(যখন গ্রুপে রয়েছে ) "বর্তমান শাখা গোষ্ঠীগুলি আপ টু ডেট" gives
অ্যালোস মাহডাল

4
এই সমাধানটি সেই দৃশ্যের জন্য কাজ করবে না যেখানে বিষয়টি ইতিমধ্যে মাস্টারের উপর পুনরায় সাজানো হয়েছে, তবে আপনি এটিকে মাস্টার হিসাবে পূর্বপুরুষের কাছে পুনঃব্যবস্থা করতে চান। git rebase --onto <target> <from> <to>সেক্ষেত্রে আপনাকে অবশ্যই ব্যবহার করতে হবে যাতে আপনি <ফর্ম> কমিট নির্দিষ্ট করতে পারেন।
মিরজমাস্টার

যদি আপনি একই কমিটের উপর ভিত্তি করে শাখাটি পুনরায় চালু করতে চান তবে এটি এখন পর্যন্ত সবচেয়ে সহজ বিকল্প।
অ্যাশ

1
আমার মনে হচ্ছে আমি কাজ করছি তবে গিটল্যাব অন্য কিছু বলে। আমার যদি 10 টি কমিট পিছনে থাকে, 5 টি কমিট এগিয়ে থাকে তবে আমার প্রত্যাশা ছিল 8 টি কমিট পিছনে থাকবে, 2 টি কমিট পাওয়ার পরে 5 টি কমিট থাকবে। তবে এটির পরিবর্তে এটি 5 টির সাথে আরও কমিট যুক্ত করে
রোমানিয়া_জিনিজার

67

এমনকি আপনি সরাসরি পন্থা নিতে পারেন:

git checkout topic
git rebase <commitB>

6
আমার জন্য, এটি আসলে যা করতে চায় তা করে না। যতদুর আমি বলতে পারেন, এটি "সর্বশেষ সাধারণ পূর্বপুরুষ" সম্মুখের রি-বেসের ফলে করার চেষ্টা করে topicএবং commitB
ড্যান লেন্সকি

2
@ ড্যানলেনস্কি, এটি কীভাবে রিবাজে কাজ করে না। ডক্সকে সন্ধান করে , It works by going to the common ancestor of the two branches (the one you’re on and the one you’re rebasing onto), getting the diff introduced by each commit of the branch you’re on, saving those diffs to temporary files, resetting the current branch to the same commit as the branch you are rebasing onto, and finally applying each change in turn. আমি এখনই এটি আবার চেষ্টা করেছি এবং দেখে মনে হচ্ছে ঠিক ঠিক আছে।
r0hitsharma

1
সুপার ইজি এবং কাজ! আমার এখন রয়েছে: কমিটবি_ফর্ম_মাস্টার-> টপিককমিট 1-> টপিককমিট 2।
মার্টিন কোনিসেক

এটি আমার পক্ষে কাজ করে না। এর আগে, গিটল্যাব বলেছিলেন "n এগিয়ে যায়"। এবং এখন, এটি বলেছে "এম এগিয়ে চলেছে" কোথায় m > n
রোমানিয়া_জিনিয়র

48

"অন" বিকল্পটি ব্যবহার করুন:

git rebase --onto master^ D^ D

2
Dএবং D^"বিষয়" এর শেষ এবং পরবর্তী থেকে শেষ প্রতিশ্রুতিবদ্ধের হ্যাশ হবে?
ওন্দ্র Žižka

39
বাক্য গঠনটিও এর মতো git rebase --onto <new-parent> <old-parent>গিট প্যারেন্ট পয়েন্টারকে অন্য কোনও পিতামাতার কাছে সেট করা দেখুন । আপনার ক্ষেত্রে, <নতুন-
পিতামাত্ত্বি

7
আমি সর্বদা 3 টি আর্গুমেন্ট ব্যবহার করি: বর্ননা, শুরু এবং পুনর্বাসনের প্রতিশ্রুতিগুলির শেষ।
অ্যাডাম ডাইমিট্রুক

14
এটি আমার জন্য কাজ করেছে:git rebase --onto <commit-ID> master

4
@ জেজেডের মন্তব্যটি সঠিক, সাইমন সাউথের মন্তব্যের বিপরীতে, এটি অন্যভাবে: git rebase --onto master <commit-ID-of-old-parent>ও ওপি-র পক্ষে git rebase --onto B A
চমকপ্রদ

19

উপরের জেজেডের মন্তব্যটি আমার প্রচুর ব্যথা বাঁচিয়েছে, সুতরাং আমি এর ভিত্তিতে একটি ধাপে ধাপে প্রাপ্ত রিসিপিটি ব্যবহার করেছি যা অন্য কোনও প্রতিশ্রুতি শীর্ষে যে কোনও প্রতিশ্রুতি পুনর্বার / সরানোর জন্য ব্যবহার করছি:

  1. পুনর্বাসনের জন্য (সরানো) ব্রাঞ্চের একটি পূর্বের শাখা বিন্দু সন্ধান করুন - এটিকে বৃদ্ধ পিতা বা মাতা বলে। উপরের উদাহরণে এটি
  2. আপনি যে শাখায় শাখাটি স্থানান্তর করতে চান তার উপরে কমিট সন্ধান করুন - এটিকে নতুন পিতামাতাকে কল করুন। উপস্থাপনায় যে বি
  3. আপনার শাখায় থাকা উচিত (আপনি যেটি সরান):
  4. আপনার রিবেস প্রয়োগ করুন: git rebase --onto <new parent> <old parent>

উপরের উদাহরণে এটি এতটা সহজ:

   git checkout topic
   git rebase --onto B A

6
এটি সঠিক উত্তর হওয়া উচিত। আমি যেটি ব্যবহার করি তা বাদ দিয়ে git rebase --onto B masterআরও উত্তর দেওয়ার জন্য আমার উত্তরটি দেখুন।
জ্যাক মরিস

এটি আমার পক্ষে ভাল কাজ করে নি। আমি পরপর ২ টি কমিট (বর্তমান শাখায় ছিল এমন মাস্টার থেকে সর্বশেষ একটি এবং বর্তমান শাখায় ছিল না এমন মাস্টার থেকে প্রথমটি) বেছে নিয়েছিলাম। আমি 100 পিছনে দিয়ে শুরু করেছি - 10 এগিয়ে এবং 99 পিছনে পরিবর্তে - 10 এগিয়ে, এখন আমার 105 আছে - 13 এগিয়ে
রোমানিয়া_জিনিয়র

এটি কাজ করে না শুনে দুঃখিত। আপনার শাখাগুলির মতো শব্দগুলি বেশ খানিকটা সরে গেছে - আমি অনেকগুলি পার্থক্য নিয়ে শাখাগুলি পুনরায় চালু করার আগে প্রথমে স্কোয়াশিংয়ের পরামর্শ দেব।
নেস্টর মিলিয়ায়েভ

11

বিষয় সমাধান

পোস্ট করা প্রশ্নের উত্তর দেওয়ার সঠিক আদেশটি নিম্নলিখিত যে কোনও একটি হতে পারে (ধরে নেওয়া শাখা topicইতিমধ্যে চেক আউট হয়ে গেছে):

git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B

যদি topicচেক আউট না করা হয়, আপনি কেবল topicকমান্ডটিতে (শেষটি ব্যতীত) এর মতো যুক্ত করুন:

git rebase --onto B master topic

বিকল্পভাবে, প্রথমে এর সাথে শাখাটি পরীক্ষা করে দেখুন:

git checkout topic

টার্গেট কমিটের যে কোনও স্ট্রিং অফ কমিটকে রিবেস করুন

ডকুমেন্টেশন থেকে আঁকানো আমাদের যে কমান্ডের প্রয়োজন হবে তার মূল ফর্মটি হ'ল:

git rebase --onto <Target> [<Upstream> [<Branch>]]

<Branch>alচ্ছিক এবং এটি যা করে তা হ'ল বাকী কমান্ডটি কার্যকর করার আগে নির্দিষ্ট শাখাটি পরীক্ষা করে। আপনি যে শাখাটি পুনরায় চালু করতে চান তা যদি আপনি ইতিমধ্যে পরীক্ষা করে ফেলেছেন তবে আপনার এটির দরকার নেই। নোট করুন যে <Upstream>নির্দিষ্ট করতে <Branch>বা গিটের জন্য আপনাকে অবশ্যই নির্দিষ্ট করা আবশ্যক মনে করবে আপনি নির্দিষ্ট করে দিচ্ছেন <Upstream>

<Target>প্রতিশ্রুতিবদ্ধ আমরা আমাদের প্রতিশ্রুতিবদ্ধ স্ট্রিং সংযুক্ত করব। কোনও শাখার নাম সরবরাহ করার সময়, আপনি কেবল branch শাখার প্রধান প্রতিশ্রুতি নির্দিষ্ট করে দিচ্ছেন। <Target>যে কোনও প্রতিশ্রুতি থাকতে পারে যা সরিয়ে নেওয়া কমিটগুলির স্ট্রিংয়ের মধ্যে থাকবে না। উদাহরণ স্বরূপ:

A --- B --- C --- D         master
      \
       \-- X --- Y --- Z    feature

সমগ্র বৈশিষ্ট্য শাখা স্থানান্তর করতে, আপনাকে নির্বাচন করতে পারবেন না X, Y, Z, অথবা featureযেমন <Target>ঐ যেহেতু সব গ্রুপ ভিতরে করে স্থানান্তরিত হচ্ছে হয়।

<Upstream>এটি বিশেষ কারণ এটি দুটি ভিন্ন জিনিস বোঝাতে পারে। যদি এটি একটি প্রতিশ্রুতিবদ্ধ যা পরীক্ষিত শাখার পূর্বপুরুষ, তবে এটি কাটা পয়েন্ট হিসাবে কাজ করে। উদাহরণস্বরূপ আমি প্রদান করা, এই কিছু যে হয় না C, Dঅথবা master<Upstream>চেক আউট শাখার প্রধানটি সরানো হবে যতক্ষণ না পরে সমস্ত কমিট করে ।

তবে, যদি <Upstream>পূর্বপুরুষ না হয়, তবে গিটটি নির্দিষ্ট প্রতিশ্রুতি থেকে শৃঙ্খলার ব্যাক আপ করবে যতক্ষণ না চেক আউট শাখার সাথে কোনও সাধারণ পূর্বপুরুষের সন্ধান হয় (এবং যদি এটি খুঁজে না পাওয়া যায় তবে অব त्याহিত)। আমাদের ক্ষেত্রে, একটি ইন <Upstream>এর B, C, D, অথবা masterহবে সব ফলাফলের কমিট মধ্যে Bকাটা পয়েন্ট হিসাবে পরিবেশন করছে। <Upstream>এটি নিজেই একটি alচ্ছিক কমান্ড এবং যদি এটি নির্দিষ্ট না করা হয়, তবে গিটটি চেক আউট শাখার পিতামাতার দিকে নজর দেয় যা প্রবেশের সমতুল্য master

এখন যে গিটটি এই কমিটগুলি কেটে ফেলেছে তা নির্বাচন করেছে এবং এটি <Target>ইতিমধ্যে টার্গেটে প্রয়োগ করা যেকোনোটি এড়িয়ে চলেছে to

আকর্ষণীয় উদাহরণ এবং ফলাফল

এই সূচনা পয়েন্টটি ব্যবহার করে:

A --- B --- C --- D --- E         master
            \
             \-- X --- Y --- Z    feature
  • git rebase --onto D A feature
    করে প্রয়োগ করা হবে B, C, X, Y, Zসমর্পণ করতে Dএবং কুঁদন শেষ Bএবং Cকারণ তারা ইতিমধ্যে প্রয়োগ করা হয়েছে।

  • git rebase --onto C X feature
    প্রতিশ্রুতিগুলি কার্যকরভাবে মুছে ফেলা Yএবং প্রতিশ্রুতিবদ্ধদের প্রয়োগ করেZCX


4

একটি সহজ সমাধান git rebase <SHA1 of B> topic। এটি আপনার HEADঅবস্থান নির্বিশেষে কাজ করে works

আমরা গিট রিবেস ডক থেকে এই আচরণটি নিশ্চিত করতে পারি

<upstream>বিপরীতে তুলনা করতে প্রবাহ শাখা। কোনও বিদ্যমান শাখার নাম নয়, কোনও বৈধ প্রতিশ্রুতিবদ্ধ হতে পারে । বর্তমান শাখার জন্য কনফিগার করা আপ স্ট্রিমের ডিফল্ট।


আপনি ভাবছেন যে আমি যদি topicউপরের কমান্ডের মধ্যেও SHA1 উল্লেখ করি তবে কী হবে ?

git rebase <SHA1 of B> <SHA1 of topic>

এটি কাজ করবে তবে পুনর্বাসনা Topicকরা নতুন শাখার পক্ষে তেমন কোনও ইঙ্গিত দেবে না সুতরাং এটি তৈরি করা HEADহবে এবং বিচ্ছিন্ন অবস্থায় থাকবে। সুতরাং এখান থেকে আপনাকে ম্যানুয়ালি পুরানো মুছতে হবে Topicএবং রিবেস দ্বারা তৈরি নতুন শাখায় একটি নতুন শাখা রেফারেন্স তৈরি করতে হবে।


3

আমি উপরে বর্ণিত সমাধানগুলির মিশ্রণটি ব্যবহার করেছি:

$ git branch temp <specific sha1>
$ git rebase --onto temp master topic
$ git branch -d temp

আমি এটি পড়তে এবং বুঝতে অনেক সহজ পেয়েছি। গৃহীত সমাধান আমাকে মার্জ সংঘাতের দিকে নিয়ে যায় (হাতের মুঠোয় ঠিক করতে খুব অলস):

$ git rebase temp
First, rewinding head to replay your work on top of it...
Applying: <git comment>
Using index info to reconstruct a base tree...
M       pom.xml
.git/rebase-apply/patch:10: trailing whitespace.
    <some code>
.git/rebase-apply/patch:17: trailing whitespace.
        <some other code>
warning: 2 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging pom.xml
CONFLICT (content): Merge conflict in pom.xml
error: Failed to merge in the changes.
Patch failed at 0001 <git comment>
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

1
এখানে একইভাবে, বেশিরভাগ ফাইলের দ্বন্দ্ব ছিল যখন আমি 2 টি সর্বাধিক জনপ্রিয় উত্তরগুলি ব্যবহার করেছি (যেমন r0hitsharma এবং Dymitruk দ্বারা)
অলিভার

3

রিবাইজিং যেহেতু মৌলিক তাই এখানে নেস্টর মিলিয়ায়েভের উত্তরের একটি প্রসার রয়েছে । মিশ্রন jsz এর এবং সাইমন দক্ষিণ এর কাছ থেকে মন্তব্য আদম Dymitruk এর উত্তর এই কমান্ড যা কাজ করে উৎপাদ topicতা ডাল কিনা নির্বিশেষে শাখা masterশাখা এর কমিট Aবা C:

git checkout topic
git rebase --onto <commit-B> <pre-rebase-A-or-post-rebase-C-or-base-branch-name>

নোট করুন যে শেষ যুক্তিটি প্রয়োজনীয় (অন্যথায় এটি আপনার শাখাকে প্রতিশ্রুতিবদ্ধ করে তোলে B) ind

উদাহরণ:

# if topic branches from master commit A:
git checkout topic
git rebase --onto <commit-B> <commit-A>
# if topic branches from master commit C:
git checkout topic
git rebase --onto <commit-B> <commit-C>
# regardless of whether topic branches from master commit A or C:
git checkout topic
git rebase --onto <commit-B> master

সুতরাং শেষ কমান্ডটি হ'ল আমি সাধারণত ব্যবহার করি।


-2

এটি করার আরও একটি উপায় আছে বা আপনি যদি কেবল একটি অঙ্গীকারের চেয়ে বেশি ফিরে যেতে চান।

nকমিটের সংখ্যায় ফিরে যাওয়ার উদাহরণ এখানে রয়েছে :

git branch topic master~n

এই প্রশ্নের খাতিরে, এটিও করা যেতে পারে:

git branch topic master~1

কমান্ডটি পুরোপুরি কাজ করে git version 2.7.4। অন্য কোনও সংস্করণে এটি পরীক্ষা করা হয়নি।


ব্রাঞ্চিং সম্পর্কে প্রশ্ন হিসাবে আপনি কি এটি ভুল ব্যাখ্যা করেছেন? এটি প্রকৃতপক্ষে প্রত্যাবাসন সম্পর্কে একটি প্রশ্ন।
নেদারগ্রানাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.