টানা চলাকালীন গিট মার্জ সংঘাতগুলি তাদের পরিবর্তনের পক্ষে সমাধান করুন


1224

টানা পরিবর্তনের পক্ষে কীভাবে আমি গিট একীভূত সংঘাতের সমাধান করব?

মূলত আমাকে git mergetoolসমস্ত দ্বন্দ্ব-মুক্ত পরিবর্তন রেখে কিছুটা দ্বন্দ্বের মধ্যে দিয়ে না গিয়েই একটি কার্যক্ষম গাছ থেকে সমস্ত বিবাদী পরিবর্তনগুলি সরিয়ে ফেলতে হবে । সাধারণত টানানোর সময় এটি করছেন, পরে নয়।


3


3
@ ড্যানডাসকলেস্কু সেখানে গৃহীত উত্তরগুলি এই প্রশ্নের উত্তর দেয় না, সুতরাং পরিষ্কারভাবে এটি কোনও সদৃশ নয়। অধিকন্তু, এই অন্যান্য প্রশ্নটি বেশ অস্পষ্ট: কী জিজ্ঞাসা করা হয়েছে তা বলা খুব শক্ত। সব মিলিয়ে আমি আপনার সাথে একমত হতে পারি না। এতে আপনি কী বোঝাতে চান?
সান্মই

2
@ সান্মই আপনার দুটি উত্তর আছে - এবং আপনি সেগুলির একটি গ্রহণ করেছেন। আপনি উত্তরে কী আশা করছেন এবং আপনি এখানে আরও কতটা বিশদ চান তা আরও ভালভাবে ব্যাখ্যা করতে পারেন?
এডওয়ার্ড থমসন

2
@ অ্যাডওয়ার্ড থমসন ভাল, আসলে আমি প্রথম উত্তরের জন্য এই খ্যাতি দেওয়ার কথা ভাবছিলাম, তবে আপনি যদি জিজ্ঞাসা করেন, আমি অপেক্ষা করতে পারি এবং আরও ভাল উত্তর আসে কিনা দেখুন
সান্মাই

উত্তর:


1213
git pull -s recursive -X theirs <remoterepo or other repo>

অথবা, কেবলমাত্র ডিফল্ট সংগ্রহস্থলের জন্য:

git pull -X theirs

আপনি যদি ইতিমধ্যে দ্বন্দ্বজনক অবস্থায় থাকেন ...

git checkout --theirs path/to/file

40
-s recursiveএখানে ডিফল্ট একত্রীকরণ কৌশল, যেহেতু এখানে অপ্রয়োজনীয় নোট করুন। সুতরাং আপনি এটিকে সহজতর করতে পারেন git pull -X theirsযা মূলত সমান git pull --strategy-option theirs

5
আমি যদি এটি করি তবে আমি MERGINGরাজ্যে ফিরে আসছি । আমি তখন git merge --abortএবং আবার চেষ্টা করতে পারি, তবে প্রতিবার আমি একত্রীকরণের সাথে শেষ করি। … আমি জানি যে একটি উপার্জন আমার প্রবাহে ধাক্কা দেওয়া হয়েছিল, সুতরাং সম্ভবত এটি এর কারণ?
বেনজাহান

22
সঙ্গে সাবধান git checkout --theirs path/to/file। এটি পুনর্বাসনের সময় ব্যবহৃত হয়েছে এবং অপ্রত্যাশিত ফলাফল পেয়েছে। ডকটিতে ব্যাখ্যা পাওয়া গেছে: নোট করুন যে গিট রিবেস এবং গিট টান --rebase চলাকালীন, আমাদের এবং তারগুলি অদলবদল হতে পারে; --our শাখা থেকে পরিবর্তনগুলি পুনর্নির্বাচিত হয় সংস্করণ দেয়, যখন - শাখাগুলি আপনার কাজটি পুনর্বাসিত করা হচ্ছে এমন শাখা থেকে সংস্করণ দেয়।
ভুক জাজাপিক

