নির্দিষ্ট ফাইলগুলির জন্য গিট একীকরণ কৌশলটি চয়ন করুন ("আমাদের", "আমার", "তাদের")


207

আমি ক এর পরে রেবাইজিং এর মাঝে আছি git pull --rebase। আমার কাছে কয়েকটি ফাইল রয়েছে যা সংশ্লেষিত হয়েছে। আমি নির্দিষ্ট ফাইলগুলির জন্য "তাদের" পরিবর্তনগুলি বা "আমার" পরিবর্তনগুলি কীভাবে গ্রহণ করব?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

সাধারণত আমি কেবল ফাইল বা একটি মার্জ সরঞ্জামটি খুলি এবং ম্যানুয়ালি সমস্ত "তাদের" বা "আমার" পরিবর্তনগুলি গ্রহণ করি। তবে আমি সন্দেহ করি যে আমি একটি সুবিধাজনক গিট কমান্ড অনুপস্থিত।

এছাড়াও মনে রাখবেন যে আমি যখন ফাইলগুলি দ্বন্দ্বগুলি সম্ভবত মারামারি করে তা দ্বন্দ্বগুলি কী তা দেখি তখনই আমি প্রতিটি ফাইলের জন্য একত্রীকরণ কৌশলটি বেছে নিতে সক্ষম হব।


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

আমি এই প্রশ্নটি আরও জেনারিক হওয়ার জন্য সম্পাদনা করেছি: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 278081/… । আমরা কি এর সদৃশ হিসাবে এই প্রশ্নটি বন্ধ করতে পারি? এটা কি উপযুক্ত?

@ শ্যাডো আমার পক্ষে এটি যুক্তিযুক্ত বলে মনে হচ্ছে।
স্টিভেন ওয়েক্সলার

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

উত্তর:


251

প্রতিটি বিবাদমান ফাইলের জন্য আপনি নির্দিষ্ট করতে পারেন

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

ডক্স থেকেgit checkout

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

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

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


9
ডুবে থাকা সমস্ত ফাইলের জন্য থেরিয়র গ্রহণ করা কি সম্ভব?
aslakjo

41
@ এসলাকজো git rebase -s recursive -X <ours/theirs>বা git merge -s recursive -X <ours/theirs>। মনে রাখবেন যে পুনর্বাসনের জন্য, "আমাদের" এবং "তাদের" একত্রিত হওয়ার সময় যা আছে তার থেকে বিপরীত। আপনি সম্ভবত একটি ফাইল / শেল গ্লোবও ব্যবহার করতে পারেন, পছন্দ করুন git checkout --theirs -- *.txt

2
অনেক ধন্যবাদ, @ ক্যাপকেকে, রিবেসের ours/theirsসাথে অপ্রত্যাশিত বিপর্যয় আমাকে পাগল করে দিচ্ছে !! (এটি এখন বোধগম্য হয়েছে যে আমি কীভাবে একটি রিবেস আসলে কাজ করে সে সম্পর্কে চিন্তা করি তবে মোটেই স্বজ্ঞাত নয়))
ড্যান লেন্সকি

2
সাধারণভাবে ড্যানলেন্সকি রিবেসটি প্রথমে লোকেরা বোঝার জন্য একটি সত্যই জটিল কৌশল, তবে এটি কীভাবে কাজ করে তা একবার বুঝতে পারলে আপনি এটি দিয়ে সমস্ত ধরণের শক্তিশালী জিনিস করতে পারেন।

1
@ ভিনসেন্টসেলস আসলে আপনার * অক্ষরটি মাস্ক করা দরকার, অন্যথায় শেলটি এটি প্রসারিত করার চেষ্টা করবে। সুতরাং আপনার ক্ষেত্রে git checkout --outs -- "**/*.csproj"আপনি যা বলতে চাইছেন তা করবে। একই সত্য যেমন জন্য git lfs track "*.jpg"। আপনার সিডব্লুডিতে যদি কিছু জেপিজি-ফাইল থাকে, উদ্ধৃতি ব্যতীত, কেবলমাত্র সেগুলি ট্র্যাক করা যেতে পারে।
eFloh

