বাইনারি ফাইলগুলির সাথে গিট বিরোধের সমাধান করা


464

আমি যা কিছু ডিজাইনের কাজ করছি তার জন্য পরিবর্তনগুলি ট্র্যাক করতে আমি উইন্ডোজে উইন্ডোজ (এমএসএসজিট) ব্যবহার করছি।

আজ আমি আলাদা পিসিতে কাজ করেছি (রিমোট রেপো সহ) brian ) কাজ করছি এবং আমি এখন সম্পাদিত সম্পাদনাগুলি আমার ল্যাপটপের নিয়মিত স্থানীয় সংস্করণে আবার মার্জ করার চেষ্টা করছি।

আমার ল্যাপটপে, আমি ব্যবহার করেছি git pull brian master আমার স্থানীয় সংস্করণে পরিবর্তনগুলি টানতে । মূল InDesign ডকুমেন্ট বাদে সবকিছু ঠিকঠাক ছিল - এটি বিরোধ হিসাবে দেখায়।

পিসিতে সংস্করণ (brian ) সর্বশেষতম যা আমি রাখতে চাই তা কিন্তু আমি জানি না কমান্ডগুলি রেপোটিকে এটি ব্যবহার করতে বলে।

আমি সরাসরি আমার ল্যাপটপে ফাইলটি অনুলিপি করার চেষ্টা করেছি তবে এটি পুরো মার্জ প্রক্রিয়াটি ভঙ্গ করে বলে মনে হচ্ছে।

কেউ কি আমাকে সঠিক দিকে নির্দেশ করতে পারে?

উত্তর:


853

git checkoutএই জাতীয় মামলার জন্য একটি বিকল্প --oursবা --theirsবিকল্প গ্রহণ করে । সুতরাং আপনার যদি একত্রীকরণের বিরোধ হয় এবং আপনি জানেন যে আপনি যে শাখায় মার্জ করছেন সেখান থেকে কেবল ফাইলটি চান, আপনি এটি করতে পারেন:

$ git checkout --theirs -- path/to/conflicted-file.txt

ফাইলটির সেই সংস্করণটি ব্যবহার করতে। তেমনি, আপনি যদি জানেন যে আপনি নিজের সংস্করণটি (যেটি মেশানো হচ্ছে না) চান তবে আপনি ব্যবহার করতে পারেন

$ git checkout --ours -- path/to/conflicted-file.txt

47
--Ours ব্যবহারের আগে আমাকে ফাইলটিতে 'গিট রিসেট হেড পাথ / টু / কনফ্ল্যাশড-ফাইল.txt' চালাতে হয়েছিল, অন্যথায় এটির কোনও প্রভাব নেই বলে মনে হচ্ছে।
জিট্রাক্স

6
@ জিট্রাक्स আপনি কি ফাইল চালানোর পরে পৃথক করেছেন git checkout --ours? ম্যান পেজটি পরামর্শ দেয় (আইএমএইচও) যে চেকআউট - আওয়ার্স / - তাদের "উভয় সংশোধিত, মার্জ হওয়া দরকার" তালিকা থেকে পরিবর্তনটি সরিয়ে এটিকে সূচীতে যুক্ত করবে এবং আমি মনে করি এটি সঠিক নয়। আমি বিশ্বাস করি আপনাকে git addচেকআউট করার পরে চালানো দরকার ।
টিম কেটিং

15
দ্রষ্টব্য: আপনি এখনও "গিট অ্যাড বিবাদযুক্ত-ফাইল.txt " এবং "গিট কমিট" করতে চান। হ্যান্ডলি, যখন আমি এটি চেষ্টা করেছি, তখন প্রতিশ্রুতি বার্তাটি সংঘাত সম্পর্কে একটি নোট সহ প্রাক-জনপ্রেমে ছিল।
এডওয়ার্ড ফ্যাল্ক