10
নোট করুন যে git checkout --theirs/--ours pathম্যান পেজটি জানিয়েছে যে এটি বিচ্ছিন্ন পাথগুলির জন্য কাজ করে । সুতরাং যদি পথে কোনও দ্বন্দ্ব না থাকে তবে এটি ইতিমধ্যে মার্জ হয়ে গেছে এই আদেশটি কিছুই করবে না। আপনি যখন উদাহরণস্বরূপ একটি সম্পূর্ণ সাব-ফোল্ডারটির সংস্করণ চান তাদের ক্ষেত্রে এটি সমস্যা হতে পারে। সুতরাং এই জাতীয় ক্ষেত্রে git checkout MERGE_HEAD pathকমিট হ্যাশ করা বা ব্যবহার করা নিরাপদ হবে ।
এফএসডাব্লু

4
git pull -X theirsবিবাদ থাকলে একটি মার্জ কমিট তৈরি করে (উদাহরণস্বরূপ, যদি অন্য প্রতিশ্রুতিবদ্ধ git push -fপ্রত্যন্তে চলে যায়)। আপনি যদি মার্জ কমিটগুলি না চান তবে তার পরিবর্তে চালান git fetch && git reset --hard origin/master
ড্যান ড্যাসকলেসকু

984

আপনি পুনরাবৃত্ত "তাদের" কৌশল বিকল্পটি ব্যবহার করতে পারেন :

git merge --strategy-option theirs

লোকটির কাছ থেকে :

ours
    This option forces conflicting hunks to be auto-resolved cleanly by 
    favoring our version. Changes from the other tree that do not 
    conflict with our side are reflected to the merge result.

    This should not be confused with the ours merge strategy, which does 
    not even look at what the other tree contains at all. It discards 
    everything the other tree did, declaring our history contains all that
    happened in it.

theirs
    This is opposite of ours.

নোট: যেমন man পৃষ্ঠা বলেন, "আমাদের" একত্রীকরণ কৌশল বিকল্প "আমাদিগের" একত্রীকরণ থেকে ভিন্ন কৌশল


এখানে আরও বিশদ বিবরণ দেওয়া হয়েছে: lostechies.com/joshuaflanagan/2010/01/29/…
mPrinC

227
এছাড়াও git checkout --theirsএকটি একক বিবাদী ফাইলে
ডিভিডি

48
আপনি ইতিমধ্যে বিরোধ নিষ্পত্তি স্থলে থাকলে এটি কাজ করে না। সেক্ষেত্রে আমি বিশ্বাস করি সমাধানের সর্বোত্তম উপায় হ'ল git checkout <ref to theirs> -- the/conflicted.file; এবং তারপরে git addতাদের পরিবর্তনগুলি।
থারস্মমনার

54
@ থারস্মমনার সেক্ষেত্রে গিট চেকআউট রয়েছে - ফাইলের / ফাইলগুলির পথ path এইভাবে, আপনাকে সঠিকভাবে হ্যাশটি সন্ধান করতে হবে না।
ইক্কে

8
@ আইক্কে যদি আমাকে জিজ্ঞাসা করেন তবে এটির মূলত তার নিজস্ব উত্তর (এবং তাতে স্বীকৃত উত্তর) হওয়া উচিত।
থারস্মমনার

472

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

git checkout --theirs .
git add .

আপনি যদি বিপরীতে করতে চান:

git checkout --ours .
git add .

এটি বেশ কঠোর, সুতরাং নিশ্চিত হয়ে নিন যে এটি করার আগে আপনি সত্যিই এইভাবে সবকিছু মুছতে চান।


47
অথবা, .আপনি যে চেকআউট করতে চান তার বিন্দুর জায়গায় ফাইলটি (গুলি) নির্দিষ্ট করবেন না । কম "কঠোর" এবং সম্ভবত আপনি যা করতে চান তা সম্ভবত।
মনরো

10
ফাইলটি অন্য শাখা থেকে সরানো থাকলে এটি কাজ করবে না: '<ফাইল>' এর সংস্করণ নেই
জাপস্টার 24

