প্রতিশ্রুতি পুনঃক্রম


110

আমি বর্তমানে একটি শাখায় কাজ করছি এবং কিছু শাখা অন্য শাখায় একীভূত করতে চাই:

    a-b-c-d-e-f-g (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)
   \
    x-x-x-x-x (branchB)

(চিঠিগুলি কমিটগুলি বোঝায় এবং "এক্স" অপ্রাসঙ্গিক কমিট।

তবে আমি লক্ষ্য করেছি যে কিছুটা কমিট চালিয়ে নেওয়া ভাল ধারণা। আমি একটি প্যাচ এ, ডি, ই এবং জি কমিটিকেট করতে এবং মাস্টারকে প্রতিশ্রুতিবদ্ধ করতে চাই। শাখাবিতে প্রতিশ্রুতি হিসাবে খ এবং কমিটের উচিত। এটি অর্জনের জন্য কি কোনও 'গিট'-ইশ উপায় আছে?


4
ইতিমধ্যে প্রদত্ত দুটি উত্তর সঠিক কমান্ডের উল্লেখ করেছে, তবে আমি মনে করি এটি একটি হিসাবে একটি মৌলিক কাজ হিসাবে মনে হয়, স্ট্যাকওভারফ্লোতে এখানে সত্যিকারের নির্দেশাবলী রাখা ভাল, তাই আমি কিছু পোস্ট করেছি। (আমি অবাক হয়েছি যে এর সাথে লিঙ্ক করার জন্য আমি কোনও ভাল আগের প্রশ্নটি পাই না))
ক্যাসাবেল

উত্তর:


131

আপনি যে কমান্ডটি সন্ধান করছেন তা হ'ল git rebaseবিশেষত -i/--interactiveবিকল্প।

আমি ধরে নিতে চলেছি যে আপনি শাখা A তে কমিটিকে সি ছেড়ে যেতে চান, এবং আপনার সত্যিকার অর্থেই আপনি মার্জগুলি সোজাসুজি হওয়ায় আপনি অন্য প্রতিশ্রুতিগুলি মার্জ করার পরিবর্তে অন্য শাখায় সরিয়ে নিতে চান। চলুন শুরু করা যাক শাখা এ।

git rebase -i <SHA1 of commit a>^ branchA

^মানে পূর্ববর্তী কমিট, তাই এই কমান্ড সামনে "A" হিসাবে বেস কমিট ব্যবহার শাখা একটি রি-বেসের ফলে বলল। গিট আপনাকে এই ব্যাপ্তিতে কমিটের একটি তালিকা উপস্থিত করবে। এগুলি পুনঃক্রম করুন এবং গিটকে উপযুক্ত স্কোয়াশ করতে বলুন:

pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f

এখন ইতিহাসটি দেখতে এমন হওয়া উচিত:

    c - [a+d+e+g] - [b+f] (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)

এখন, শাখাবি-এর জন্য সদ্য-স্কোয়াশেড কমিট বি + এফ ধরুন।

git checkout branchB
git cherry-pick branchA  # cherry-pick one commit, the tip of branchA

এবং মাস্টারের জন্য একটি + ডি + ই + জি এর জন্য একই:

git checkout master
git cherry-pick branchA^

অবশেষে, শাখাএ আপডেট করুন যাতে এটি সি তে নির্দেশ করে:

git branch -f branchA branchA^^

আমাদের এখন থাকা উচিত:

    c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
   /
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
   \
    x-x-x-x-x-[b+f] (branchB)

মনে রাখবেন যে যদি আপনার একাধিক কমিট থাকে তবে আপনি শাখাগুলির মধ্যে যেতে চান, আপনি আবার রিবেস ব্যবহার করতে পারেন (অ-ইন্টারেক্টিভভাবে):

# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB

পরিশেষে, একটি দাবি অস্বীকার: এইভাবে কমিটগুলি পুনরায় অর্ডার করা বেশ সম্ভব যে কেউ কেউ আর পরিষ্কারভাবে প্রয়োগ না করে। এটি হতে পারে কারণ আপনি একটি খারাপ অর্ডার বেছে নিয়েছেন (এটি প্যাচ করা বৈশিষ্ট্যটি উপস্থাপনের জন্য প্রতিশ্রুতি দেওয়ার আগে একটি প্যাচ লাগানো); সেক্ষেত্রে আপনি রিবেস ( git rebase --abort) বাতিল করতে চাইবেন । অন্যথায়, আপনি বুদ্ধিমানভাবে দ্বন্দ্বগুলি ঠিক করতে হবে (ঠিক যেমন আপনি মার্জ সংঘাতের সাথে করেন), সংশোধনগুলি যুক্ত করুন, তারপরে git rebase --continueএগিয়ে চলুন run এই নির্দেশাবলী দ্বন্দ্ব দেখা দিলে মুদ্রিত ত্রুটি বার্তা দ্বারা সরবরাহ করা হয়।


ডায়াগ্রাম git branch -f branchA branchA^^ভুল পরে না ? যথা, ডালাগ্রামের প্রথম লাইনটি c (branchA)না এবং তাই নয়, যাতে এই শাখায় সি'র দিকে নির্দেশ করা উচিত নয় c - [a+d+e+g] - [b+f] (branchA)?
এনটিসি

