এক শাখা থেকে অন্য শাখায় কমিটগুলি কীভাবে অনুলিপি করবেন?


727

আমার মাস্টারের কাছ থেকে আমি দুটি শাখা পেয়েছি:

  • v2.1 : (সংস্করণ 2) আমি বেশ কয়েক মাস ধরে কাজ করছি
  • ডাব্লুএসএস : যে আমি গতকাল আমার মাস্টারের একটি নির্দিষ্ট বৈশিষ্ট্য যুক্ত করতে তৈরি করেছি (উত্পাদনে)

ডাব্লুএসএস থেকে v2.1 এ গতকালের কমিটগুলি অনুলিপি করার কোনও উপায় আছে কি?


: কেবল এক শাখা থেকে করে (অথবা করে একটি সীমার) অনুলিপি করতে এই উত্তরটি আমার সেরা সাহায্য stackoverflow.com/questions/1994463/...
caramba

উত্তর:


563

আপনার সত্যিই এমন একটি ওয়ার্কফ্লো থাকা উচিত যা আপনাকে মার্জ করে এই সব করতে দেয়:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

সুতরাং আপনাকে যা করতে হবে তা হ'ল git checkout v2.1এবং git merge wss। যদি কোনও কারণে আপনি সত্যিই এটি করতে না পারেন এবং আপনি আপনার ডাব্লুএসএস শাখাকে সঠিক জায়গায় নিয়ে যেতে গিট রিবেস ব্যবহার করতে না পারেন তবে কোথাও থেকে একটি একক প্রতিশ্রুতি গ্রহণ করতে এবং এটি অন্য কোথাও প্রয়োগ করার কমান্ডটি হ'ল গিট চেরি-পিক । আপনি যে শাখায় এটি প্রয়োগ করতে চান তা কেবল পরীক্ষা করে দেখুন এবং চালান git cherry-pick <SHA of commit to cherry-pick>

পুনঃবাসের কিছু উপায় আপনাকে রক্ষা করতে পারে:

যদি আপনার ইতিহাসটি এমন দেখাচ্ছে:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

আপনি git rebase --onto v2 v2-only wssডাব্লুএসএসকে সরাসরি ভি 2 এ স্থানান্তর করতে ব্যবহার করতে পারেন :

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

তাহলে আপনি একীভূত করতে পারেন! আপনি যদি সত্যিকার অর্থে সত্যই সত্যিকার অর্থে পৌঁছাতে না পারেন যেখানে আপনি একীভূত করতে পারেন তবে আপনি একবারে বেশ কয়েকটি চেরি-পিকগুলি কার্যকরভাবে কার্যকর করতে পুনরায় ব্যবহার করতে পারেন:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

দ্রষ্টব্য: এটি করার জন্য কিছু অতিরিক্ত কাজ করার কারণটি হ'ল এটি আপনার ভান্ডারটিতে সদৃশ কমিট তৈরি করছে। এটি সত্যিই খুব ভাল জিনিস নয় - সহজ শাখা এবং মার্জ করার পুরো বিষয়টি হ'ল এক জায়গায় প্রতিশ্রুতিবদ্ধ (গুলি) তৈরি করে এবং যেখানে যেখানে প্রয়োজন সেখানে মার্জ করে সমস্ত কিছু করতে সক্ষম হবেন। সদৃশ কমিটস এর অর্থ হ'ল এই দুটি শাখাকে কখনই মার্জ করবেন না (যদি আপনি পরে সিদ্ধান্ত নিতে চান তবে আপনি বিরোধ পাবেন)।


1
এই উত্তরের সাথে আরও একমত হতে পারে না। +1 টি। আরও দেখুন আমার পুরোনো উত্তর চেরি-অবচয় পরিণতি প্রকাশ করুন: stackoverflow.com/questions/881092/...
VonC

18
কিভাবে এই কাজ করতে উপর চমত্কার উত্তর সঠিক উপায়! আশা করি আমিও দু'বার এএসসিআইআই ডায়াগ্রাম তৈরির প্রচেষ্টাতে ভোট দিতে পারতাম।
5

@ ভনসি: সমর্থন এবং চেরি-বাছাই করতে হবে না সে সম্পর্কিত অতিরিক্ত তথ্যের জন্য ধন্যবাদ - আমি জানি আমি সেখানে কিছুটা ঝোঁক ফেলেছি। @ গোটজেনেস: ধন্যবাদ! আমি মনে করি এটি প্রচেষ্টার পক্ষে মূল্যবান - কেবল গিট-রিবেস মানচিত্রটি দেখুন। এটি ব্যাখ্যা করার মতো আরও ভাল উপায় নেই।
ক্যাসাবেল