3
যদি আমি পারতাম আরও উত্সাহিত করতাম, এখন এবং পরে এই উত্তরটি ফিরে আসতে থাকি।
তারিককি

6
git add -uসংস্করণ নিয়ন্ত্রণে নেই এমন ফাইলগুলি এড়িয়ে যাওয়ার পরিবর্তে ব্যবহার করুন ।
সুদীপ্ত বসাক

3
হাইপোথিটিক্যাল কেস, একটি ফাইলের তিনটি পরিবর্তন, একটি বিবাদমান, দুটি বিরোধ ছাড়াই, এই সমাধানটি কি অ-বিরোধী পরিবর্তনগুলি প্রয়োগ করবে এবং আমাদের মধ্যে বিবাদী পরিবর্তনকে সমাধান করবে? অথবা এগুলি থেকে তাদের বিরোধী পরিবর্তনগুলি উপেক্ষা করে কেবল আমাদের সংস্করণটি নেওয়া হবে?
পেড্রোমার্স

222

ঠিক আছে তো, আমি যে দৃশ্যে ছিলাম তা চিত্রিত করুন:

আপনি একটি merge, বা সম্ভবত একটি চেষ্টা করে দেখেন cherry-pickএবং আপনার সাথে বন্ধ হয়ে যায়

$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

এখন, আপনি দ্বন্দ্বপূর্ণ ফাইলটি দেখুন এবং আপনি সত্যিই আপনার পরিবর্তনগুলি রাখতে চান না। উপরের আমার ক্ষেত্রে, ফাইলটি আমার আইডিইতে স্বতঃ-যুক্ত হওয়া মাত্র একটি নতুন লাইনে দ্বন্দ্ব হয়েছিল। আপনার পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে এবং সেগুলির গ্রহণ করতে, সহজতম উপায় হ'ল:

git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

এর কনভার্সটি (আপনার সংস্করণ দিয়ে আগত সংস্করণটি ওভাররাইট করতে)

git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

আশ্চর্যের বিষয়, আমি নেটটিতে খুব সহজেই এই উত্তরটি খুঁজে পাইনি।


15
দ্রষ্টব্য, যদি কেউ এর git statusমধ্যে checkoutএবং এর মধ্যে পারফর্ম করে addতবে ফাইলটি "উভয় পরিবর্তিত" হিসাবে দেখায়।
বিশপ

আপনি কি জানেন যে সংঘর্ষযুক্ত সমস্ত ফাইলের জন্য এটি করার কোনও উপায় আছে কিনা? যদি তা হয় তবে এটি আপনার উত্তরের একটি দুর্দান্ত এক্সটেনশন হতে চাই।
ড্রয় নোকস

2
আমি এটি করি: git reset --hard এবং তারপরে git pull [remote server name] [branch name] -Xtheirs(একত্রীকরণটিকে পূর্বাবস্থায় ফিরিয়ে আনলে আমার স্টাফগুলির উপরে নতুন জিনিস টান দেয়) - নিশ্চিত না আপনি এটি চান কি না।
ssaltman

38

git pull -X theirsউত্তর একটি কুশ্রী একত্রীকরণ কমিট তৈরি হতে পারে, অথবা একটি ইস্যু

ত্রুটি: নিম্নলিখিত ফাইলগুলিতে আপনার স্থানীয় পরিবর্তনগুলি মার্জ করে ওভাররাইট করা হবে:

আপনি যদি রেপো থেকে ফাইলগুলিতে কোনও স্থানীয় পরিবর্তনকে কেবল উপেক্ষা করতে চান, উদাহরণস্বরূপ এমন ক্লায়েন্টে যা সর্বদা একটি উত্সের আয়না হওয়া উচিত, এটি চালান ( masterআপনার যে শাখায় আপনি চান তার সাথে প্রতিস্থাপন করুন ):

git fetch && git reset --hard origin/master

