কীভাবে চেরি-পিক একাধিক কমিট করবে


872

আমার দুটি শাখা আছে। কমিট a, এক প্রধান অন্যান্য আছে, যখন b, c, d, eএবং fউপরে a। আমি স্থানান্তর করতে চান c, d, eএবং fছাড়া কমিট প্রথম শাখায় b। ব্যবহার চেরি এটা বাছাই সহজ: চেকআউট প্রথম শাখা একের পর এক চেরি-বাছাই cকরার জন্য fএবং প্রথম সম্মুখের দ্বিতীয় শাখা রি-বেসের ফলে। তবে চেরি-বাছাইয়ের কোনও উপায় আছে কি c- fএক আদেশে?

এখানে একটি দৃশ্যের বর্ণনা দেওয়া হয়েছে (ধন্যবাদ জেজেডি ):

এখানে চিত্র বর্ণনা লিখুন


3
আপনি যে রিবেসটি উল্লেখ করেছেন তা আসলে প্রশ্নের সাথে প্রাসঙ্গিক নয় কি? (আমি পেয়েছি যে আপনি পরবর্তীকালের উপর bভিত্তি করে থাকতে চান f, তবে চেরি তোলার সাথে এর
কোনও যোগসূত্র নেই

উত্তর:


1280

গিট ১.7.২ চ্যারিটি বিভিন্ন কমিট বেছে নিতে সক্ষমতার পরিচয় দিয়েছে। থেকে রিলিজ নোট :

git cherry-pickঅনেকগুলি কমিট (যেমন cherry-pick A..Bএবং cherry-pick --stdin) বাছাই করতে শিখেছি , তাই করেছে git revert; rebase [-i]যদিও এগুলি উত্তম সিকোয়েন্সিং নিয়ন্ত্রণটিকে সমর্থন করে না ।

প্রতিশ্রুতিবদ্ধ Aপ্রতিশ্রুতিবদ্ধকরণের B(যেখানে Aএর চেয়ে বেশি বয়স্ক B) সমস্ত কমিট চেরি-বাছাই করতে , চালনা করুন:

git cherry-pick A^..B

আপনি যদি নিজেই এটিকে অগ্রাহ্য করতে চান তবে চালান:

git cherry-pick A..B

(ক্রেডিট ড্যামিয়ান, জেবি রেইনসবার্গার এবং মন্তব্যগুলিতে শ্যাশফের কাছে যায়)


249
"চেরি-পিক এ..বি" ফর্মে, এ বি এর চেয়ে বেশি বয়সী হওয়া উচিত যদি তারা ভুল ক্রম হয় তবে কমান্ডটি নিঃশব্দে ব্যর্থ হবে।
দামিয়ান

294
এছাড়াও, এটি চেরি-বাছাই করবে না, বরং এ পর্যন্ত বি এবং সমস্ত কিছু অন্তর্ভুক্ত করবে
জেবি রেইনসবার্গার

454
একটি খালি অন্তর্ভুক্ত করতেgit cherry-pick A^..B
কিরিতসুকু

17
আপনার কাছে যদি 1.7.1 বা তার আগের গিট থাকে এবং আপডেট না করতে পারে তবে আপনি চালিয়ে git cherry-pick f~3তারপর চেরি বাছাই করতে পারেন git cherry-pick f~2ইত্যাদি চালিয়ে চালিয়ে ইত্যাদি git cherry-pick f( এটি, বেশিরভাগ কনসোলগুলিতে একই হওয়া উচিত)।
ডেভিড ম্যাসন

19
এই সিনট্যাক্সটি শাখার নামগুলির সাথেও কাজ করে তা জেনে রাখা ভাল। git cherry-pick master..somebranchমাস্টার (যেহেতু আগে থেকেই মাস্টারের উপর রিজেড করা হয়েছে) ধরে নিয়ে কিছুটা বাছাই করবে এবং সেগুলি আপনার বর্তমান শাখায় প্রয়োগ করবে।
টোর ক্লিংবার্গ

102

এটি করার সহজ উপায় হ'ল ontoবিকল্পটি rebase। ধরুন যে শাখা যা বর্তমান শেষ amybranch বলা হয় এবং এই শাখা যা আপনি স্থানান্তর করতে চান c- fসম্মুখের।

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b

1
ধন্যবাদ! আপনার কাছে যোগ করা যায়নি git checkout secondbranch && git rebase mybranchপূর্ণ উত্তরের জন্য
স্পর্শ

1
এই উত্তরটি আমাকে এই পরিস্থিতিতে দৃ commit়প্রতিজ্ঞ কোনটি প্রতিশ্রুতিবদ্ধ তা সম্পর্কে আমার মাথা পেতে অনেকটাই সহায়তা করেছিল। এবং: আপনি rebaseএর ইন্টারেক্টিভ মোডটিও ব্যবহার করতে পারেন । ধন্যবাদ, @ চার্লস!
অলিভার

1
এই পদ্ধতির সৌন্দর্য হ'ল আপনি --interactiveক্রমিক থেকে কিছু কমিটগুলি সরিয়ে ফেলতে বা "চেরি বাছাই" এর পূর্বে সেগুলি পুনরায় অর্ডার করতে ব্যবহার করতে পারেন। +1
মাইকেল মেরিকেল

এটি একটি জেনিয়াস কমান্ড, আপনার মাথাটি চারপাশে মুড়িয়ে দেওয়ার জন্য কিছুটা জটিল, তবে এটি আশ্চর্যরূপে কাজ করে।
ভ্যালেরিও

ওয়াইল্ড যে আপনাকে এই প্রতিশ্রুতি দিতে হবে যে আপনি তর্ক-বিতর্ককারীদের মধ্যে একজন হিসাবে ( যেমন এই উদাহরণস্বরূপ) পুনঃবাস করতে চান নাb তবে হ্যাঁ এটি আমার পক্ষে কাজ করেছে।
asontu

85

অথবা অনুরোধ করা ওয়ান-লাইনার:

git rebase --onto a b f

5
যদি কেবল তার বংশবৃদ্ধির জন্য হয় তবে এটি সেরা উত্তর।
নাট চ্যান্ডলার

9
উত্সাহিত কিন্তু আপনাকে বিচ্ছিন্ন হেড অবস্থায় ছেড়ে দিবে যদি f প্রতিশ্রুতিবদ্ধ (কোনও শাখার বিপরীতে) - আপনার সম্পাদনা করা উচিত যে নীচে উত্তর
Mr_and_Mrs_D

68

আপনি একটি সিরিয়াল সংমিশ্রণটি ব্যবহার করতে পারেন git rebaseএবং আরও git branchএকটি শাখায় কমিটের একটি গ্রুপ প্রয়োগ করতে পারেন। ওল্ফসি দ্বারা ইতিমধ্যে পোস্ট করা প্রথম কমান্ড আসলে কমিটগুলি অনুলিপি করে। তবে, আপনি গ্রুপটির শীর্ষস্থানীয় সর্বাধিক কমিটিতে কোনও শাখার নাম যুক্ত না করা পর্যন্ত পরিবর্তনটি দৃশ্যমান নয়।

ছবিটি একটি নতুন ট্যাবে খুলুন ...

কর্মধারা

পাঠ্য আকারে কমান্ডগুলি সংক্ষিপ্ত করতে:

  1. ওপেন gitk কমান্ড ব্যবহার করে একটি স্বাধীন প্রক্রিয়া হিসাবে: gitk --all &
  2. চালান git rebase --onto a b f
  3. প্রেস F5মধ্যে gitk । কিছুই পরিবর্তন. কিন্তু কোন HEADচিহ্নিত করা হয় না।
  4. চালান git branch selection
  5. প্রেস F5মধ্যে gitk । এর কমিট সহ নতুন শাখা উপস্থিত হবে।

এটি বিষয়গুলি স্পষ্ট করা উচিত:

  • প্রতিশ্রুতিবদ্ধতা aগ্রুপের নতুন মূল গন্তব্য।
  • প্রতিশ্রুতিবদ্ধতা bগ্রুপের প্রথম প্রতিশ্রুতি হওয়ার আগে প্রতিশ্রুতিবদ্ধ (একচেটিয়া)।
  • কমিট fগ্রুপের অন্তর্ভুক্তি (অন্তর্ভুক্ত) commit

পরবর্তীতে আপনি ব্যবহার করতে পারে git checkout feature && git reset --hard bকরে মুছে ফেলতে cপর্যন্ত fথেকে featureশাখা।

এই উত্তর ছাড়াও, আমি একটি ব্লগ পোস্ট লিখেছিলাম যা অন্য দৃশ্যে কমান্ডগুলি বর্ণনা করে যা এটি সাধারণত ব্যবহার করতে সহায়তা করে।


2
যদি মাইব্র্যাঞ্চ (a..f কমিট) এর আর প্রয়োজন না হয় তবে এটিকে সহজ করা যেতে পারে: git rebase --onto a b mybranchএবং বিটিডব্লিউ - সেই নিফটি গিট ছবি কোন প্রোগ্রামটি করে?
Mr_and_Mrs_D

2
@ মিঃ_আর_আমস_ডি আপনার মন্তব্যের জন্য ধন্যবাদ। আমি মনে করি ছবি আঁকার জন্য আমি cacoo.com ব্যবহার করেছি
জেজেডি

48

বিশেষ করে প্রশ্নের উত্তর দেওয়ার জন্য জেবি রেইনসবার্গার এবং এসচেফের মন্তব্যগুলি প্রয়োগ করার জন্য ... এই উদাহরণে চেরি-পিক রেঞ্জ ব্যবহার করতে:

git checkout a
git cherry-pick b..f

অথবা

git checkout a
git cherry-pick c^..f

3
আমি ব্যবহার git 2.7.0.windows.1করেছি এবং লক্ষ্য করেছি যে আমি যখন চেরি পিক করার চেষ্টা করি তখন কমিটের সমস্ত কিছু ঠিক থাকে তবে গিটটি আপনাকে কোথাও বলবে না যে আপনি git cherry-pick --continue | --abort | --quitআবার চেরি-বাছাই করার চেষ্টা করার আগে আপনাকে কী করতে হবে। সুতরাং যদি আপনি চেরি-বাছাইয়ের সীমাবদ্ধতার জন্য আপনাকে git cherry-pick --continueপ্রদত্ত ব্যাপ্তি থেকে প্রতিশ্রুতিবদ্ধ হয়ে প্রতিবার প্রস্তুত হওয়ার (দ্বন্দ্বগুলি বা এই জাতীয় সমাধান করা) চালানোর দরকার হয় ।
কুস্কম্যান

আমি ঠিক একই কাজ করেছি তবে মারাত্মক: 'a..b' খুঁজে পাচ্ছি না
অমিত করণিক

আমি জানি না আমি কোথায় ভুল করছি কিন্তু যখন আমি 'গিট চেরি-পিক সি c .. চ' করি তখন এর মধ্যে কমিট সি অন্তর্ভুক্ত থাকে তবে কমিট সি হয় না। তবে আমি যেহেতু সর্বত্র পড়েছি, এটি সি এবং এফকে অন্তর্ভুক্ত হিসাবে সংজ্ঞায়িত করার কথা। নাকি আমি ভুল করছি?
স্যামুয়েল

@ সামুয়েল হ্যাঁ, এটি সঠিক। ^গ এর পরে প্রকৃত অর্থ "গ এর পূর্বে প্রতিশ্রুতিবদ্ধ" যা এই ক্ষেত্রে খ। এ কারণেই c^..fএর সমার্থক শব্দ b..f। করার চেষ্টা করুন git log c^..fএবং আপনাকে সিটির মাধ্যমে সিটি কমিটগুলি দেখতে হবে, ঠিক যেমনটি আপনি করেছেন ঠিক git log b..f
অ্যান্ডি

39

আপনার একত্রীকরণের জন্য নির্বাচনী সংশোধনী থাকলে, ক, এ, সি, এফ, জে, এ, বি, সি, ডি, ই, এফ, জি, এইচ, আই, জে কমিট করে নিন, কেবল নীচের কমান্ডটি ব্যবহার করুন:

গিটার চেরি পিক এসিএফজে


1
সুন্দর এবং সাধারণ
স্পিনআপ

21
git rev-list --reverse b..f | xargs -n 1 git cherry-pick

2
কোনও দ্বন্দ্ব না থাকলে নিখুঁতভাবে কাজ করে, অন্যথায় "পুনরায় চালু করা" সহজ হতে পারে কারণ এটি কোথায় থামেছে তা খুঁজে বের করতে হবে না এবং বাকী প্যাচগুলি পুনরায় প্রয়োগ করতে হবে।
রুসলান কাবালিন

6
এটি কী করছে তা ব্যাখ্যা করে মন্তব্য যুক্ত করুন
Mr_and_Mrs_D

7
যেহেতু কেউ ব্যাখ্যা করেনি ... গিট রেভিস্ট-লিস্টটি শাখা খ থেকে চ (বিপরীত) পর্যন্ত সমস্ত সংশোধনগুলি মুদ্রণ করে যাতে প্রতিটি লাইন (কমিট হ্যাশ) ক্রমক্রমে পাস করার পরে, চেরি প্রতিটিকে বর্তমান গিট হেডের উপরে নিয়ে যায়। অর্থাত্git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
কোডরেচেট

8

শাখার ডগা পর্যন্ত কমিট আইডি থেকে চেরি বাছাই করতে আপনি ব্যবহার করতে পারেন:

git cherry-pick commit_id^..branch_name


এটি ইতিমধ্যে স্ট্যাকওভারফ্লো.com
a/

1
এই উত্তরটি আসলে আলাদা এবং আমার পক্ষে সহায়ক ছিল। এটি শাখার নাম নির্দিষ্ট করে, চূড়ান্ত প্রতিশ্রুতি SHA নয় not
সাবলেট্রি

7

উল্লেখযোগ্য আরেকটি বৈকল্পিক হ'ল আপনি যদি nকোনও শাখা থেকে সর্বশেষ কমিট চান তবে ~বাক্য গঠনটি কার্যকর হতে পারে:

git cherry-pick some-branch~4..some-branch

এই ক্ষেত্রে উপরের কমান্ডটি একটি শাখা থেকে শেষ 4 টি কমিট বেছে নেবে some-branch(যদিও আপনি একটি শাখার নামের জায়গায় কমিট হ্যাশও ব্যবহার করতে পারেন)


1
খুব দরকারী উত্তর, আপনাকে ধন্যবাদ! :)
জেসেক ডিজিউর্ডজিকোভস্কি

