গিটে একটি নির্দিষ্ট প্রতিশ্রুতি কীভাবে মার্জ করবেন


1034

আমি গিটহাবের একটি সংগ্রহশালা থেকে একটি শাখা কাঁটাচামচ করেছি এবং আমার কাছে নির্দিষ্ট কিছু প্রতিশ্রুতিবদ্ধ করেছি। এখন আমি দেখতে পাই যে মূল সংগ্রহস্থলের একটি ভাল বৈশিষ্ট্য ছিল যা ছিল HEAD

আমি কেবল পূর্ববর্তী কমিটগুলি ছাড়াই এটি মার্জ করতে চাই। আমার কি করা উচিৎ? আমি জানি সমস্ত প্রতিশ্রুতিগুলি কীভাবে মার্জ করা যায়:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

আপনি যদি গিথুব সম্পর্কিত এটি করার চেষ্টা করছেন, এই নিবন্ধটি আপনাকে এটির মাধ্যমে পদক্ষেপ নেবে। চিহ্নসুলিভান.কম
how-

উত্তর:


1173

' git cherry-pick' এখানে আপনার উত্তর হওয়া উচিত।

বিদ্যমান অঙ্গীকার দ্বারা প্রবর্তিত পরিবর্তন প্রয়োগ করুন।

এই পোস্টে চেরি-বাছাইয়ের ফলাফল সম্পর্কে বিডনলানের উত্তর পড়তে ভুলবেন না :
"একটি শাখা থেকে সমস্ত প্রতিশ্রুতি টানুন, নির্দিষ্ট প্রতিশ্রুতি অন্যকে ধাক্কা দিন" , যেখানে:

A-----B------C
 \
  \
   D

হয়ে:

A-----B------C
 \
  \
   D-----C'

এই প্রতিশ্রুতিযুক্ত সমস্যাটি হ'ল গিটটি সমস্ত ইতিহাস তাদের আগে অন্তর্ভুক্ত করার প্রতিশ্রুতিগুলি বিবেচনা করে

যেখানে সি'র আলাদা SHA-1আইডি রয়েছে।
তেমনিভাবে, চেরি একটি শাখা থেকে অন্য শাখায় প্রতিশ্রুতি বাছাইয়ে মূলত একটি প্যাচ তৈরি করা জড়িত, তারপরে এটি প্রয়োগ করা হয়, এভাবে ইতিহাসকে সেভাবে হারাতে হবে।

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


1
@ ওপেনিডে000: "আরও সূক্ষ্ম শস্যযুক্ত শাখা": যা হ'ল বিডনলান তার উত্তরে পরামর্শ করেছিলেন।
ভোনসি

8
দ্রষ্টব্য: "গিট রিবেস" SHA-1 পরিবর্তন করে changes "গিট রিবেস বনাম গিট মার্জ ( স্ট্যাকওভারফ্লো / সেকশনস / 80০৪115/ git-rebase-vs-git- विसার ) এবং" গিট ওয়ার্কফ্লো "( স্ট্যাকওভারফ্লো / সিকিউশনস / 457927/… ) ক্ষেত্রে" গিট রিবেস "দেখুন "বৈধ।
ভোনসি

1
"সূক্ষ্ম দানাদার শাখা", "চেরি-পিক" এবং "রিবেস" এর মধ্যে আপনার পরে গিট সহ শাখায় কোড পরিচালনার জন্য সমস্ত সম্ভাবনা থাকবে।
ভনসি

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

1
তবে মনে রাখবেন যে আপনি যখন মার্জ করবেন, তখন সি 'এবং সি উভয় অঙ্গীকারের ইতিহাসে বিজয়ী হবে।
রাহুল শাহ

738

আপনি নিজের বর্তমান শাখায় নিজেই একক প্রতিশ্রুতি প্রয়োগ করতে গিট চেরি-পিক ব্যবহার করতে পারেন।

উদাহরণ: git cherry-pick d42c389f


68
চেরি বাছাইতে আপনার প্রাক্তন পোস্টের জন্য +1 ( স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / ৮৮০৯77/২ )। উপরের আমার নিজের উত্তরে এর একটি এক্সট্রাক্ট অনুলিপি করার জন্য আমি স্বাধীনতা নিয়েছি।
ভনসি

