সমস্ত ফাইলের জন্য - ঘন্টা / - ব্যবহার করে গিট মীমাংসার বিবাদ


111

চেকআউট --oursএবং সমস্ত ফাইলের জন্য দ্বন্দ্ব সমাধানের কোনও উপায় আছে --theirs? আমি জানি যে আপনি পৃথক ফাইলের জন্য এটি করতে পারেন তবে এটির জন্য কোনও উপায় খুঁজে পাচ্ছেন না।


7
নেই git checkout --ours -- .কাজ করে? .মানে বর্তমান ডিরেক্টরী, যখন কাজ ডিরেক্টরি রুট থেকে আবেদন করেছিলেন, তাই এটি মূলত সমগ্র পরিশ্রমী ডিরেক্টরি মানে। --oursযদিও এটি পতাকাটির সাথে কাজ করবে কিনা তা নিশ্চিত নয় এবং এটি কীভাবে মুছে ফেলা বা নাম পরিবর্তিত ফাইল বিবাদগুলি পরিচালনা করবে তা আমি নিশ্চিত নই।

@ ক্যাপকেকে আমি এটি সফলভাবে ব্যবহার করেছি। সম্ভবত যে একটি উত্তর করা উচিত?
পেড্রো গিমেনো

উত্তর:


90

ওয়ার্কিং ডিরেক্টরি থেকে গ্রেপ করুন এবং এক্সগার্স কমান্ডের মাধ্যমে আউটপুট প্রেরণ করুন:

grep -lr '<<<<<<<' . | xargs git checkout --ours

অথবা

grep -lr '<<<<<<<' . | xargs git checkout --theirs

এটি কীভাবে কাজ করে: বিরোধী মার্কার্সের (স্ট্রিং '<<<<<<<') সন্ধানের জন্য grepবর্তমান ডিরেক্টরি (দ্য .) এবং উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে ( -rপতাকা) প্রতিটি ফাইলের মধ্যে অনুসন্ধান করবে )

-lবা --files-with-matchesপতাকা আউটপুট শুধুমাত্র ফাইলের নাম যেখানে স্ট্রিং পাওয়া যায়নি, grep ঘটায়। স্ক্যান করা প্রথম ম্যাচের পরে বন্ধ হয়ে যায়, সুতরাং প্রতিটি ম্যাচ করা ফাইল কেবল একবার আউটপুট হয়।

মিলে যাওয়া ফাইলের নামগুলি তারপরে xargs এ পাইপ করা হয় , এমন একটি ইউটিলিটি যা পাইপযুক্ত ইনপুট স্ট্রিমটিকে পৃথক যুক্তিগুলির জন্য আলাদা করে দেয় বাgit checkout --ours--theirs

আরও এই লিঙ্কে

যেহেতু কমান্ড লাইনে প্রতিবার এটি টাইপ করা খুব অসুবিধে হবে, আপনি যদি নিজেকে এটি অনেক বেশি ব্যবহার করে দেখেন, তবে আপনার পছন্দসই শেলের জন্য একটি উলাম তৈরি করা খারাপ ধারণা নাও হতে পারে : বাশ স্বাভাবিক ।

এই পদ্ধতিটি কমপক্ষে গিট সংস্করণ 2.4.x এর মাধ্যমে কাজ করা উচিত


14
গ্রেপিংয়ের পরিবর্তে, আমি মনে করি এটি ব্যবহার করাও সম্ভব git diff --name-only --diff-filter=U
থাই

10
এছাড়াও git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]। আপনার যদি কোনও বড় প্রকল্প থাকে তবে গ্রেপিংয়ের চেয়ে দ্রুত।
joshbodily

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

1
নোট করুন যে এটি বিরোধী নামকরণ / নামকরণের জন্য কাজ করে না, উদাহরণস্বরূপ,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
বোরেক বার্নার্ড

1
তবুও অন্য বিকল্প: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
জিট্রাক্স

52

আপনি -Xoursবা -Xtheirsসঙ্গে git mergeহিসাবে ভাল। তাই:

  1. বর্তমান মার্জ বাতিল (উদাহরণস্বরূপ git reset --hard HEAD)
  2. আপনার পছন্দের কৌশলটি ব্যবহার করে মার্জ করুন ( git merge -Xoursবা git merge -Xtheirs)