3

আসলে, এটি করার সহজতম উপায় হ'ল:

  1. দুটি শাখার মধ্যে মার্জ-বেস রেকর্ড করুন: MERGE_BASE=$(git merge-base branch-a branch-b)
  2. পুরানো শাখাকে নতুন শাখায় দ্রুত-ফরওয়ার্ড বা পুনরায় চালু করুন
  3. 1 ম পদক্ষেপ থেকে মার্জ বেস থেকে শুরু করে ফলস্বরূপ শাখাটি নিজেই পুনরায় চালু করুন এবং পছন্দসই নয় এমন কমিটগুলি ম্যানুয়ালি মুছে ফেলুন:

    git rebase ${SAVED_MERGE_BASE} -i
    

    বিকল্পভাবে, যদি কেবল কয়েকটি নতুন কমিট থাকে তবে পদক্ষেপ 1 এড়িয়ে যান এবং সহজভাবে ব্যবহার করুন

    git rebase HEAD^^^^^^^ -i
    

    প্রথম পদক্ষেপে, ^মার্জ-বেসটি পেরিয়ে যাওয়ার জন্য যথেষ্ট পরিমাণে ব্যবহার করে ।

ইন্টারেক্টিভ রিবেসে আপনি এরকম কিছু দেখতে পাবেন:

pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f

তারপরে বি লাইনগুলি মুছে ফেলুন (এবং অন্য কোনও আপনি চান)



0

এখানে এমন একটি স্ক্রিপ্ট যা চেরি-বাছাই করতে একাধিক কমিটকে একপর্যায়ে অনুমতি দেবে কেবল সেই স্ক্রিপ্টটি জানিয়ে যা উত্স এবং চেরি বাছাইয়ের জন্য শাখা এবং টার্গেটের শাখাকে লক্ষ্য করে:

https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

আপনার শাখা থেকে মাস্টার হিসাবে চেরি-পিক করতে (উত্স হিসাবে বর্তমান শাখা ব্যবহার করে):

./gcpl.sh -m

চেরি-বাছাই করতে আপনার 6.19.x শাখা থেকে মাস্টার হিসাবে সর্বশেষ 5 টি প্রতিশ্রুতিবদ্ধ:

./gcpl.sh -c 5 -s 6.19.x -t master

আপনি সরাসরি গিট দিয়ে এটি করতে পারলে এই স্ক্রিপ্টটির কেন দরকার হবে? ...
কোড_ড্রেড

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