4
সম্ভবত git cherry-pick d42cবা git cherry-pick d42c3 কাজ করবে। গিট স্মার্ট। ;)
guneysus

2
মারাত্মক: খারাপ সংশোধন
আইভজেন নায়দা

2
আমি এই কমান্ডটি সবেমাত্র সম্পাদন করেছি এবং মনে হয় এটি কার্যকর হয়েছে, তবে যখন আমি গিট স্ট্যাটাসটি করি তখন এটি "প্রতিশ্রুতিবদ্ধ হওয়ার মতো কিছুই নয়, কাজ করে গাছ পরিষ্কার" বলে says আমি যখন আমার বিটবাকেটের ওয়েব পৃষ্ঠায় কমিট পৃষ্ঠাটি রিফ্রেশ করি তখন তা প্রদর্শিত হয় না। আমি যখন গিট লগটি সম্পাদন করি তখন এটি উপস্থিত হয়। এবং আমি সংশোধিত কোড দেখতে পাচ্ছি। আমাকে যদি কোনও অতিরিক্ত পদক্ষেপ করতে হয় তবে কেউ ব্যাখ্যা করতে পারেন?
রায়

1
দুর্ভাগ্যক্রমে এই প্রশ্নের উত্তর দেয় না: এটি আসলে মার্জ তৈরি করে না। এখানে কোনও পূর্বসূরি ইশারা করছে না d42c389f। হয়তো ওপি প্রতি সেবার একত্রীকরণের বিষয়ে চিন্তা করে নি, তবে মাঝে মাঝে তফাতটি গুরুত্বপূর্ণ।
LarsH

29

আসুন একটি উদাহরণ নেওয়ার চেষ্টা করুন এবং বুঝতে:

আমার একটি শাখা আছে, মাস্টার বলুন , এক্স <কমিট-আইডি> তে ইশারা করে, এবং আমার কাছে একটি নতুন শাখা রয়েছে ওয়াই <শ 1> এর দিকে নির্দেশ করে।

যেখানে Y <commit-id> = <মাস্টার> শাখা কমিট করে - কম কমিট করে

এখন ওয়াই শাখার জন্য বলুন আমাকে মাস্টার শাখা এবং নতুন শাখার মধ্যকার কমিট ফাঁক করে দিতে হবে। নীচে আমরা অনুসরণ করতে পারি যে পদ্ধতি:

ধাপ 1:

git checkout -b local origin/new

স্থানীয় যেখানে শাখার নাম। যে কোনও নাম দেওয়া যায়।

ধাপ ২:

  git merge origin/master --no-ff --stat -v --log=300

মাস্টার শাখা থেকে নতুন শাখায় কমিটগুলি মার্জ করুন এবং সর্বাধিক <n> আসল কমিটগুলি যেগুলি মার্জ করা হচ্ছে তা থেকে এক-লাইন বিবরণ দিয়ে লগ বার্তার একটি মার্জ কমিট তৈরি করুন।

গিট মার্জ সম্পর্কে আরও তথ্য এবং পরামিতিগুলির জন্য, দয়া করে এখানে উল্লেখ করুন:

git merge --help

এছাড়াও যদি আপনার কোনও নির্দিষ্ট প্রতিশ্রুতি মার্জ করতে হয় তবে আপনি ব্যবহার করতে পারেন:

git cherry-pick <commit-id>

আপনি কি Yআপনার 3 ডি বাক্যে সংজ্ঞাটি পরিবর্তন করেছেন ? "আমার কাছে একটি নতুন শাখা রয়েছে যা ওয়াই" এর দিকে ইঙ্গিত করছে "এখন" ওয়াই শাখার জন্য বলুন ", মনে হচ্ছে যে ওয়াই প্রতিশ্রুতিবদ্ধ ছিল এবং তারপরে এটি একটি শাখায় পরিণত হয়েছিল
শুক্রবার

আমি যে শাখার
সংশ্লেষ

3