এটা কিভাবে কাজ করে? git fetchনা git pullতবে মার্জ ছাড়া । তারপরে git reset --hardআপনার কার্যনির্বাহী গাছটিকে শেষ প্রতিশ্রুতি মেলাতে তোলে। রেপোতে থাকা ফাইলগুলিতে আপনার সমস্ত স্থানীয় পরিবর্তনগুলি বাতিল করা হবে , তবে নতুন স্থানীয় ফাইল একা থাকবে।


1
+1 - git fetch && git reset --hard {remote}/{branch}যা আমার সমস্যার সমাধান করেছিল। আমাকে একটি শাখার "তাদের" অবস্থার পক্ষে আমার নিজের পরিবর্তনগুলি সম্পূর্ণরূপে খনন করতে হবে, তবে git pull -X theirsকিছু সরানো / নাম পরিবর্তন করা ফাইলগুলিতে চাপ সৃষ্টি হয়েছিল। ধন্যবাদ!
Ivaylo স্লাভভ

22

গিট সংযুক্তির পরে, যদি আপনি বিবাদ পান এবং আপনি নিজের বা তাদের চান want

git checkout --theirs .
git checkout --ours .

আমি প্রতি বিবাদী খণ্ড ভিত্তিতে এটি কীভাবে করব? উপরেরগুলি একটি ফাইল স্তরে কাজ করে, কোনও বিরোধবিরোধী অংশকে একটি বিবাদী ফাইল থাকতে পারে ing
জানি

21

একটি নির্দিষ্ট শাখায় সংস্করণ সহ সমস্ত বিবাদগুলি সমাধান করার জন্য:

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

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

git diff --name-only --diff-filter=U | xargs git checkout master

এবং উইন্ডোতে থাকা লোকেদের জন্য পাইপ xargs অ্যাক্সেস ছাড়াই, এটি কীভাবে অনুবাদ করে?
tsemer

এটি আপনার পরিবর্তনগুলি পুরোপুরি এড়িয়ে যাবে না? এমনকি যারা দ্বন্দ্বের রাজ্যে নেই?
ভ্যালেন্টিন হেইনিটজ 15'18 'বার

এটিই আমি শেষ করেছিলাম। দুর্ভাগ্যক্রমে এটির পরে এই পরিবর্তনগুলি সম্পাদন করার জন্য একটি git cherry-pick --continue বা একটি git commit --allow-emptyআদেশের প্রয়োজন হয় এবং কোনও আদেশের পিছনে এমন কোনও সিস্টেম নেই বলে মনে হয় যা স্বয়ংক্রিয়ভাবে এটিকে ব্যথা করে তোলে। আমি বর্তমানে এটি একটি .git/COMMIT_EDITMSGফাইলের অস্তিত্বের জন্য পরীক্ষা করে সমাধান করছি তবে এটি হ্যাকি এবং ভঙ্গুর বলে মনে হচ্ছে এবং আমি এখনও নিশ্চিত নই যে এটি সর্বদা কার্যকর হয়।
কনরাড রুডল্ফ

এটি ভাল, এর অর্থ যদি আপনি ম্যানুয়ালি কিছু সমাধান করেন (এবং করেন git add) তবে আপনি এর মাধ্যমে বাকিগুলি সমাধান করতে পারেন bul git checkout --ours/ git checkout --theirsখুব দরকারী।
rcoup 15

18

কখনও কখনও এটি কাজ করবে না দয়া করে :

গিট চেকআউট - ঘন্টা / ফাইল / ফাইল ours

অথবা

গিট চেকআউট - তাদের পথ / টু / ফাইল

পরিবর্তে আমি এটি করেছি , ধরে নিলাম হেডটি আমাদের এবং MERGE_HEAD তাদের the

git checkout HEAD -- path/to/file

বা:

git checkout MERGE_HEAD -- path/to/file

আমরা এটি করার পরে এবং আমরা ভাল:

git add .

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


12

ভিএস কোড (সংহত গিট) আইডিই ব্যবহারকারী:

