আপনি যদি আপনার লোকাল মেশিনে যেকোনো অকমিটেড পরিবর্তন রাখেন যা রিমোট রিপোজিটরির কন্টেন্টের সাথে কনফ্লিক্ট করে, তবে আপনি সেই রিমোট রিপোজিটরি থেকে কোড পুল করতে পারবেন না। এটি আপনার সংরক্ষণ করতে চাওয়া কোড ওভাররাইট হতে বাধা দেয়।
এই গাইডে আমরা "Your local changes to the following files would be overwritten by merge" এরর নিয়ে আলোচনা করব এবং কেন এটি হয় তার কারণ ব্যাখ্যা করব। একটি উদাহরণের মাধ্যমে আপনি শিখবেন কিভাবে এই এরর সমাধান করতে হয়।
এররটি কেন হয়?
আপনার লোকাল রিপোজিটরির ভার্সন প্রাযতিক রিমোট রিপোজিটরির থেকে আলাদা হতে পারে। এটি Git-এর একটি মূল বৈশিষ্ট্য: আপনি রেডি না হওয়া পর্যন্ত লোকালি পরিবর্তন করতে পারেন, পুশ করতে হবে না।
যখন আপনি রিমোট রিপোজিটরি থেকে কোড পুল করেন, Git সেই রিপোজিটরির কন্টেন্ট আনার চেষ্টা করে এবং আপনার লোকাল মেশিনে সংরক্ষণ করে। এটি শুধু তখনই সম্ভব যখন আপনি সংরক্ষণ করতে চাওয়া সব ফাইলের পরিবর্তন কমিট করে থাকেন।
যদি আপনি পরিবর্তন কমিট না করে কোড পুল করার চেষ্টা করেন, এবং আপনি যে ফাইলটি মডিফাই করেছেন সেটি রিমোট রিপোজিটরিতেও পরিবর্তিত হয়েছে, তবে আপনি এই এররটি দেখতে পাবেন: "Your local changes to the following files would be overwritten by merge"।
একটি উদাহরণ পরিস্থিতি
চলুন ck-git নামক একটি Git রিপোজিটরিতে সংশোধন করি। প্রথমে এই রিপোজিটরিটি ক্লোন করি:
git clone https://github.com/career-karma-tutorials/ck-git
এখন আমাদের লোকাল মেশিনে রিপোজিটরির একটি কপি আছে। এই রিপোজিটরিতে একটি ফাইল আছে: README.md। এর কন্টেন্ট:
# ck-git
আমরা GitHub-এ যেটে এই ফাইলটি সার্ভারে মডিফাই করি। এখন ফাইলের কন্টেন্ট:
# Career Karma Git
আমাদের লোকাল রিপোজিটরির ভার্সন এখন রিমোট রিপোজিটরির origin master ব্র্যাঞ্চ থেকে আলাদা।
আমাদের ভার্সনে সেই কোড আছে যা আমরা কোড পুল করার সময় রিমোট রিপোজিটরিতে ছিল। রিমোট রিপোজিটরিতে README.md-এ করা পরিবর্তন আছে।
এখন, আমরা লোকাল মেশিনে README.md পরিবর্তন করি:
# CK Git
আমরা আমাদের ফাইলটি পরিবর্তন করেছি। এখন, আমরা রিমোট রিপোজিটরিতে করা পরিবর্তনগুলো পুল করে লোকাল মেশিনে সংরক্ষণ করার চেষ্টা করি:
git pull
এই কমান্ডটি একটি এরর ফেরত দেয়:
... Updating a30b784..ec281fc error: Your local changes to the following files would be overwritten by merge: README.md Please commit your changes or stash them before you merge. Aborting
ব্রieviate করার জন্য রেসপন্স সংক্ষিপ্ত করা হয়েছে। আমাদের ফোকাস করা উচিত বার্তাটি: "Your local changes to the following files would be overwritten by merge"।
সমাধানগুলো
এখন আমাদের ফাইলের দুটি কপি আছে: একটি লোকাল মেশিনে এবং অন্যটি রিমোট রিপোজিটরিতে। যখন আমরা রিমোট রিপোজিটরি থেকে কোড পুল করি, Git বুঝতে পারে না কোন ভার্সন রাখা উচিত।
এই এরর সমাধান করতে আমরা হয় কোড স্ট্যাশ করতে পারি বা কমিট করতে পারি।
সমাধান ১: কোড কমিট করা
আমাদের কোড কমিট করতে, README.md ফাইলটি অ্যাড করে একটি কমিট তৈরি করি:
git add README.md git commit -m "docs: Update README.md"
এটি আমাদের লোকাল মেশিনে README.md-এ করা পরিবর্তনগুলো প্রজেক্টের কমিট ইতিহাসে যোগ করবে। Git এখন জানবে যে আমরা এই পরিবর্তনগুলো রাখতে চাই।
সমাধান ২: কোড স্ট্যাশ করা
দ্বিতীয় সমাধান হলো আমাদের পরিবর্তনগুলো স্ট্যাশ করা। এটি আমাদের পরিবর্তনগুলো পরবর্তীতে দেখার জন্য সংরক্ষণ করে রাখে। আমরা নিচের কমান্ড দিয়ে কোড স্ট্যাশ করতে পারি:
git stash
এই কমান্ড আমাদের পরিবর্তনটি একটি স্ট্যাশে সংরক্ষণ করে (আমাদের কোড "stashed away" হয় পরবর্তীতে ব্যবহারের জন্য)। এখন যেহেতু আমরা কোড স্ট্যাশ করেছি, আমরা নিরাপদে রিমোট রিপোজিটরি থেকে কোড পুল করতে পারি:
git pull
পুল করার পর স্ট্যাশ করা কোড ফিরিয়ে আনতে:
git stash pop
Git স্ট্যাশে সংরক্ষিত কোডটি git stash pop কমান্ড চালালে দেখা যায়। এটি আমাদের সেই ফাইলে করা পরিবর্তনগুলো দেখাবে যা আমরা রিপোজিটরিতে কমিট করিনি। এর মানে হলো যদি আমরা পরবর্তীতে ফাইলে পরিবর্তনগুলো কমিট করতে চাই, তবে করতে পারব।
উপসংহার
"Your local changes to the following files would be overwritten by merge" এররটি হয় যখন আপনি একটি রিমোট রিপোজিটরি লোকাল মেশিনে পুল করার চেষ্টা করেন যার কন্টেন্ট আপনার লোকাল রিপোজিটরির ভার্সনের সাথে কনফ্লিক্ট করে।
এই এরর ফিক্স করতে, হয় আপনার পরিবর্তনগুলো পরবর্তীতে কাজ করার জন্য স্ট্যাশ করে রাখুন, অথবা কমিট করুন। এখন আপনার पास এই এররকে একজন এক্সপার্টের মত সমাধান করার জ্ঞান আছে!