গিট - মার্জ করার সময় নির্দিষ্ট কমিটগুলি এড়িয়ে যাওয়া


200

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

আমার দুটি শাখা আছে যা বলে মাস্টার 10 (ভি 1 এর জন্য) এবং মাস্টার 20 (ভি 2 এর জন্য)। আমি শাখা মাস্টার 10 এ v1 এ বাগ ফিক্সগুলি তৈরি করেছি এবং মাস্টার 20 এর নতুন স্টাফ বিকাশ করছি। আমি যখনই কোনও বাগ ফিক্স করি তখনই আমি মাস্টার 20 পরীক্ষা করে এবং এটি করে v2 এ একীভূত করি git merge master10। এ পর্যন্ত সব ঠিকই.

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

আমি ভেবেছিলাম git rebaseআমার যা প্রয়োজন তা হতে পারে তবে ডকটি পড়ুন এবং আমার মাথাটি প্রায় ফেটে গেল।

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

কোন সাহায্য প্রশংসা।

উত্তর:


289

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

সুতরাং ধরা যাক রক্ষণাবেক্ষণে 5 টি পরিবর্তন হয়েছে এবং এর মধ্যে একটি (রক্ষণাবেক্ষণ ~ 3) আবার মাস্টারে একত্রীকরণ করা উচিত নয়, যদিও অন্য সমস্ত হওয়া উচিত। আপনি এটি তিনটি পর্যায়ে করেন: প্রকৃতপক্ষে এটির আগে সমস্ত কিছু মার্জ করুন, রক্ষণাবেক্ষণ ~ 3 চিহ্নিত না করার পরেও গিটকে বলুন এবং তারপরে বাকীগুলিকে মার্জ করুন। যাদুটি হ'ল:

bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint

মাস্টারের উপর আপনার সমস্যাজনক রক্ষণাবেক্ষণের আগে প্রথম কমান্ড সমস্ত কিছু একীভূত করে । ডিফল্ট মার্জ লগ বার্তাটি ব্যাখ্যা করবে যে আপনি "শাখা 'রক্ষণাবেক্ষণ (প্রাথমিক অংশ)" মার্জ করছেন।

দ্বিতীয় কমান্ড সমস্যাযুক্ত রক্ষণাবেক্ষণ ~ 3 প্রতিশ্রুতিটি মার্জ করে, তবে "-স আওয়ারস" বিকল্পটি গিটকে একটি বিশেষ "মার্জ কৌশল" ব্যবহার করতে বলে যা বাস্তবে আপনি যে গাছটিতে মার্জ করছেন তা কেবল সংরক্ষণ করে এবং প্রতিশ্রুতিগুলি উপেক্ষা করে কাজ করে ) আপনি সম্পূর্ণ মার্জ করছেন ging তবে এটি এখনও হেডের সাথে একটি নতুন মার্জ কমিট এবং পিতামাতার হিসাবে ~ 3 রক্ষণাবেক্ষণ করে না, তাই পুনর্বিবেচনা গ্রাফটি এখন বলে যে রক্ষণাবেক্ষণ ~ 3 একত্রীকরণ করা হয়েছে। সুতরাং প্রকৃতপক্ষে আপনি সম্ভবত 'গিট মার্জ' করার জন্য -m বিকল্পটি ব্যবহার করতে চান, এটি বোঝাতে যে রক্ষণাবেক্ষণ ~ 3 কমিটটি আসলে উপেক্ষা করা হচ্ছে!

চূড়ান্ত কমান্ডটি বাকী রক্ষণাবেক্ষণ (রক্ষণাবেক্ষণ ~ 2..maint) কেবলমাত্র মাস্টারে একত্রিত করে দেয় যাতে আপনারা আবার সিঙ্ক আপ হয়ে যান।


5
আমি মনে করি যে যদি আপনাকে এই প্রতিশ্রুতিটি মার্জিন স্থগিত করতে হয় তবে আপনার এটিকে এড়িয়ে যাওয়া (মার্জ-ওস অফ আওয়ার) বাদে আপনার পছন্দ নেই এবং পরে চেরি-পিক কমান্ডটি ব্যবহার করে এটি প্রয়োগ করুন। প্রতিশ্রুতি একবার মাস্টার থেকে পৌঁছনীয় হয়ে গেলে, এটি আবার একীভূত হতে পারে না - একই পরিবর্তনকে দু'বার মার্জ করা এড়ানো প্রধান গিট লক্ষ্যগুলির মধ্যে একটি।
আরাকনিদ