আপনি কেন মার্জ করতে অক্ষম হতে পারেন - গিট মার্জ করা গিট-এসএনএন-এর সাথে ভাল খেলেন না। একটি এসভিএন শাখা থেকে অন্য একটিতে ধারাবাহিক প্রতিশ্রুতি অনুলিপি করতে, আমি তাদের চেরি-বাছাই করে শেষ করেছি এবং তারপরে আবার যুক্ত git-svn-idহওয়ার আগে ভুল উল্লেখগুলি মুছে ফেলার জন্য একটি ইন্টারেক্টিভ রিবেস / রেওয়ার্ড সম্পাদন করেছি dcommit। যদিও আমি সম্ভবত চেরি-বাছাই পদক্ষেপটি ছেড়ে যেতে পারতাম এবং কেবল নিজের দ্বারা একটি রিবেস ব্যবহার করতে পারি।
বব

1
এখানে আমার ব্যবহারের কেস: সমালোচনাযুক্ত বাগ সংশোধনগুলি বৈশিষ্ট্য শাখার প্রতিশ্রুতিবদ্ধ ছিল। আমার এখন এটি প্রযোজনায় যেতে মাস্টার দরকার। এটি আমার বাট সংরক্ষণ করবে।
ক্যাপ্টেন হাইপারটেক্সট

910

ব্যবহার

git cherry-pick <commit>

<commit>আপনার বর্তমান শাখায় আবেদন করতে ।

আমি নিজে সম্ভবত আমি যে কমিটগুলি গ্রহণ করব তা ক্রস-চেক করব gitkএবং তার পরিবর্তে সেখানে প্রতিশ্রুতি প্রবেশের ডান-ক্লিকগুলি দিয়ে তাদের চেরি-বাছাই করব।


আপনি যদি আরও স্বয়ংক্রিয়ভাবে যেতে চান (এর সমস্ত বিপদ সহ) এবং সমস্ত প্রতিশ্রুতি ধরে নিয়েছেন গতকাল যেহেতু ডাব্লুএসএসে ঘটেছে আপনি ব্যবহারের মাধ্যমে কমিটের তালিকা তৈরি করতে পারেন git log( --prettyজেফ্রোমির পরামর্শ দিয়ে)

git log --reverse --since=yesterday --pretty=%H

সুতরাং সবকিছু একসাথে আপনি ব্যবহার অনুমান করে bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

যদি এখানে কিছু ভুল হয়ে যায় (প্রচুর সম্ভাবনা রয়েছে) যেহেতু এটি লাইভ চেকআউটে কাজ করে আপনি সমস্যায় পড়েছেন, তাই হয় ম্যানুয়াল চেরি-পিকগুলি করুন বা জেফ্রমি প্রস্তাবিত রিবেস ব্যবহার করুন।


- ব্যাখ্যা বিকল্পের জন্য সমস্ত স্থানধারক গিট-লগ ম্যানপেজে রয়েছে। আপনি যে কোনও বিন্যাস চান তা পেতে পারেন - বিশেষত স্ক্রিপ্টের জন্য ক্ষেত্রগুলি সহজেই পার্সেবল আকারে পাওয়ার জন্য কার্যকর।
ক্যাসাবেল

আমি এটিও উল্লেখ করতে চাই, ধরে নিলাম আপনি সত্যই সদৃশ কমিটগুলি তৈরি করতে চান, git rebaseআমার উত্তরে ব্যবহার করা পদ্ধতিটি আরও দৃ more়। বিশেষত, এর জন্য একটি লুপ ব্যবহার করা, যদি চেরি-পিকগুলির মধ্যে কোনও একটি ব্যর্থ হয় তবে এটি বাকি সমস্তগুলি করার চেষ্টা করবে। এটি ... খুব খুব ভাল না, আসুন বলা যাক।
ক্যাসাবেল

2
একমত। এজন্য আমি কখনই এটি ব্যবহার করি না, তবে নিজেই এটি করি। তবে চেরি-পিক এখনও কমপক্ষে প্রশ্নের শিরোনামের উত্তর। আমি প্রতিক্রিয়া পরিবর্তন।
বেনজামিন ব্যানিয়ের

1
কেউ কোনও পুরানো / ভুল শাখায় প্রতিশ্রুতিবদ্ধ এবং চেরি-পিক আমাকে সেই প্রতিশ্রুতিটি ডান শাখায় রাখতে দেয় (এখনও তাদের দায়বদ্ধ হিসাবে রাখে) keeping পারফেক্ট।
প্যাট্রিক

8
একটি বিরল দর্শন, gitউত্তরটি উত্তরটির উত্তরসূচক এটি কতটা ভাল জানেন তা প্রমাণ করার জন্য গিটের জটিলতাগুলির মধ্য দিয়ে নষ্ট করার পরিবর্তে সমাধানের সহজ এবং সরল answer
প্রজেমেক ডি