2
"যে শাখায় আপনি মার্জ করছেন" এর বাক্যাংশটি বিপজ্জনকভাবে "যে শাখায় আপনি মার্জ করছেন" এর কাছাকাছি অবস্থিত, আমি মনে করি যে কেবলমাত্র প্রস্তুতিটি বাদ দেওয়া আরও ভাল হবে: "আপনি যে শাখায় মার্জ করছেন" যেটি গিট কমান্ডকেও প্রতিফলিত করবে would (অর্থাত্ git merge branch_name)
andrybak

13
এই বিষয়টির ব্যাখ্যায় সর্বদা অনুপস্থিত এমন কয়েকটি গুরুত্বপূর্ণ পয়েন্ট। মার্জ করার পরিবর্তে রিবেস করার সময়, এর অর্থ --theirএবং --oursঅদলবদল করা হয়, অর্থাৎ - বর্তমানে == পরীক্ষা করা শাখা এবং - ঘন্টাগুলি হল শাখা, সাধারণত একটি প্রত্যন্ত শাখা, বা যে পথটি আপনি স্রোতে মার্জ করার চেষ্টা করছেন শাখা। [space]--[space]শাখার নাম এবং পাথ বৈশিষ্ট উভয় একই নামের অস্তিত্ব ঘটতে মধ্যে পাথ বৈশিষ্ট করার বিকল্প disambiguates (যেমন একটি বিদ্যমান শাখা নাম "ABC" এবং একটি ডিরেক্টরি "ABC" নামক বিদ্যমান)।
বোইজবেড

147

আপনাকে দ্বন্দ্বকে ম্যানুয়ালি সমাধান করতে হবে (ফাইলটি অনুলিপি করে) এবং তারপরে ফাইলটি প্রতিশ্রুতিবদ্ধ (আপনি এটির অনুলিপি দিয়েছিলেন বা স্থানীয় সংস্করণ ব্যবহার করেছেন তা নয়)

git commit -a -m "Fix merge conflict in test.foo"

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

সম্পাদনা করুন: নীচের পোস্টটি দেখুন, আপনাকে আসলে ফাইলগুলি অনুলিপি করতে হবে না, তবে ব্যবহার করতে পারেন

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

আপনি চান ফাইলটির সংস্করণ নির্বাচন করতে। আপনি যদি উভয় সংস্করণের মিশ্রণ চান তবে ফাইলটি অনুলিপি / সম্পাদনা করা প্রয়োজনীয় হবে।

মিপাডি উত্তর সঠিক হিসাবে চিহ্নিত করুন।


1
তার জন্য ধন্যবাদ. আমি নিশ্চিত ছিলাম না যে কোনও ফাইলকে 'সঠিক' হিসাবে চিহ্নিত করার মতো কোনও বিল্ট-ইন পদ্ধতি ছিল কিনা। যদিও আমি অস্তিত্বের আদেশটি পাইনি কেন তা ব্যাখ্যা করে!
কেভিন উইলসন

হ্যাঁ, কিছুটা
অপ্রয়োজনীয়

120

আপনি এই সমস্যাটিও কাটিয়ে উঠতে পারেন

git mergetool

যা gitদ্বন্দ্বযুক্ত বাইনারিগুলির স্থানীয় অনুলিপি তৈরি করতে এবং সেগুলিতে আপনার ডিফল্ট সম্পাদককে ছড়িয়ে দেয়:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

স্পষ্টতই আপনি কোনও পাঠ্য সম্পাদককে বাইনারি ফাইলগুলি কার্যকরভাবে সম্পাদনা করতে পারবেন না। পরিবর্তে আপনি এডিটরটি বন্ধ না করেই নতুন {conflicted}.REMOTEফাইলটি অনুলিপি করছেন {conflicted}। তারপরে আপনি যখন বন্ধ করবেন তখন সম্পাদকটি gitদেখতে পাবে যে অচিহ্নিত কর্ম-অনুলিপি পরিবর্তন করা হয়েছে এবং আপনার মার্জ সংঘাতটি স্বাভাবিক উপায়ে সমাধান করা হয়েছে is


