গিট ওভাররাইটের সাথে একীভূত করুন


109

আমার একটি শাখা রয়েছে demoযা আমাকে masterশাখার সাথে একীভূত করতে হবে । আমি নিম্নলিখিত আদেশগুলি দিয়ে কাঙ্ক্ষিত ফলাফল পেতে পারি:

git pull origin demo
git checkout master
git pull origin master
git merge demo
git push origin master

আমার একমাত্র উদ্বেগ হ'ল, যদি কোনও মার্জ সমস্যা থাকে তবে আমি আমাকে মার্জ প্রম্পট gitনা দিয়ে masterশাখায় পরিবর্তনগুলি ওভাররাইট করতে বলতে চাই । সুতরাং মূলত demoশাখায় পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে শাখায় পরিবর্তিত হওয়া উচিত master

আমি চারপাশে দেখেছি সেখানে একাধিক বিকল্প রয়েছে তবে আমি সংশ্লেষের সাথে চান্স নিতে চাই না।


git push -f origin master
এমডি এক্সএফ

4
@MDXF: হতে আমি কি ভুল বলেছি কিন্তু আমি ব্যবহার করা উচিত নয় -fসঙ্গে বিকল্প mergeকমান্ড না pushকমান্ড
OpenStack

আপনি উভয় চেষ্টা করে দেখতে পারেন এবং আপনার জন্য কী কাজ করে
MD XF

: বল ঊর্ধ্বলিপি একটি সমাধান জন্য লিঙ্ক নিচে দেখুন stackoverflow.com/a/42454737/984471
মনোহর রেড্ডি Poreddy

উত্তর:


109

এই উত্তরটির সাথে সত্যিই সম্পর্কিত নয়, তবে আমি খাঁজ দেব 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 theirsRoot545 হিসাবে উল্লিখিত হয়েছে , -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 না । বিকল্পভাবে, আপনি যদি এগুলির অনেকগুলি স্বয়ংক্রিয় করতে চান তবে আপনি এবং অন্যরা যেগুলি বানিয়েছেন সেগুলি করার সময় আপনি যখন ব্যবহার করতে চান তখন সাবধানতার সাথে পরীক্ষা করতে সক্ষম হনdemogit 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দ্রুত-এগিয়ে যেতে সক্ষম না হতে পারে এবং পুনর্বাসনা কোনও সংঘাতের সাথে ব্যর্থ হতে পারে (পুনর্বাসনের কাজটি মূলত, চেরি-পিকিং কমিটস দ্বারা ব্যবহৃত হয়, যা মার্জটি ব্যবহার করে যন্ত্রপাতি এবং সুতরাং মার্জ সংঘাত পেতে পারে)।


29

আমার একটি অনুরূপ সমস্যা ছিল, যেখানে আমার কোনও কার্যকর শাখার সাথে পরিবর্তন / বিবাদ থাকা যে কোনও ফাইল কার্যকরভাবে প্রতিস্থাপন করতে হবে।

আমি যে সমাধানটি পেয়েছি তা হ'ল ব্যবহার করা git merge -s ours branch

নোট করুন বিকল্পটি -sএবং না -X। শীর্ষ স্তরের মার্জ কৌশল হিসাবে -sব্যবহারকে বোঝায়, oursমার্জ কৌশলটিতে বিকল্প -Xপ্রয়োগ করা হবে , যা আমি (বা আমরা) এই ক্ষেত্রে চাই না।oursrecursive

পদক্ষেপ, oldbranchআপনি যে শাখার সাথে ওভাররাইট করতে চান তা কোথায় newbranch

  • git checkout newbranch আপনি যে শাখাটি রাখতে চান তা পরীক্ষা করে
  • git merge -s ours oldbranch পুরানো শাখায় মার্জ করে তবে আমাদের সমস্ত ফাইল রাখে।
  • git checkout oldbranch আপনি যে শাখাটি ওভাররাইট করতে চান তা পরীক্ষা করে
  • get merge newbranch পুরানো শাখাটি ওভাররাইট করে নতুন শাখায় মার্জ করে

দ্রষ্টব্য: এখানে অন্য কোনও সমাধান আমার পক্ষে কাজ করেনি, তাই আমি আমার উত্তর পোস্ট করছি।
নিলাল ম্যাককর্ম্যাক