3
আপনার উপ-শাখার উদাহরণ সম্পর্কে: আমি সন্দেহ করি যে একবার আপনি উপ-শাখাটি মার্জ করে দিলে আপনি আমার পোস্টের দ্বিতীয় ধাপের পরে যেমন হবেন ঠিক ঠিক তেমন পরিস্থিতিতে আপনি। অতিরিক্ত শাখা তৈরি করায় সম্পর্কের ক্ষেত্রে কোনও পার্থক্য নেই।
আরাকনিদ

5
মাত্র আগ্রহের বাইরে, আপনি যদি কেবল একটি পরিবর্তন বাদ দিতে চান তবে কেন আপনি কেবল একটি একত্রীকরণ করবেন না এবং তিনটি সংযুক্তি সম্পাদন না করে কেবল সেই এক পরিবর্তনটি ফিরিয়ে দেবেন কেন? এর ফলে কম সংস্থাগুলির সংগ্রহস্থলের প্রতি প্রতিশ্রুতিবদ্ধ হওয়া এবং আরও সুস্পষ্ট ইতিহাসের ফলাফল হবে।
মার্ক বুথ

3
কমিটসকে স্পষ্টভাবে নামকরণ করা প্রায়শই সহজ। সুতরাং আপনাকে কেবল মার্জ হওয়া শাখার গিট লগটি দেখতে হবে এবং অঙ্গীকারের হ্যাশগুলি নোট করতে হবে যা একীভূত করা উচিত নয় এবং এর আগে একটি - গণনা গণনার পরিবর্তে ...
zwirbeltier

14
@ মারকবুথ: আপনি যে শাখাটি মার্চ করতে চান তা যে শাখায় মার্জ করতে চান তার সাথে বিশাল বিরোধ হতে পারে the দ্বন্দ্বগুলি সংশোধন করার পরিবর্তে কেবল এটিকে
এড়ানো সহজ

39

আইএমএইচও, সবচেয়ে যুক্তিসঙ্গত কাজ হ'ল সমস্ত কিছু মার্জ করা এবং তারপরে এটি মুছতে গিট রিভার্ট (কমিট_ইউ_ডন্ট_ওয়ান্ট) ব্যবহার করুন

উদাহরণ:

git merge master
git revert 12345678

আপনার যদি একাধিক "এ-উপেক্ষা" কমিট করে থাকে বা রিভার্ট বার্তাটি সম্পাদনা করতে চান:

git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"

তারপরে আপনার ইতিহাসটি দেখতে পারে:

| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_branch'

যদি আপনার কেবলমাত্র এই "থেকে অগ্রাহ্য" কমিট সম্পর্কে জড়িত বিরোধ রয়েছে তবে আপনি ব্যবহার করতে পারেন:

git merge master -X ours

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

যদি কেবলমাত্র "থেকে উপেক্ষা" করার প্রতিশ্রুতি না দিয়ে দ্বিধা তৈরি হয় তবে আপনার সেগুলি ম্যানুয়ালি সমাধান করা উচিত এবং পুনরায় ফেরার সময় আপনাকে সম্ভবত এগুলি আবার সমাধান করতে হবে।


2
আপনি যদি পরে সেই বিবর্তিত প্রতিশ্রুতিগুলিকে পরে শাখায় একীভূত করতে চান তবে গিট কি তাদের এড়িয়ে যাবেন?
অ্যানারিট মাইবার্গ

@ অ্যানারিস্টে মাইবার্গ আপনি পুনর্বিবেচনা প্রতিশ্রুতিগুলি পরে তাদেরকে একত্রে ফিরিয়ে আনতে পারবেন - এমন কিছু যা আপনি "মেশানো-আমাদের আমাদের" কৌশলটি দিয়ে খুব সহজেই করতে পারবেন না।
লিলি চুং

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

17

কমিটের মধ্যে বংশধর অন্তর্ভুক্ত। পূর্বের কমিটগুলি মার্জ না করে আপনি কোনও কমিটকে মার্জ করতে পারবেন না।

আপনি অবশ্যই চেরি-বাছাই করতে পারেন। আপনার যখন শাখা থাকে রক্ষণাবেক্ষণ মোডে তখন এটি একটি সূক্ষ্ম প্রবাহ।


1
ধন্যবাদ, চেরি পিক কাজটি করবে। আমি যা আশা করেছিলাম ততটা সুন্দর নয় তবে তা করবে।
ব্র্যাড রবিনসন


3

আমার প্রকল্পের জন্য এক ধরণের বিজ্ঞাপন যা মূলত @ আরাকনিড দ্বারা বর্ণিত প্রক্রিয়াটি মোড়বে।

