গিট ব্যবহার করে একটি সম্পূর্ণ ফাইলে 'তাদের গ্রহণ করতে' বা 'মেনে নেওয়ার' সহজ সরঞ্জাম


399

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

এমন কোনও কমান্ড লাইনের সরঞ্জাম আছে যা দ্বন্দ্ব চিহ্নিতকারীদের থেকে মুক্তি পাবে এবং আমার পছন্দের উপর ভিত্তি করে সমস্ত এক উপায় বা অন্যটি বেছে নেবে? বা গিট কমান্ডগুলির একটি সেট যা আমি প্রতিটি করতে নিজেই ওরফে করতে পারি।

# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"

এটি করা বরং বিরক্তিকর। 'আমার গ্রহণ করুন' এর জন্য আমি চেষ্টা করেছি:

randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.

randy@sabotage ~/linus $ git checkout Makefile 
error: path 'Makefile' is unmerged

andy@sabotage ~/linus $ git reset --hard HEAD Makefile 
fatal: Cannot do hard reset with paths.

আমার কীভাবে এই পরিবর্তন চিহ্নিতকারীদের থেকে মুক্তি পাওয়ার কথা?

আমি করতে পারি:

git reset HEAD Makefile; rm Makefile; git checkout Makefile

তবে এটি প্রায় চারপাশে মনে হয়, আরও ভাল উপায় থাকতে হবে। এবং এই মুহুর্তে, আমি নিশ্চিত নই যে গিট এমনকি মার্জটি ঘটেছে বলে মনে করে, তাই আমি এটি অগত্যা এমনকি এটি কাজ করে না বলেও মনে করি না।

অন্য পথে যেতে 'তাদের গ্রহণ করুন' করাও একই রকম অগোছালো। আমি এটির একমাত্র উপায়টি হ'ল করণীয়:

git show test-branch:Makefile > Makefile; git add Makefile;

এটি আমাকে একটি বিশৃঙ্খল প্রতিশ্রুতি বার্তা দেয়, যার দ্বন্দ্ব রয়েছে: এতে মেকফিল দুটিবার রয়েছে।

উপরের দুটি ক্রিয়াটি কীভাবে সহজ উপায়ে করা যায় দয়া করে কেউ দয়া করে নির্দেশ করতে পারেন? ধন্যবাদ


4
আমি এটি একটি তিন বছর হিসাবে + গিট কমান্ড লাইন ব্যবহারকারী হিসাবে আপনাকে দিতে হবে আমি স্মৃতি থেকে এটি হাস্যকরভাবে কঠিন মনে করি। এটি সত্যই ডিফল্টরূপে নির্মিত উচিত।
মাউভিস লেডফোর্ড

উত্তর:


602

সমাধান খুব সহজ। সূচীgit checkout <filename> থেকে ফাইল চেক আউট করার চেষ্টা করে এবং তাই একীভূত করতে ব্যর্থ হয়।

আপনার যা করা দরকার তা হ'ল (অর্থাত্ একটি প্রতিশ্রুতি চেকআউট ):

আপনার নিজস্ব সংস্করণ চেকআউট করতে আপনি এর মধ্যে একটি ব্যবহার করতে পারেন :

git checkout HEAD -- <filename>

অথবা

git checkout --ours -- <filename>

অথবা

git show :2:<filename> > <filename> # (stage 2 is ours)

অন্যান্য সংস্করণ চেকআউট করতে আপনি এর মধ্যে একটি ব্যবহার করতে পারেন :

git checkout test-branch -- <filename>

অথবা

git checkout --theirs -- <filename>

অথবা

git show :3:<filename> > <filename> # (stage 3 is theirs)

এটিকে সমাধান হিসাবে চিহ্নিত করতে আপনার 'অ্যাড' চালানো দরকার:

git add <filename>

31
আমি এটি কিছুটা অদ্ভুত বলে মনে করেছি --oursএবং এর --theirsঅর্থ হ'ল এই আদেশটি চেষ্টা করার সময় আমি স্বজ্ঞাতভাবে যা ভাবলাম তার বিপরীতে ...
জোশুয়া মুহিম

6
ব্যবহার করার সময় সতর্কতা অবলম্বন করুন git show- এটি নতুন লাইনের নর্মালাইজেশন এড়িয়ে যায়।
ক্রনিকাল

2
এটি কয়েকটি ফাইলের জন্য দুর্দান্ত, তবে আপনার যখন অনেকগুলি ফাইল বিরোধে রয়েছে (কারণ একটি মন্তব্যে তারিখ পরিবর্তন করা হয়েছিল!), আপনি কীভাবে এটি করবেন?
জোভানিসি