4
এটি আমার পক্ষে কাজ করে নি। এটি দ্বন্দ্ব সমাধান করেছে (সংঘাতযুক্ত ফাইলগুলি সমাধান করেছে) তবে ফাইলটি একত্রিত হয়নি। এবং একীভূত করতে পারে না।
সি-

যদি কেউ আটকে যায় যেখানে আপনাকে "এই সংযুক্তিটি কেন প্রয়োজন তা বোঝাতে দয়া করে একটি প্রতিশ্রুতি বার্তা প্রবেশ করুন": আপনার বার্তাটি প্রবেশ করুন, তারপরে আপনার কীবোর্ডের ESC কী টিপুন, টাইপ করুন: wq এবং প্রম্প্ট থেকে প্রস্থান করার জন্য ENTER টিপুন।
টোফারপেডারসন

এই উত্তর পোস্ট করার জন্য আপনাকে @ নিললম্যাককমার্যাক ধন্যবাদ, এটি আমাদের অনেক সাহায্য করেছে!
রাফেল_এসএস

20

এই একীভূত পদ্ধতির দ্বন্দ্ব বা অন্যান্য জঞ্জাল সম্পর্কে অভিযোগ না করে masterযার মধ্যে যা রয়েছে তাতে আটকানো একটি শীর্ষে একটি প্রতিশ্রুতি যুক্ত করবে feature

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

আপনি কিছু স্পর্শ করার আগে

git stash
git status # if anything shows up here, move it to your desktop

এখন মাস্টার প্রস্তুত করুন

git checkout master
git pull # if there is a problem in this step, it is outside the scope of this answer

পান featureসব পরিহিত আপ

git checkout feature
git merge --strategy=ours master

হত্যার জন্য যান

git checkout master
git merge --no-ff feature

4
গিট পুশ শেষ করতে
কোচচি

git-scm.com/docs/git- विसর 89 ডকুমেন্টেশন / গিট- विसর.txt-ours। এটি কাজ করেছিল যখন কমিটগুলি পরিষ্কারভাবে মার্জ হয় না। তবে এই উত্সটি উত্সটির উদ্ধৃতি হিসাবে সর্বদা কার্যকর হবে না Changes from the other tree that do not conflict with our side are reflected in the merge result। এটি আমার পক্ষে কার্যকর হয়নি, যেহেতু আমি আমার শাখায় পরিষ্কারভাবে মার্জন করেছিলাম যা ওভাররাইট করা হচ্ছে। অন্য কোন উপায আছে কি?
নীহারজিট

11

আপনি গিট সংশ্লেষে "আমাদের" বিকল্পটি চেষ্টা করতে পারেন,

গিট মার্জ শাখা -আমাদের

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


4
এটি পিছনের দিকে হবে, কারণ ওপি জানিয়েছে যে তিনি চান যে demoসংস্করণটি মার্জ হয়ে গেলেও তাকে পছন্দ করা উচিত master। নেই -X theirsপাশাপাশি, কিন্তু এটা পরিষ্কার না যে এই কি ওপি সত্যিই চায়।
টেরিক

আপনি পুরোটা পড়েন নি। আপনার নোটটি বিকল্পটির oursসাথে ব্যাকেন্ডে ব্যবহার করার সময় কী করবে তা বর্ণনা করে -sএটিরours সাথে ব্যবহার করার সময় -X: এটি অন্যান্য গাছের যা কিছু ঘটেছিল তা বাতিল করে দেয়, আমাদের ইতিহাস ঘোষণা করে এর মধ্যে যা ঘটেছিল সেগুলি রয়েছে। উত্স
jimasun

2

আমি যখন -X theirsএবং অন্যান্য সম্পর্কিত কমান্ড স্যুইচগুলি ব্যবহার করার চেষ্টা করলাম তখন আমি মার্জ কমিট পেতে থাকি। আমি সম্ভবত এটি সঠিকভাবে বুঝতে পারছিলাম না। বিকল্প বোঝার জন্য একটি সহজ হ'ল কেবল শাখাটি মুছুন এবং আবার এটি ট্র্যাক করুন।

git branch -D <branch-name>
git branch --track <branch-name> origin/<branch-name>

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

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