8
যদি ফাইলগুলি বড় হয় বা আপনি কোনও পাঠ্য সম্পাদককে বাইনারি খোলার ঝুঁকি নিতে চান না তবে আপনি মার্জটুল প্রম্পটে (" Hit return to start merge resolution tool") সিটিআরএল + সি চাপতে পারেন এবং গিট অতিরিক্ত ফাইলগুলি জায়গায় রেখে দেবে। তারপরে আপনি এগুলি সংশোধন করতে পারেন বা তাদের একটি বাহ্যিক সরঞ্জামে মার্জ করতে পারেন (বাইনারি ডকুমেন্ট ফর্ম্যাটগুলির জন্য যেমন LibreOffice / OpenOffice / MSWord) এবং ফলাফলটি মূল ফাইলনেমে সংরক্ষণ করতে পারেন। গিটকে জানাতে যে দ্বন্দ্বের সমাধান হয়েছে, git addমূল ফাইল নাম এবং আপনি তারপরে মার্জ কমিটটি শেষ করতে পারেন।
ফেলিক্স

18

আপনার বর্তমান শাখায় সংস্করণ রেখে সমাধান করার জন্য (আপনি যে শাখায় মার্জ হয়ে যাচ্ছেন তার সংস্করণটি উপেক্ষা করুন), কেবল ফাইল যুক্ত এবং প্রতিশ্রুতিবদ্ধ:

git commit -a

আপনি যে শাখায় মার্জ হয়ে যাচ্ছেন তার সংস্করণ সহ আপনার বর্তমান শাখায় সংস্করণটি ওভাররাইট করে সমাধান করার জন্য আপনাকে প্রথমে সেই সংস্করণটি আপনার কার্যক্ষম ডিরেক্টরিতে পুনরুদ্ধার করতে হবে এবং তারপরে এটি যুক্ত / প্রতিশ্রুতিবদ্ধ:

git checkout otherbranch theconflictedfile
git commit -a

আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে


1
আমি স্বীকৃত উত্তরের চেয়ে এই বৈকল্পিকটি পছন্দ করি, কারণ এটি আরও স্বজ্ঞাত, বিশেষত বিবেচনা করে যে "" আওয়ার্স "এবং" - থাইয়ার্স "এর অর্থ রিবেসিংয়ের ক্ষেত্রে অদলবদল হয়।
অ্যান্টনি হ্যাচকিন্স

11

মিপাদির উত্তরটি আমার পক্ষে বেশ কার্যকর হয়নি, আমার এটি করা দরকার:

গিট চেকআউট - পথ / টু / ফাইল.বিন

বা, সংস্করণটি মার্জ করে রাখা:

গিট চেকআউট - তাদের পথ / to / file.bin

তারপর

git যোগ করার পথ / to / file.bin

এবং তারপরে আমি আবার "গিট মার্জেটুল" করতে সক্ষম হয়েছি এবং পরবর্তী বিরোধের দিকে চালিয়ে যেতে পেরেছি।


6

ডক্স থেকেgit checkout

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
সূচক থেকে পাথগুলি পরীক্ষা করার সময়, নিমজ্জিত পাথগুলির জন্য পর্যায় # 2 ( ours) বা # 3 ( theirs) দেখুন।

পূর্ববর্তী ব্যর্থ মার্জ হওয়ার কারণে সূচকটিতে নিমজ্জিত এন্ট্রি থাকতে পারে। ডিফল্টরূপে, আপনি যদি সূচী থেকে এই জাতীয় এন্ট্রি চেক করার চেষ্টা করেন, চেকআউট অপারেশন ব্যর্থ হবে এবং কিছুই পরীক্ষা করা হবে না। ব্যবহার করা -fএই নিমজ্জিত এন্ট্রিগুলিকে উপেক্ষা করবে। একত্রিত হওয়ার নির্দিষ্ট দিকের সামগ্রীগুলি ব্যবহার করে --oursবা সূচকের বাইরে পরীক্ষা করা যেতে পারে --theirs। এর সাথে -m, কার্যত ট্রি ফাইলটিতে করা পরিবর্তনগুলি মূল দ্বন্দ্বযুক্ত মার্জ ফলাফলটি পুনরায় তৈরি করতে বাতিল করা যেতে পারে।