আপনি যদি দ্বন্দ্বের ফাইলটিতে আগত সমস্ত পরিবর্তন গ্রহণ করতে চান তবে নীচের পদক্ষেপগুলি করুন।

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

একইভাবে আপনি অন্যান্য বিকল্পগুলির জন্য যেমন উভয় গ্রহণ করুন, সমস্ত বর্তমান গ্রহণ করুন ইত্যাদি হিসাবে করতে পারেন,


2
এটি কেবলমাত্র একটি একক ফাইলের জন্য কাজ করবে বলে মনে হয়, যদিও বিরোধের সাথে সমস্ত ফাইল নয়।
ইয়োরিও

1

আমার একটি দীর্ঘকাল ধরে চলমান next-versionশাখা ছিল যেগুলি ফাইলগুলিতে পরিবর্তন হয়েছিল develop, যে ফাইলগুলি উভয় শাখায় বিভিন্ন জায়গায় যুক্ত হয়েছিল, ইত্যাদি tons

আমি next-versionশাখার পুরো বিষয়বস্তু developএকত্রে একত্রে সংহত করার জন্য প্রতিশ্রুতিবদ্ধ করতে চেয়েছিলাম ।

উপরের কমান্ডগুলির সংমিশ্রণ যা আমার পক্ষে কাজ করেছিল তা হ'ল:

git merge -X theirs next-version
# lots of files left that were modified on develop but deleted on next-version
git checkout next-version .
# files removed, now add the deletions to the commit
git add .
# still have files that were added on develop; in my case they are all in web/
git rm -r web

নেই একটি নতুন উত্তর, শুধু অনেক উত্তর থেকে বিট মিশ্রন আংশিক আশ্বস্ত যে আপনার প্রয়োজন হতে পারে সব এই উত্তর।


1

আপনি যদি ইতিমধ্যে দ্বন্দ্বপূর্ণ অবস্থায় থাকেন এবং একের পর এক পথ চেকআউট করতে চান না। আপনি চেষ্টা করতে পারেন

git merge --abort
git pull -X theirs

-1

https://git-scm.com/book/en/v2/Git-Tools-Advanced- মার্জিং থেকে

এটি মূলত একটি জাল মার্জ করবে। এটি উভয় শাখার সাথে পিতা-মাতা হিসাবে একটি নতুন মার্জ কমিট রেকর্ড করবে, তবে এটি আপনি যে শাখায় মার্জ করছেন তাও তাকাবে না It এটি আপনার বর্তমান শাখায় সঠিক কোডটি মার্জ করার ফলে কেবল রেকর্ড হবে।

$ git merge -s ours mundo

'আমাদের' কৌশল দ্বারা তৈরি করা।

$ git diff HEAD HEAD~

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

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

আমি যদি একটি নতুন টপিক শাখার পরিবর্তনগুলি প্রতিবিম্বিত করতে মাস্টার চাই তা আমি দরকারী বলে মনে করেছি। আমি লক্ষ্য করেছি যে -রক্ষীরা কিছু পরিস্থিতিতে দ্বন্দ্ব ছাড়াই একীভূত হয় না ... যেমন

$ git merge -Xtheirs topicFoo 

CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.

এক্ষেত্রে আমি যে সমাধানটি পেয়েছি তা ছিল

$ git checkout topicFoo

টপিকফু থেকে, প্রথমে -s আমাদের কৌশলটি ব্যবহার করে মাস্টারে মার্জ করুন, এটি জাল প্রতিশ্রুতি তৈরি করবে যা কেবলমাত্র টপফু-এর রাজ্য। it গিট বিভক্ত - আমাদের মাস্টার

নির্মিত মার্জ কমিট পরীক্ষা করুন

$ git log

এখন মাস্টার শাখা চেকআউট করুন

$ git checkout master

টপিক শাখাটি আবার মার্জ করুন তবে এবার -আবারের পুনরাবৃত্ত কৌশলটি ব্যবহার করুন, এটি আপনাকে এখন টপফু-এর রাজ্যের সাথে একটি মাস্টার শাখা উপস্থাপন করবে।

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