এটি এক ধরণের সহায়ক যা নিম্নলিখিত জিআইটি প্রবাহকে পরিচয় করিয়ে দেয়:

  • রক্ষণাবেক্ষণ শাখাগুলি থেকে দেব / মাস্টার শাখায় মার্জড থাকার বিষয়ে দৈনিক / সাপ্তাহিক বিজ্ঞপ্তি রয়েছে
  • শাখা রক্ষণাবেক্ষণকারী স্থিতির জন্য যাচাই করে এবং তাকে সিদ্ধান্ত দেয় যে সমস্ত অঙ্গীকারের প্রয়োজন হয় কিনা এবং সেগুলি কিছু ব্লক করে দেয় বা বিকাশকারীদের নিজেদের ব্লক করতে বলে। শেষ রক্ষণাবেক্ষণ শাখাটি উপস্টিয়ামে একীভূত হয়।

প্রকল্প পৃষ্ঠা থেকে একটি উদ্ধৃতি:

কর্মপ্রবাহের উপর নির্ভর করে মাস্টার ব্রাঞ্চের সাথে রক্ষণাবেক্ষণ বা গ্রাহক-নির্দিষ্ট শাখা থাকা সম্ভব। এই শাখাগুলিকে এলটিএস শাখাও বলা হয়।

প্রায়শই হট ফিক্সগুলি সেই শাখাগুলিতে চলে যায় যেখানে বাগটি রিপোর্ট করা হয়েছিল এবং তারপরে কমিটকে মাস্টার শাখায় একীকরণ করা হয়।

সাধারণ অনুশীলন হ'ল সমস্ত শাখাকে মাস্টারের সাথে নিখুঁতভাবে সিঙ্ক্রোনাইজ করা হয়, অর্থাত্ মাস্টারের সমস্ত বৈশিষ্ট্য এবং বাগফিক্স রয়েছে কিনা তা বোঝার জন্য আপনি একটি নির্দিষ্ট শাখা এবং মাস্টারের মধ্যে একটি পরিষ্কার ব-দ্বীপ দেখতে চান।

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

রক্ষণাবেক্ষণ শাখায় মাস্টার থেকে চেরি-বাছাইয়ের ক্ষেত্রে ফলস্বরূপ প্রতিশ্রুতি মাস্টারকে অবরুদ্ধ করা হবে।


0

মাস্টার 10 এ নয় তবে মাস্টার 20 এ আপনি যে পরিবর্তনগুলি চান তার জন্য একটি তৃতীয় শাখা তৈরি করুন। সর্বদা সর্বাধিক স্থিতিশীল শাখা মাস্টার 10 কে আপনার "মাস্টার" হিসাবে বিবেচনা করুন। শাখাটি অন্যান্য সমস্ত শাখা সর্বদা সমন্বয় করতে চায়।


আমার ধারণা এটি কাজ করতে পারে তবে আমি ইতিমধ্যে নিজেকে এই অবস্থায় নিয়ে এসেছি এবং তৃতীয় একটি শাখা সম্ভবত আমাকে আরও বিভ্রান্ত করবে। :)
ব্র্যাড রবিনসন

0

এই ক্ষেত্রে revertবা তার পরিবর্তে cherry-pick, আপনি যে পরিবর্তনগুলি করেছেন তার চেয়ে বয়স্ক হওয়ার জন্য আপনি যে পরিবর্তনগুলি এড়াচ্ছেন তা বিবেচনা করার জন্য আপনার গিট দরকার।

তাই:

  1. যে প্রতিশ্রুতিগুলি আপনি এড়াতে চান তার আগে শেষ প্রতিশ্রুতিটি মার্জ করুন। এটি অবশ্যই পূর্বে সমস্ত প্রতিশ্রুতি একীভূত করবে। git merge ccc
  2. আপনি যে মন্তব্যগুলি এড়াতে চান তা মার্জ করুন। git merge fff --no-commit
  3. কোনও মার্জ পর্যায়ক্রমে, সমস্ত পরিবর্তন আনস্টেজ করুন, সমস্ত পরিবর্তনকে পূর্বাবস্থায় ফিরিয়ে আনুন। (সম্ভবত এটির জন্য বোকা-প্রমাণ আদেশ রয়েছে, তবে আমি কেবল এই অংশটি একটি ইউআইতে করবো - তবে আপনি কীভাবে জানেন)
  4. খালি মার্জ সম্পূর্ণ করুন git merge --continue
  5. আপনি যেটি এড়াতে চেয়েছিলেন তার পরে কমিটগুলি মার্জ করুন। git merge source-branch-head

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

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