4

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

% git fetch

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

% git checkout FETCH_HEAD stuff/to/update

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


4

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

  1. গিথুব-তে, আপনি দেখতে পেয়েছেন যে আপনার টানার অনুরোধটির একটি বাইনারি ফাইলের সাথে বিরোধ রয়েছে।
  2. এখন আপনার স্থানীয় কম্পিউটারে একই গিট শাখায় ফিরে যান।
  3. আপনি (ক) এই বাইনারি ফাইলটি পুনরায় তৈরি / পুনর্নির্মাণ, এবং (খ) ফলিত বাইনারি ফাইলটিকে একই গিট শাখায় প্রতিশ্রুতিবদ্ধ।
  4. তারপরে আপনি আবার একই গিট শাখাটি গিথুবকে পুশ করুন।

গিথুব-এ, আপনার টানার অনুরোধে, দ্বন্দ্বটি অদৃশ্য হয়ে যাবে।


এটি হ'ল আমার প্রয়োজনীয় প্রক্রিয়াটি
হিউফ্যাং ফেং

2

যদি বাইনারি হ'ল ডেল বা এমন কিছু যা সরাসরি সম্পাদনা করা যায় than চিত্রের মতো বা একটি মিশ্রিত ফাইল (এবং আপনার কোনও ফাইল ট্র্যাশ / বেছে নিতে হবে না বা অন্য কোনও ফাইল নির্বাচন করতে হবে না) আসল সংশ্লেষ কিছু হতে পারে:

আমি আপনাকে বাইনারি ফাইল কী সেগুলি ভিত্তিক একটি পৃথক সরঞ্জাম অনুসন্ধান করার পরামর্শ দিচ্ছি, উদাহরণস্বরূপ চিত্রের জন্য কিছু ফ্রি রয়েছে উদাহরণস্বরূপ

এবং তাদের তুলনা।

যদি আপনার ফাইলগুলির তুলনা করার জন্য কোনও আলাদা সরঞ্জাম না থাকে তবে আপনার কাছে যদি বিন ফাইলটির মূল জেনারেটর থাকে ( এটির জন্য এটির জন্য একটি সম্পাদক উপস্থিত রয়েছে ... ব্লেন্ডার 3 ডি এর মতো আপনি নিজেও সেই ফাইলগুলি পরীক্ষা করতে পারেন, এছাড়াও লগগুলি দেখুন, এবং অন্য ব্যক্তিকে আপনার কী অন্তর্ভুক্ত করা উচিত তা জিজ্ঞাসা করুন) এবং https://git-scm.com/book/es/v2/Git-Tools- অ্যাডভান্সড- মার্জিং#_ manual_remege দিয়ে ফাইলগুলির একটি আউটপুট করুন

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend


1

উইন্ডোতে গিটের সাথে বাইনারি ফাইলগুলিকে আলাদা / মার্জ করার জন্য দুটি কৌশল নিয়ে এসেছি।

  1. কচ্ছপ গিট আপনাকে তাদের ফাইল এক্সটেনশনের উপর ভিত্তি করে বিভিন্ন ফাইল ধরণের জন্য ডিফ / মার্জ সরঞ্জামগুলি কনফিগার করতে দেয়। 2.35.4.3 দেখুন। ডিফ / মার্জ অ্যাডভান্সড সেটিংস http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html । অবশ্যই এই কৌশলটি উপযুক্ত ডিফ / মেশিন সরঞ্জাম উপলব্ধ থাকার উপর নির্ভর করে।

  2. গিট অ্যাট্রিবিউট ব্যবহার করে আপনি আপনার বাইনারি ফাইলটিকে পাঠ্যে রূপান্তর করতে একটি সরঞ্জাম / কমান্ড নির্দিষ্ট করতে পারেন এবং তারপরে আপনার ডিফল্ট পৃথক / মার্জ সরঞ্জামটিকে এটি করতে দিন। Http://git-scm.com/book/it/v2/Customizing-Git-Git-Atributes দেখুন । নিবন্ধটি এমনকি চিত্রগুলি পৃথক করতে মেটা ডেটা ব্যবহারের একটি উদাহরণ দেয়।

