আমি কীভাবে দূরবর্তী পরিবর্তনগুলি বাতিল করে একটি ফাইলকে "সমাধান করা" হিসাবে চিহ্নিত করতে পারি?


197

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


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

উত্তর:


332

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

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

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

কোনও ফাইলনাম পাস করার সময় এটি অফসেট করা --যেমন একটি ভাল অভ্যাস git checkout --ours -- <filename>। যদি আপনি এটি না করেন এবং ফাইলের নামটি কোনও শাখা বা ট্যাগের নামের সাথে মিলে যায় তবে গিট মনে করবে যে আপনি সেই ফাইলটির নাম পরীক্ষা করে দেখার পরিবর্তে সেই সংশোধনটি পরীক্ষা করতে চান, এবং সুতরাং checkoutকমান্ডের প্রথম ফর্মটি ব্যবহার করুন ।

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

সবচেয়ে সহজ হ'ল আপনি একই সংশোধনীতে রয়েছেন। এই ক্ষেত্রে, আপনি "ইতিমধ্যে আপ টু ডেট", এবং কিছুই ঘটে না।

আরেকটি সম্ভাবনা হ'ল তাদের পুনর্বিবেচনাটি কেবল আপনারই বংশধর, এক্ষেত্রে আপনার ডিফল্টরূপে "ফাস্ট-ফরোয়ার্ড মার্জ" থাকবে, যেখানে HEADকোনও মার্জ হওয়া ঘটবে না বলে আপনার প্রতিশ্রুতিতে সবেমাত্র আপডেট করা হবে (আপনি যদি এটি অক্ষম করতে পারেন তবে সত্যিই ব্যবহার করে একটি মার্জ রেকর্ড করতে চান --no-ff)।

তারপরে আপনি এমন পরিস্থিতিতে পড়ুন যেখানে আপনাকে আসলে দুটি সংশোধনী মার্জ করতে হবে। এই ক্ষেত্রে, দুটি সম্ভাব্য ফলাফল রয়েছে। একটি হ'ল মার্জ পরিষ্কারভাবে ঘটে; সমস্ত পরিবর্তনগুলি বিভিন্ন ফাইলে বা একই ফাইলে রয়েছে তবে উভয় পরিবর্তনের সেট কোনও সমস্যা ছাড়াই প্রয়োগ করা যেতে পারে। ডিফল্টরূপে, যখন একটি পরিষ্কার মার্জ ঘটে তখন এটি স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ হয়, যদিও আপনি --no-commitযদি আগেই এটি সম্পাদনা করতে চান তবে এটি অক্ষম করতে পারেন (উদাহরণস্বরূপ, আপনি যদি ফাংশনটির নাম পরিবর্তন fooকরেন bar, এবং অন্য কেউ কল করে যে নতুন কোড যুক্ত করে foo, এটি পরিষ্কারভাবে মার্জ হবে) , তবে একটি ভাঙা গাছ উত্পাদন করুন, যাতে কোনও ভাঙ্গা কমিটমেন্ট এড়াতে আপনি মার্জ কমিটের অংশ হিসাবে এটি পরিষ্কার করতে চাইতে পারেন)।

চূড়ান্ত সম্ভাবনাটি হ'ল সত্যিকারের একত্রীকরণ এবং এখানে দ্বন্দ্ব রয়েছে। এই ক্ষেত্রে, গীত যতটা একত্রীকরণ হিসাবে এটা করতে পারেন কি করতে হবে, এবং দ্বন্দ্ব চিহ্নিতকারী (ফাইল উত্পাদন <<<<<<<, =======এবং >>>>>>>আপনার কাজের কপিতে)। সূচীতে ("স্টেজিং এরিয়া" নামেও পরিচিত; ফাইলগুলি git addপ্রতিশ্রুতি দেওয়ার আগে ফাইলগুলি সংরক্ষণ করা হয় এমন জায়গায় ) আপনার দ্বন্দ্ব সহ প্রতিটি ফাইলের 3 টি সংস্করণ থাকবে; আপনি যে দুটি শাখাকে মার্জ করছেন তা পূর্বপুরুষের থেকে ফাইলের মূল সংস্করণ, HEAD( সংযুক্তির আপনার পাশের) সংস্করণ এবং দূরবর্তী শাখার সংস্করণ রয়েছে।

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


7
আপনার অবশ্যই সম্ভবত লক্ষ্য করা উচিত যা git add --allসমস্ত ফাইলকে সংগ্রহস্থলীতে যুক্ত করে যাতে আপনার .gitignoreনিদর্শনগুলি নিখুঁত অবস্থায় না থাকলে এটি উদ্দেশ্য থেকে আরও বেশি ফাইল যুক্ত করতে পারে । git add -uএই পরিস্থিতির জন্য সম্ভবত আরও উপযুক্ত, আপনি সংযুক্তি সমাধানের সময় ট্র্যাক করা ফাইলগুলিতে সম্পাদনা করার সম্ভাবনা কম রয়েছে যা আপনি যুক্ত করতে চান না।
সিবি বেইলি

ওহো দুঃখিত. যে আমি বোঝানো কি. এটি এখনই সংশোধন করেছেন।
ব্রায়ান ক্যাম্পবেল

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

তবে আপনার ব্যাখ্যাটি প্রক্রিয়াটি সম্পর্কে আমার পক্ষে অনেকটা পরিষ্কার হয়ে যায়, আবারও ধন্যবাদ ... প্রশ্ন অনুসরণ করুন: একবার সংহত হয়ে গেলে .orig ফাইলগুলি মুছতে গিট পেতে কোনও উপায়?
টম ডিমিল 15'10

2
আপনার করা দরকার git checkout --ours ..গুরুত্বপূর্ণ; কোনও ফাইলের নাম দিয়ে যাওয়ার ক্ষেত্রে (এই ক্ষেত্রে পুরো ডিরেক্টরিটি) দুটি অপারেশনের বিভিন্ন পদ্ধতির মধ্যে নির্বাচন করে checkout, একটি যা শাখাগুলি স্যুইচ করে এবং একটি যা সূচী থেকে কার্যকরী অনুলিপিগুলিতে ফাইলগুলি সরিয়ে দেয়। আমি একমত, এটি খুব বিভ্রান্তিকর আপনি git checkout --ours -- <filename>একবারে পৃথক ফাইল চেক আউট করতে পারেন।
ব্রায়ান ক্যাম্পবেল

23

নিশ্চিত সংঘাতের মূল করুন: যদি এটি একটি ফল git mergeদেখতে ব্রায়ান ক্যাম্পবেল এর উত্তর

তবে যদি এর ফলাফল হয় git rebase, দূরবর্তী (তাদের) পরিবর্তনগুলি বাতিল করতে এবং স্থানীয় পরিবর্তনগুলি ব্যবহার করতে, আপনাকে এগুলি করতে হবে:

git checkout --theirs -- .

কীভাবে পুনর্বাসনের সময় এবং কীভাবে অদলবদল হয় তা দেখতে " ours" এবং " theirs" বিপরীত " " কেন দেখুন (কারণ উজানের শাখাটি চেক আউট হয়ে গেছে)।ourstheirs

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