74

git cherry-pick : কিছু বিদ্যমান কমিট দ্বারা প্রবর্তিত পরিবর্তনগুলি প্রয়োগ করুন

ধরুন আমাদের (এক্স, ওয়াই, জেড) কমিট সহ শাখা আছে । আমাদের এই কমিটগুলি বি শাখায় যুক্ত করতে হবে । আমরা cherry-pickঅপারেশন ব্যবহার করতে যাচ্ছি ।

যখন আমরা ব্যবহার cherry-pick, আমরা ডালে করে যোগ করা উচিত বি একই কালানুক্রমিকভাবে যে করে শাখা প্রদর্শিত একটি

চেরি-পিক অনেকগুলি কমিটকে সমর্থন করে, তবে আপনি যদি এই ব্যাপ্তিতে কমিট করে থাকেন তবে তা সত্যিই জটিল হয়ে যায়

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

কর্মপ্রবাহের উদাহরণ:

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

আমরা বিকল্পগুলিরcherry-pick সাথে ব্যবহার করতে পারি

-e বা --edit : এই বিকল্পের সাহায্যে গিট চেরি-পিক আপনাকে প্রতিশ্রুতিবদ্ধ হওয়ার আগে কমিট বার্তা সম্পাদনা করতে দেয়।

-n বা --no-কমিট : সাধারণত কমান্ডটি স্বয়ংক্রিয়ভাবে কমিটের ক্রম তৈরি করে। এই পতাকাটি কোনও প্রতিশ্রুতি ছাড়াই, আপনার কার্যকরী গাছ এবং সূচকে প্রতিটি নামযুক্ত প্রতিশ্রুতি চেরি-বাছাইয়ের জন্য প্রয়োজনীয় পরিবর্তনগুলি প্রয়োগ করে। তদ্ব্যতীত, যখন এই বিকল্পটি ব্যবহার করা হয়, আপনার সূচকগুলি হ্যাড কমিটের সাথে মেলে না। চেরি-পিক আপনার সূচকের সূচনা অবস্থার বিরুদ্ধে করা হয়।

একটি আকর্ষণীয় এখানে নিবন্ধ বিষয়ে cherry-pick


19

আপনি যে কমিটগুলি অনুলিপি করতে চান এবং প্যাচটি গন্তব্য শাখায় প্রয়োগ করতে চান তা থেকে আপনি একটি প্যাচ তৈরি করতে পারেন ।


16
এমনকি যদি কোনো কারণে আপনি কি সত্যিই ব্যবহার প্যাচ (গুলি) পরিবর্তে করতে চান (গুলি) / রি-বেসের ফলে তার সাথে কি সহজবোধ্য উপায় চেরি-বাছাই git format-patch <revision range>এবং git am *.patch
ক্যাসকেবেল

এটি checkoutঅন্য একটি শাখা প্রয়োজন ।
কুলমাইন্ড

12

বা আপনি যদি প্রচারকের পক্ষে কিছুটা কম থাকেন তবে আমি যেভাবে ব্যবহার করছি তা আপনি খানিকটা কুৎসিতভাবে করতে পারেন। ডিপ্লয়_টেমপ্লেটে কমিটস রয়েছে যা আমি শাখা মোতায়েন হিসাবে আমার মাস্টারে অনুলিপি করতে চাই

git branch deploy deploy_template
git checkout deploy
git rebase master

এটি deploy_template এ নতুন শাখা মোতায়েন তৈরি করতে (আমি বিদ্যমান ডিপ্লয় শাখাটি ওভাররাইট করার জন্য -f ব্যবহার করি) তৈরি করব, তারপরে এই নতুন শাখাকে মাস্টারের উপর পুনর্বাসিত করুন, deploy_templateটিকে বাছাই রেখে।


1

শাখার ডাব্লুএসএস থেকে কেবল শেষ কমিটটি অনুলিপি করার সহজ ক্ষেত্রে, কমিট আইডি ( git log --oneline | head -n 1) ধরে ফেলুন এবং করুন:

git checkout v2.1
git merge <commit>

এর জন্য অন্য একটি শাখায় চেক আউট করা দরকার।
কুলমাইন্ড

1

চেরি-পিক কমান্ডটি স্ট্যান্ডার্ড ইনপুট থেকে কমিটের তালিকাটি পড়তে পারে।

নিম্নলিখিত কমান্ড চেরি-পিকস জন জন দ্বারা রচিত যে "বিকাশ" শাখায় বিদ্যমান তবে "রিলিজ" শাখায় নেই, এবং কালানুক্রমিক ক্রমে এটি করেছে John

git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.