অস্বীকৃতি: অবশ্যই আপনি কেবল একটি বিকল্প বেছে নিতে পারেন, হয় -Xoursবা -Xtheirs, অবশ্যই অবশ্যই কৌশল দ্বারা ফাইলের মধ্যে যাওয়া উচিত strategy

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


ধন্যবাদ, তাদের একীকরণের জন্য '- আওয়ারস' এবং '- তাদের' আছে জানতেন না। দেখে মনে হচ্ছে যে মার্জ করার জন্য তারা আসলে '-s' কৌশলটির অংশ নয়, তবে '-X' পুনরাবৃত্ত বিকল্পগুলির অংশ part আমাদের -'র সংস্করণ আসলে একত্রিত না করে সমস্ত ফাইল প্রতিস্থাপন করে এবং তাদের উপস্থিতি নেই।
exe163

V1.9.4 গিট করার জন্য কোনও --theirsবা- --oursবিকল্প নেই । একটি পদ্ধতির হবে git merge -s recursive -Xtheirs BRANCH
fbmd

--theirsএবং --oursনা গিট সঙ্গে উপলব্ধ 2.2.0। হয় আমার উত্তরটি সুনির্দিষ্ট ছিল না বা তারা পুরানো গিট সংস্করণে উপলব্ধ ছিল (এটি উত্তর আইটি যুগে বেশ পুরানো)। সঠিক পদ্ধতির সাথে হয় -X। আমি সে অনুযায়ী আপডেট করছি
ধন্যবাদ ফরফারআল দ্য ফিশ

সংস্করণ ২.৪.০ অনুসারে
দিমিত্রি

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

37

git checkout --[ours/theirs] .যতক্ষণ আপনি সমস্ত দ্বন্দ্বের মূলে রয়েছেন ততক্ষণ আপনি যা চান তা করবে। আমাদের / তাদের কেবলমাত্র নিমজ্জিত ফাইলগুলিকেই প্রভাবিত করে যাতে আপনার বিশেষভাবে গ্রেপ / সন্ধান / ইত্যাদি দ্বন্দ্ব তৈরি করা উচিত নয়।


5
আমার কাছে এটি সাব-ডিরেক্টরিতে পুনরাবৃত্তি বলে মনে হচ্ছে না।
ড্যানিয়েল বোগম্যান

5
আমি পেতে error: path 'foo/bar/blah' does not have our version
রবিন গ্রিন

আমি গিট সংস্করণ 2.16.2.windows.1 ব্যবহার করছি এবং এটি আমার পক্ষে নিখুঁতভাবে কাজ করে। ধন্যবাদ!
প্যাঙ্কউড

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

কাজটি মনে হচ্ছে। মনে রাখবেন এটি অর্জনের জন্য আপনাকে গিট রেপোর মূল ডিরেক্টরিতে সিডি করতে হবে।


3
আমি মনে করি এটি শীর্ষ ভোটের চেয়ে উত্তম একটি উত্তর কারণ (1) এটি কেবলমাত্র কার্যনির্বাহী ডিরেক্টরি নয়, সমস্ত ফাইলে প্রযোজ্য; এবং (2) এটি বিরোধী চিহ্নিতকারীদের গ্রেপিংয়ের চারপাশে কোনও ভঙ্গুরতা থাকবে না। এখানে 'গিট ডিফ' কমান্ডটি সমস্ত নিমজ্জিত পাথকে তালিকাবদ্ধ করে, যা আমরা চেকআউট করতে চাই।
bchurchill

নিস! আমি সর্বদা দ্বন্দ্ব চিহ্নিতকারীদের গ্রেপ
00-বিবিবি

7

যদি অন্য কেউ কেবল একটি শাখার থেকে অন্য শাখায় (ওস্তাদ বলুন) সমস্ত কিছু ওভাররাইট করে দেখছে, তবে এর থেকে সহজ উপায় আছে:

git merge origin/master --strategy=ours

ধন্যবাদ https://stackoverflow.com/a/1295232/560114

বা অন্য পথে, দেখুন "গিট মার্জ -স আওয়ারস" এর একটি "তাদের" সংস্করণ রয়েছে?


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

আমি এই ফাংশনটি .zshrc ফাইলটিতে যুক্ত করেছি ।

তাদের এইভাবে ব্যবহার করুন: gitcheckoutall theirsবাgitcheckoutall ours

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