এই উত্তরটির সাথে সত্যিই সম্পর্কিত নয়, তবে আমি খাঁজ দেব git pull
, যা কেবল git fetch
অনুসরণ করে চলে git merge
। আপনি তিনটি মার্জ করছেন, যা আপনার গিটকে তিনটি আনার ক্রিয়াকলাপ চালিয়ে যাচ্ছে, যখন একটি আনতে গেলে আপনার প্রয়োজন হবে। সুতরাং:
git fetch origin # update all our origin/* remote-tracking branches
git checkout demo # if needed -- your example assumes you're on it
git merge origin/demo # if needed -- see below
git checkout master
git merge origin/master
git merge -X theirs demo # but see below
git push origin master # again, see below
কৌশলযুক্ত মার্জ নিয়ন্ত্রণ করা ling
এখানে সবচেয়ে আকর্ষণীয় অংশ git merge -X theirs
। Root545 হিসাবে উল্লিখিত হয়েছে , -X
বিকল্পগুলি মার্জ কৌশলটিতে প্রেরণ করা হবে এবং ডিফল্ট recursive
কৌশল এবং বিকল্প resolve
কৌশল উভয়ই নেয় -X ours
বা -X theirs
(এক বা অন্য, তবে উভয়ই নয়)। তারা কী করে তা বোঝার জন্য, আপনাকে জানতে হবে যে গিট কীভাবে বিবাদগুলিকে সন্ধান করে এবং আচরণ করে ।
বেস সংস্করণ বর্তমানের উভয় (স্থানীয়, এইচএইডি, বা বলা হয় ) সংস্করণ এবং একই ফাইলের অন্য (যা দূরবর্তী বা বলা হয় ) সংস্করণ থেকে পৃথক হয় যখন কোনও ফাইল 1 এর মধ্যে একীভূত সংঘাত দেখা দেয় । এটি হল, মার্জটি তিনটি সংশোধন (তিনটি কমিট) সনাক্ত করেছে: বেস, আমাদের এবং তাদের। "বেস" সংস্করণটি আমাদের প্রতিশ্রুতিবদ্ধ এবং তাদের প্রতিশ্রুতিবদ্ধদের মধ্যে একীভূত বেস থেকে, যেমন প্রতিশ্রুতি গ্রাফে পাওয়া গেছে (এর জন্য আরও অনেক কিছু দেখুন, অন্যান্য স্ট্যাকওভারফ্লো পোস্টিংগুলি দেখুন)। গিট এর পরে দুটি সেট পরিবর্তনের সন্ধান করেছে: "আমরা কী করেছি" এবং "তারা কী করেছে"। এই পরিবর্তনগুলি (সাধারণভাবে) একটি লাইন বাই লাইনে পাওয়া যায়, নিখুঁত পাঠ্য--ours
--theirs
ভিত্তি। গিট ফাইলের বিষয়বস্তু সম্পর্কে সত্যিকারের উপলব্ধি করতে পারে না; এটি কেবল পাঠ্যের প্রতিটি লাইনকে তুলনা করে।
এই পরিবর্তনগুলি git diff
হ'ল আউটপুট যা আপনি দেখেন এবং বরাবরের মতো সেগুলির প্রসঙ্গও রয়েছে। এটি সম্ভবত সম্ভব যে আমরা পরিবর্তিত জিনিসগুলি তাদের পরিবর্তিত জিনিসগুলির থেকে পৃথক লাইনে রয়েছে, যাতে পরিবর্তনগুলি মনে হয় যেন তারা সংঘর্ষে নেমে না, তবে প্রসঙ্গটিও পরিবর্তিত হয়েছে (উদাহরণস্বরূপ, আমাদের পরিবর্তনের ফলে ফাইলটির উপরের বা নীচের অংশে রয়েছে, যাতে ফাইলটি আমাদের সংস্করণে ফুরিয়ে যায় তবে তাদের তালিকায় তারা উপরে বা নীচে আরও পাঠ্য যোগ করেছে)।
পরিবর্তন ঘটতে থাকে বিভিন্ন লাইন-জন্য উদাহরণস্বরূপ, আমরা পরিবর্তন color
করতে colour
লাইন 17 এবং তারা পরিবর্তন fred
করতে barney
লাইনে 71 তারপর কোন দ্বন্দ্ব নেই: গীত কেবল লাগে উভয় পরিবর্তন। যদি পরিবর্তনগুলি একই লাইনে ঘটে তবে একই রকম পরিবর্তন হয় তবে গিট পরিবর্তনের একটি অনুলিপি গ্রহণ করে। যদি পরিবর্তনগুলি একই লাইনে থাকে তবে ভিন্ন পরিবর্তন হয় বা হস্তক্ষেপের প্রসঙ্গের সেই বিশেষ ক্ষেত্রে, আপনি কি সংশোধন / সংশোধন বিরোধ পাবেন।
-X ours
এবং -X theirs
আমাদিগের, অথবা তাদের: বিকল্প কিভাবে এই সংঘাতের সমাধান করতে, মাত্র দুই পরিবর্তনের এক অবচয় দ্বারা গীত বলুন। যেহেতু আপনি বলেছেন যে আপনি (আমাদের) demo
তাদের সাথে (তাদের) মার্জ করছেন master
এবং এর থেকে পরিবর্তনগুলি চান demo
, আপনি চাইবেন -X theirs
।
অন্ধভাবে আবেদন -X
করা বিপজ্জনক। কেবলমাত্র আমাদের পরিবর্তনগুলি লাইন বাই লাইন ভিত্তিতে বিরোধ সৃষ্টি করে নি তার অর্থ এই নয় যে আমাদের পরিবর্তনগুলি আসলে সংঘাত নয়! একটি ক্লাসিক উদাহরণ ভেরিয়েবল ডিক্লেয়ারেশন সহ ভাষাগুলিতে ঘটে। বেস সংস্করণটি একটি অব্যবহৃত ভেরিয়েবল ঘোষণা করতে পারে:
int i;
আমাদের সংস্করণে, আমরা একটি সংকলক সতর্কতা দূরে সরাতে অব্যবহৃত ভেরিয়েবলটি মুছে ফেলি — এবং তাদের সংস্করণে তারা i
লুপ কাউন্টার হিসাবে ব্যবহার করে কিছু লাইন পরে যুক্ত করে । যদি আমরা দুটি পরিবর্তন একত্রিত করি, ফলাফল কোড আর সংকলন করে না। -X
বিকল্প যেহেতু পরিবর্তন এখানে আর সাহায্য বিভিন্ন লাইন ।
আপনার যদি একটি স্বয়ংক্রিয় পরীক্ষার স্যুট থাকে, তবে সবচেয়ে গুরুত্বপূর্ণ জিনিসটি হচ্ছে মার্জ হওয়ার পরে পরীক্ষাগুলি চালানো। প্রতিশ্রুতি দেওয়ার পরে আপনি এটি করতে পারেন, এবং প্রয়োজনে জিনিসগুলি পরে ঠিক করুন; বা আপনি এটা করতে পারেন আগে সংগঠনের, যোগ করে --no-commit
করতে git merge
কমান্ড। আমরা এই সমস্তের জন্য বিশদটি অন্যান্য পোস্টে রেখে দেব।
1 "ফাইল-প্রশস্ত" অপারেশনের ক্ষেত্রে আপনি বিরোধগুলিও পেতে পারেন, উদাহরণস্বরূপ, সম্ভবত আমরা কোনও ফাইলের কোনও শব্দের বানান ঠিক করি (যাতে আমাদের পরিবর্তন হয়) এবং তারা পুরো ফাইলটি মুছে দেয় (যাতে তাদের একটি থাকে) মুছে ফেলা). গিট এই দ্বন্দ্বগুলি নিজের থেকে সমাধান করবে না, -X
তর্ক ছাড়াই নির্বিশেষে ।
কম সংশ্লেষ এবং / অথবা স্মার্ট মেশানো এবং / অথবা পুনরায় ব্যবহার করে Do
আমাদের উভয় কমান্ড সিকোয়েন্সগুলিতে তিনটি মার্জ রয়েছে। প্রথমটি হ'ল লোকালকে origin/demo
নিয়ে আসা demo
(আপনার ব্যবহারগুলি git pull
যা আপনার গিটটি খুব পুরানো হলে আপডেট করতে ব্যর্থ হয় origin/demo
তবে একই পরিণতি তৈরি করবে)। দ্বিতীয়টি আনতে origin/master
হবে master
।
কে আপডেট করছে demo
এবং / অথবা master
। আপনি যদি নিজের demo
শাখায় নিজের কোডটি লিখে থাকেন এবং অন্যরা কোড লিখছেন এবং demo
শাখায় চাপ দিচ্ছেন origin
, তবে এই প্রথম-পদক্ষেপের মার্জটিতে দ্বন্দ্ব থাকতে পারে, বা সত্যিকারের মার্জ তৈরি হতে পারে। প্রায়শই না হওয়ার চেয়ে, কাজটি একত্রিত করার জন্য মার্জ করার পরিবর্তে রিবেস ব্যবহার করা ভাল (অবশ্যই, এটি স্বাদ এবং মতামতের বিষয়)। যদি তা হয় তবে আপনি git rebase
পরিবর্তে এটি ব্যবহার করতে পারেন । অন্যদিকে, আপনি যদি নিজের কোনও প্রতিশ্রুতি কখনও না করেন তবে আপনার একটি শাখাও লাগবেdemo
না । বিকল্পভাবে, আপনি যদি এগুলির অনেকগুলি স্বয়ংক্রিয় করতে চান তবে আপনি এবং অন্যরা যেগুলি বানিয়েছেন সেগুলি করার সময় আপনি যখন ব্যবহার করতে চান তখন সাবধানতার সাথে পরীক্ষা করতে সক্ষম হনdemo
git merge --ff-only origin/demo
: এটি সম্ভব হলে demo
আপডেটের সাথে মেলে আপনার দ্রুত-ফরওয়ার্ড করবে origin/demo
এবং যদি না হয় তবে সম্পূর্ণরূপে ব্যর্থ হয় (কোন পর্যায়ে আপনি দুটি সেট পরিবর্তনের পরিদর্শন করতে পারেন, এবং যথাযথভাবে একটি বাস্তব সংযুক্তি বা একটি রিবেস চয়ন করতে পারেন)।
এই একই যুক্তি প্রযোজ্য master
, যদিও আপনি মার্জটি চালু করছেন master
, তাই আপনার অবশ্যই একটি দরকার master
। তবে এটি আরও সুসংগত যে আপনি যদি মার্জটিকে দ্রুত-অগ্রিম অ-মার্জ হিসাবে করা না যায় তবে ব্যর্থ হওয়া চাইবেন, তাই সম্ভবত এটিও হওয়া উচিত git merge --ff-only origin/master
।
ধরা যাক আপনি কখনই নিজের দায়বদ্ধতা করেন না demo
। এই ক্ষেত্রে আমরা নামটি demo
পুরোপুরি খাঁজতে পারি :
git fetch origin # update origin/*
git checkout master
git merge --ff-only origin/master || die "cannot fast-forward our master"
git merge -X theirs origin/demo || die "complex merge conflict"
git push origin master
আপনি যদি হয় আপনার নিজের করছেন demo
শাখা করে, এই সহায়ক নয়; আপনি পাশাপাশি বিদ্যমান মার্জ রাখতে পারেন (তবে --ff-only
আপনি কী আচরণ চান তার উপর নির্ভর করে যোগ করতে পারেন), বা এটি একটি রিবেস করার জন্য স্যুইচ করুন। নোট করুন যে তিনটি পদ্ধতিই ব্যর্থ হতে পারে: সংঘাতের সাথে একত্রীকরণ ব্যর্থ হতে পারে, একত্রিত হয়ে --ff-only
দ্রুত-এগিয়ে যেতে সক্ষম না হতে পারে এবং পুনর্বাসনা কোনও সংঘাতের সাথে ব্যর্থ হতে পারে (পুনর্বাসনের কাজটি মূলত, চেরি-পিকিং কমিটস দ্বারা ব্যবহৃত হয়, যা মার্জটি ব্যবহার করে যন্ত্রপাতি এবং সুতরাং মার্জ সংঘাত পেতে পারে)।
git push -f origin master