4
@ সাঁথোস: --গিট ব্যবহার করে পথের নামগুলি (ফাইলের নাম, ডিরেক্টরি) থেকে পৃথক করে সংশোধন (শাখার নাম ইত্যাদি) ব্যবহার করতে। গিট যদি শাখার নাম বা ফাইলের নাম কিনা তা নির্ধারণ করতে পারে তা গুরুত্বপূর্ণ। এটি আর্গুমেন্ট (ফাইলের নাম) থেকে পৃথক বিকল্পগুলিতে ডাবল ড্যাশ ব্যবহারের কনভেনশন অনুসরণ করে।
জাকুব নরবস্কি

3
@ সামারন @ জোশুয়া মুহিম; theirs/ oursঅদলবদল প্রদর্শিত পারেন যদি আপনি একটি রি-বেসের ফলে অপারেশন প্রেক্ষাপটে কোন্দল নিরসনে করছে। যেহেতু রিবেস লক্ষ্য শাখাটি পরীক্ষা করে কাজ করে তারপরে চেরি-পিকিং "আপনার" শাখা থেকে লক্ষ্যকে লক্ষ্য করে, আগত পরিবর্তন ("তাদের") "আপনার" শাখা থেকে এবং বর্তমান শাখাটি লক্ষ্য শাখা ("আমাদের") )।
আরজেফালকোনার

93

এটা চেষ্টা কর:

তাদের পরিবর্তনগুলি গ্রহণ করতে: git merge --strategy-option theirs

আপনার গ্রহণ করতে: git merge --strategy-option ours


5
মনে রাখবেন যে এটি সমস্ত বিবাদী ফাইলগুলির জন্য আপনার পরিবর্তনগুলি বজায় রাখবে, তাই যদি কোনও অপ্রত্যাশিত সংঘাত ঘটে তবে বিপজ্জনক হতে পারে।
জন

3
এবং আপনি চেরি-পিক এবং রিবেসের মতো অন্যান্য মার্জ-ওয়াই কমান্ডের জন্য এটি ব্যবহার করতে পারেন।
ইডব্রি

50

জাকুবের উত্তরের ভিত্তিতে আপনি সুবিধার জন্য নিম্নলিখিত গিট এলিয়াসগুলি কনফিগার করতে পারেন:

accept-ours = "!f() { git checkout --ours -- \"${@:-.}\"; git add -u \"${@:-.}\"; }; f"
accept-theirs = "!f() { git checkout --theirs -- \"${@:-.}\"; git add -u \"${@:-.}\"; }; f"

তারা বৈকল্পিকভাবে সমাধানের জন্য ফাইলগুলির এক বা একাধিক পাথ নেয় এবং কোনওটি না দেওয়া থাকলে বর্তমান ডিরেক্টরিতে সমস্ত সমাধান করার জন্য ডিফল্ট।

এগুলিকে [alias]আপনার ~/.gitconfigবা রান বিভাগে যুক্ত করুন

git config --global alias.accept-ours '!f() { git checkout --ours -- "${@:-.}"; git add -u "${@:-.}"; }; f'
git config --global alias.accept-theirs '!f() { git checkout --theirs -- "${@:-.}"; git add -u "${@:-.}"; }; f'

1
আমার জন্য কাজ করছে না ... এগুলি কি বাশ বা অন্য কোনও শেলের জন্য?
ব্যবহারকারীর 456584

এগুলি গিট এলিয়াস, এগুলি [alias]আপনার ~.gitconfigবা ব্যবহারের বিভাগে যুক্ত করুন git config --global accept-ours "..."। আমার উত্তর সম্পাদনা করেছেন।
কিনান

2
আপনার কোন ধারণা নেই যে এই উরফ আমাকে কতটা সময় বাঁচিয়েছিল। থাম্বস আপ!
অ্যাডাম পার্কিন

1
@hakre নিশ্চিত করুন যে আপনি নামটি উদ্ধৃত করেছেন, অন্যথায় আপনার শেল এটি ব্যাখ্যা করার চেষ্টা করবে। অথবা কেবল নিজেই সম্পাদনা করুন ~/.gitconfig
কিনান