@ ইউনক্সার্ড: হ্যাঁ, একটি ভুল হয়েছে তবে আপনার সম্পাদনায় এতে ভুল ছিল। আমি এখানে সুযোগ পেলেই এটি ঠিক করব।
ক্যাসাবেল

না করে git branch -f branchA branchA^^কেন আপনি কেবল git reset --hard <sha1 of c>শাখা A তে একটি করতে পারবেন না ?
মিখাইল ভাসিলিভ

22
git rebase -i HEAD~3

3পুনর্নির্মাণ ( উত্স ) প্রয়োজন এমন কমিটের সংখ্যা কোথায় Where

এই খুলবে ষষ্ঠ থেকে করে তালিকা প্রাচীনতম থেকে (শীর্ষ) নতুন (নিচে)।
এখন পুনর্বিন্যাস লাইন, রক্ষা , এবং প্রস্থান এডিটর।

ddpবর্তমান লাইনটি নীচে
ddkP সরানো হবে বর্তমান লাইনকে উপরে সরানো হবে ( উত্স )


10

git rebase --interactive আপনি চান আদেশ।

উদাহরণ:

বর্তমান অবস্থাটি হ'ল:

bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git status
On branch master
nothing to commit, working tree clean
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
a6e3c6a (HEAD -> master) Fourth commit
9a24b81 Third commit
7bdfb68 Second commit
186d1e0 First commit

আমি কমিটগুলি 9a24b81(তৃতীয় প্রতিশ্রুতি) এবং 7bdfb68(দ্বিতীয় প্রতিশ্রুতি) পুনঃক্রম করতে চাই । এই কাজের জন্য, আমি প্রথম কমিট এটি আগে প্রথম কমিট আমরা পরিবর্তন করতে চান । এটি কমিট 186d1e0(ফার্স্ট কমিট)।

git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGEএই ক্ষেত্রে কার্যকর করার আদেশটি হ'ল :

bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git rebase --interactive 186d1e0

এটি নিম্নলিখিত বিষয়বস্তু সহ ডিফল্ট সম্পাদনায় একটি ফাইল খুলবে:

pick 7bdfb68 Second commit
pick 9a24b81 Third commit
pick a6e3c6a Fourth commit

# Rebase 186d1e0..a6e3c6a onto 186d1e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#

নোট করুন যে ফাইলটিতে কমিটের ক্রমটি গিট লগের জন্য ব্যবহৃত বিপরীত। গিট লগে, সাম্প্রতিক কমিট শীর্ষে রয়েছে। এই ফাইলটিতে, সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি নীচে রয়েছে।

ফাইলটির নীচে মন্তব্যটি ব্যাখ্যা করার সাথে সাথে আমি করতে পারি এমন অনেকগুলি জিনিস রয়েছে যেমন স্কোয়াশিং, ড্রপিং এবং পুনরায় অর্ডারিং কমিট। পুনঃ অর্ডার কমিট করার জন্য, আমি ফাইলটি সম্পাদনা করি যাতে এটি এর মতো দেখায় (নীচের মন্তব্যগুলি প্রদর্শিত হয় না):

pick 9a24b81 Third commit
pick 7bdfb68 Second commit
pick a6e3c6a Fourth commit

pickপ্রতিটি লাইনে মানে হলো "ব্যবহার (অর্থাত অন্তর্ভুক্ত করুন) এই কমিট" এবং যখন আমি সংরক্ষণ রি-বেসের ফলে কমান্ড দিয়ে টেম্প ফাইল এবং এডিটার থেকে প্রস্থান, Git কমান্ডগুলো এবং সংগ্রহস্থল এবং কাজ ডিরেক্টরি আপডেট হবে শুরুতে কমান্ড প্রয়োগ করুন:

$ git rebase --interactive 186d1e0
Successfully rebased and updated refs/heads/master.
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
ba48fc9 (HEAD -> master) Fourth commit
119639c Second commit
9716581 Third commit
186d1e0 First commit

পুনর্লিখিত কমিটের ইতিহাসটি নোট করুন।

লিঙ্কগুলি:


4
একটি সম্পূর্ণ এবং স্ব-উত্তরযুক্ত উত্তর সরবরাহ করতে দয়া করে আপনার লিঙ্ক থেকে প্রাসঙ্গিক বিশদ যুক্ত করুন। "লিঙ্ক-শুধুমাত্র উত্তর" এ SO ভ্রূণপ্রাপ্ত। বিশেষত, git rebase --interactiveওপির লক্ষ্য অর্জনের জন্য কেউ কীভাবে ব্যবহার করবে ?
শেরিলহোমান

দ্বিতীয় লিঙ্কটি এখন নেই।
ডেভসও

উত্তর সম্পূর্ণ এবং স্বনির্ভর করতে সামগ্রী যুক্ত করা হয়েছে। দ্বিতীয় লিঙ্কটি সরানো হয়েছে।
কোডেপ


-2

গিট রিবেস যা আপনি চান তা। --Interactive বিকল্পটি দেখুন।


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