আমার ব্যবহারের ক্ষেত্রে আমাদের সিআই সিডির অনুরূপ প্রয়োজন ছিল। আমরা বিকাশ এবং মাস্টার শাখা সহ গিট ফ্লো ব্যবহার করি used বিকাশকারীরা সরাসরি উন্নত করতে বা কোনও বৈশিষ্ট্য শাখা থেকে একটি পুল অনুরোধের মাধ্যমে পরিবর্তনগুলিতে সেখানে মার্জ করতে মুক্ত to তবে মাস্টার করার জন্য আমরা জেনকিন্সের মাধ্যমে একটি স্বয়ংক্রিয় উপায়ে কেবল বিকাশ শাখা থেকে স্থিতিশীল কমিটগুলি মার্জ করি।

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

একটি নমুনা কোড স্নিপেট:

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

git pull  // Just to pull any changes.
git branch local-<commitd-id> <commit-id>  // Create a branch from the given commit-id
git merge local-<commit-id>  // Merge that local branch to master.
mvn clean verify   // Verify if the code is build able
mvn <any args> release:clean release:prepare release:perform // Release artifacts
git push origin/master  // Push the local changes performed above to origin.
git push origin <tag>  // Push the tag to origin

এটি আপনাকে নির্ভীক সংশ্লেষ বা সংঘাতের নরকে সম্পূর্ণ নিয়ন্ত্রণ দেয় give

আরও ভাল বিকল্প আছে ক্ষেত্রে পরামর্শ নির্দ্বিধায়।


3

শীর্ষস্থানীয় উত্তরগুলি কীভাবে একটি নির্দিষ্ট কমিট থেকে বর্তমান শাখায় পরিবর্তনগুলি প্রয়োগ করতে পারে তা বর্ণনা করে । যদি আপনি "কীভাবে একত্রীভূত হন" বলতে বোঝাতে চান তবে তাদের পরামর্শ অনুসারে কেবল চেরি-পিকটি ব্যবহার করুন।

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

সত্যিকারের একত্রীকরণের ইতিহাস থাকা বাঞ্ছনীয় হতে পারে, উদাহরণস্বরূপ, যদি আপনার বিল্ড প্রক্রিয়াটি সাম্প্রতিক ট্যাগের (ব্যবহারের git describe) উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে সংস্করণ স্ট্রিং সেট করতে গিট বংশের সুবিধা গ্রহণ করে ।

চেরি-পিকের পরিবর্তে, আপনি একটি বাস্তব করতে পারেন git merge --no-commitএবং তারপরে আপনি চান না এমন কোনও পরিবর্তন মুছে ফেলার জন্য ম্যানুয়ালি সূচকটি সামঞ্জস্য করুন।

মনে করুন আপনি শাখায় Aরয়েছেন এবং আপনি শাখার ডগায় প্রতিশ্রুতিটি মার্জ করতে চান B:

git checkout A
git merge --no-commit B

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

(একত্রীকরণের আগে ওয়ার্কিং ডিরেক্টরি এবং সূচীটিকে ঠিক আগের মতো করে সেট করার সহজ উপায় হতে পারে, যাতে আপনার একটি পরিষ্কার স্লেট থাকে যা আপনি প্রথমে চাওয়া কমিটিকে চেরি-বাছাই করতে পারেন But তবে আমি কিভাবে যে পরিষ্কার স্লেট অর্জনে জানি না। git checkout HEADএবংgit reset HEAD উভয় একত্রীকরণ রাষ্ট্র সরাবে, এই পদ্ধতির উদ্দেশ্য পরাজিত।)

সুতরাং ম্যানুয়ালি অযাচিত পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনুন। উদাহরণস্বরূপ, আপনি পারে

git revert --no-commit 012ea56

প্রতিটি অযাচিত প্রতিশ্রুতি জন্য 012ea56

আপনি জিনিসগুলি সমন্বয় শেষ করার পরে, আপনার প্রতিশ্রুতি তৈরি করুন:

git commit -m "Merge in commit 823749a from B which tweaked the timeout code"

এখন আপনার কাছে কেবলমাত্র যে পরিবর্তন আপনি চেয়েছিলেন এবং পিতৃপুরুষ গাছগুলি দেখায় যে আপনি প্রযুক্তিগতভাবে বি থেকে মিশে গিয়েছিলেন

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