1
ডিফল্ট মান জন্য শেল শব্দবিন্যাস:!f() { git checkout --ours -- "${@:-.}" git add -u "${@:-.}; }; f
jthill

17

কিনানের উত্তরের উপর ভিত্তি করে, এখানে একই অ্যালিয়াস রয়েছে, পরিবর্তিত হয়েছে যাতে তারা ফাইলের নামগুলিতে স্পেস এবং প্রাথমিক ড্যাশগুলি পরিচালনা করতে পারে:

accept-ours = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --ours -- \"$@\"; git add -u -- \"$@\"; }; f"
accept-theirs = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --theirs -- \"$@\"; git add -u -- \"$@\"; }; f"

0

কোন্দল নিরসনে জন্য আদর্শ পরিস্থিতি যখন আপনি সময় কোন পথে আপনি তাদের সমাধান করতে চান এবং প্রেরণ করতে পারেন এগিয়ে জানেন -Xoursবা -Xtheirsরিকার্সিভ একত্রীকরণ কৌশল অপশন। এর বাইরে আমি তিনটি মনোরম দেখতে পাচ্ছি:

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

এই তিনটি পরিস্থিতিতে সমাধান করার জন্য আপনি নিম্নলিখিত .gitconfigফাইলগুলি আপনার ফাইলে যুক্ত করতে পারেন (বা সমমানের):

[merge]
  conflictstyle = diff3
[mergetool.getours]
  cmd = git-checkout --ours ${MERGED}
  trustExitCode = true
[mergetool.mergeours]
  cmd = git-merge-file --ours ${LOCAL} ${BASE} ${REMOTE} -p > ${MERGED}
  trustExitCode = true
[mergetool.keepours]
  cmd = sed -I '' -e '/^<<<<<<</d' -e '/^|||||||/,/^>>>>>>>/d' ${MERGED}
  trustExitCode = true
[mergetool.gettheirs]
  cmd = git-checkout --theirs ${MERGED}
  trustExitCode = true
[mergetool.mergetheirs]
  cmd = git-merge-file --theirs ${LOCAL} ${BASE} ${REMOTE} -p > ${MERGED}
  trustExitCode = true
[mergetool.keeptheirs]
  cmd = sed -I '' -e '/^<<<<<<</,/^=======/d' -e '/^>>>>>>>/d' ${MERGED}
  trustExitCode = true

get(ours|theirs)টুল শুধু ফাইলের নিজ নিজ সংস্করণ রাখে এবং পরিবর্তনের অন্যান্য সংস্করণ থেকে (তাই কোন মার্জ পড়ে) সব দূরে ছোঁড়ার।

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

keep(ours|theirs)টুল কেবল পরিবর্তন চিহ্নিতকারী এবং ঘিরা বিভাগে আউট সম্পাদনাগুলি তাদের রেগুলার এক্সপ্রেশন দ্বারা সনাক্ত। এটির সুবিধাটি রয়েছে যে এটি মার্জ কমান্ড থেকে পৃথক বিকল্পগুলি সংরক্ষণ করে এবং আপনাকে কিছু দ্বন্দ্ব হাত দ্বারা সমাধান করতে দেয় এবং তারপরে বাকীটি স্বয়ংক্রিয়ভাবে সমাধান করতে দেয়। এতে অসুবিধা রয়েছে যে ফাইলটিতে অন্য সংঘাতের চিহ্নিতকারী থাকলে তা বিভ্রান্ত হতে পারে।

এগুলি সমস্ত চালনার মাধ্যমে ব্যবহৃত হয় git mergetool -t (get|merge|keep)(ours|theirs) [<filename>]যদি <filename>সরবরাহ না করা হয় তবে এটি সমস্ত বিবাদযুক্ত ফাইলগুলি প্রক্রিয়া করে।

সাধারণভাবে বলতে গেলে, ধরে নিলে আপনি জানেন যে নিয়মিত ভাবটি বিভ্রান্ত করার জন্য কোনও আলাদা মার্কার নেই, keep*কমান্ডের রূপগুলি সবচেয়ে শক্তিশালী। আপনি যদি mergetool.keepBackupঅপশনটি সেট না করে বা সত্যটি ছেড়ে দেন তবে একীভূত হওয়ার পরে আপনি *.origফাইলটি আলাদা করে দিতে পারেন যা মার্জ করার ফলাফলের সাথে এটির অর্থবোধ করে তা পরীক্ষা করে। উদাহরণস্বরূপ, প্রতিশ্রুতি mergetoolদেওয়ার আগে পরিবর্তনগুলি নিরীক্ষণের জন্য আমি নিম্নলিখিতটি অনুসরণ করি :

for f in `find . -name '*.orig'`; do vimdiff $f ${f%.orig}; done

দ্রষ্টব্য : যদি merge.conflictstyleতা না হয় diff3তবে নিয়মের /^|||||||/প্যাটার্নটি পরিবর্তে হওয়া দরকার।sed/^=======/

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