আমি সফ্টওয়্যার মডেলের বাইনারি ফাইলগুলির সাথে কাজ করার জন্য উভয় কৌশল পেয়েছি, তবে কনফিগারেশনটি সহজ হওয়ায় আমরা কচ্ছপের গিট দিয়ে চলেছি।


0

আমি এক্সেলের জন্য গিট ওয়ার্কফ্লো ব্যবহার করি - https://www.xltrail.com/blog/git-workflow- for- এক্সেল অ্যাপ্লিকেশনটি আমার বেশিরভাগ বাইনারি ফাইল সম্পর্কিত মার্জ সংক্রান্ত সমস্যাগুলি সমাধান করতে। এই ওপেন-সোর্স অ্যাপ্লিকেশনটি আমাকে খুব বেশি সময় ব্যয় না করে উত্পাদনশীলভাবে সমস্যার সমাধান করতে সহায়তা করে এবং আমাকে চেরিটিকে কোনও বিভ্রান্তি ছাড়াই ফাইলটির সঠিক সংস্করণ বেছে নিতে দেয়।


0

আমার কেসটি ত্রুটির মত মনে হচ্ছে .... গিট 2.21.0 ব্যবহার করে

আমি একটি টানছি ... এটি বাইনারি ফাইলগুলি সম্পর্কে অভিযোগ করেছে:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

এবং তারপরে এখানে উত্তরগুলির কোনও কিছুই ফলস্বরূপ কোনও আউটপুট তৈরি করে নি।

আমার এখন ফাইলটি যদি আমি দেখি ... তবে এটিই আমি সম্পাদিত। আমি যদি হয়:

git checkout --theirs -- <path>
git checkout --ours -- <path>

আমি আউটপুট পেতে:

Updated 0 paths from the index

এবং আমার কাছে এখনও ফাইলটির আমার সংস্করণ রয়েছে। যদি আমি আরএম করি এবং তারপরে চেকআউট করি তবে এটি পরিবর্তে 1 বলবে, তবে এটি এখনও আমার ফাইলটির সংস্করণ দেয়।

গিট মার্জারুল বলে

No files need merging

এবং গিট স্ট্যাটাস বলে

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

একটি বিকল্প প্রতিশ্রুতিটি পূর্বাবস্থায় ফেলা ... তবে আমি দুর্ভাগ্য এবং আমার অনেক কমিট ছিল, এবং এই খারাপটি প্রথম ছিল। আমি এটি পুনরাবৃত্তি করে সময় নষ্ট করতে চাই না।

তাই এই উন্মাদনা সমাধান করার জন্য:

আমি শুধু দৌড়ে গেলাম

git commit

যা দূরবর্তী সংস্করণটি হারিয়ে ফেলে এবং সম্ভবত অতিরিক্ত বাইনারি ফাইল সঞ্চয় করে কিছু স্থান নষ্ট করে ...

git checkout <commit where the remote version exists> <path>

যা আমাকে রিমোট সংস্করণে ফিরিয়ে দেয়

তারপরে ফাইলটি আবার সম্পাদনা করে ... এবং তারপরে প্রতিশ্রুতিবদ্ধ এবং ধাক্কা দেয় যার অর্থ সম্ভবত বাইনারি ফাইলটির অন্য অনুলিপি সহ স্থান নষ্ট করা।


আমার ক্ষেত্রে, চেষ্টা করার পরে git checkout --ours <path>আমি পেয়েছি Updated 0 paths from the index । আমি এটি git add <path>কমান্ড দিয়ে স্থির করেছি , যা একই কাজ করে।
অ্যান্ড্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.