117

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

Git রি-বেসের ফলে
theirs আসলে ক্ষেত্রে বর্তমান শাখা রি-বেসের ফলে । সুতরাং নীচের কমান্ডগুলির সেটগুলি আসলে দূরবর্তী শাখার উপর আপনার বর্তমান শাখার পরিবর্তনগুলি গ্রহণ করছে।

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git মার্জ
জন্য একত্রীকরণ , অর্থ theirsএবং oursবিপরীত। সুতরাং, মার্জ করার সময় একই প্রভাব পেতে , যেমন oursদূরবর্তী শাখাকে মার্জ করা ( theirs) এর উপরে আপনার বর্তমান শাখা পরিবর্তন ( ) রাখুন।

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b

2
ভাল, এটি বেশ গুরুত্বপূর্ণ পার্থক্য! স্পষ্ট করার জন্য ধন্যবাদ।
ভার্বোজে

26

দ্রষ্টব্য যে ফাইলগুলি সম্পূর্ণরূপে ওভাররাইটgit checkout --ours|--theirs করবে, যে কোনও একটি বা সংস্করণ বেছে নিয়ে আপনি যা করতে চান বা তা নাও হতে পারে (যদি আপনার অন্য পক্ষ থেকে কোনও দ্বন্দ্বপূর্ণ পরিবর্তন আসে তবে সেগুলি হারিয়ে যাবে)।theirsours

পরিবর্তে আপনার কাছে সেই ফাইলে তিন উপায় মার্জ কার্য সম্পাদনা করতে, এবং শুধুমাত্র সমাধান চান বিরোধ কৃপণ ব্যক্তি ব্যবহার --ours|--theirs, যখন অ বিরোধ কৃপণ ব্যক্তি পালন জায়গায় উভয় পক্ষের, আপনি অবলম্বন করতে পারেন git merge-file; এই উত্তরে বিশদ দেখুন ।


1
যে "নন-বিবাদী পরিবর্তনগুলি" হারাবে সে সম্পর্কে - এটি কেবলমাত্র সেই ফাইলগুলিকে বোঝায় যেখানে নির্দিষ্ট লাইনগুলিতে একই বিরোধী পরিবর্তনগুলি রয়েছে যেখানে একই ফাইলটি রয়েছে, বা সারিবদ্ধ ইতিহাসের সমস্ত ফাইল থেকে সমস্ত পরিবর্তন রয়েছে?
ktamlyn

2
"বিতর্কিত পরিবর্তনগুলি" দ্বারা @ktamlyn মানে একই ফাইলটিতে পরিবর্তন changes উদাহরণ হিসেবে বলা যায়, দুই পরিবর্তিত কৃপণ ব্যক্তি (অংশ) হয় example.txtমধ্যে oursসংস্করণ, এক জড়তা কিসের (এছাড়াও পরিবর্তিত theirsসংস্করণ), অন্যান্য অ বিরোধ নেই। আপনি যদি git checkout --theirs example.txtএটি করেন তবে এটি পুরো ফাইলটি অন্ধভাবে theirsপুনর্বিবেচনায় পড়বে এবং ভিন্নতার বিরোধহীন অংশটি হারিয়ে যাবে।
jakub.g

1
ধন্যবাদ! "একই ফাইলের পরিবর্তনগুলি" এই প্রসঙ্গে সর্বাধিক উপলব্ধি করেও এটি আমার পক্ষে একটি প্রয়োজনীয় স্পষ্টতা ছিল।
ktamlyn

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, ভাল, যদিও এটি সত্যই কোনও উত্তর দেয় না, তবে অন্যান্য প্রস্তাবিত সমাধানে একটি গুরুত্বপূর্ণ বিষয় নির্দেশ করে।
টমসায়নে

1
আপনি যদি মূল বিবাদযুক্ত ফাইলটিতে ফিরে যেতে চান তবে আপনি চালাতে পারেন git checkout --merge <path>
অ্যান্ড্রু কিটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.