আপনি একটি ফাইল দুই ব্রাঞ্চে মডিফাই করতে পারবেন না এবং কমিট বা স্ট্যাশ ছাড়া সেই ব্রাঞ্চগুলোতে সুইচ করতে পারবেন না। এর কারণ হলো Git অনিশ্চিত যে কী পরিবর্তন সংরক্ষণ করা উচিত এবং কী ওভাররাইট করা উচিত।
এই গাইড "Your local changes to the following files would be overwritten by checkout" এরর এবং এর অর্থ আলোচনা করে। আমরা একটি উদাহরণ দিয়ে ব্যাখ্যা করব যাতে আপনি এই এরর কীভাবে ফিক্স করবেন শিখতে পারেন।
Your local changes to the following files would be overwritten by checkout
Git ভার্সন কন্ট্রোল আপনাকে আলাদা ডেভেলপমেন্ট লাইন মেইনটেইন করতে দেয়, যাকে ব্রাঞ্চ বলা হয়। এক ব্রাঞ্চের পরিবর্তনগুলো অন্য ব্রাঞ্চে রিফ্লেক্ট হয় না যদি না আপনি দুটি ব্রাঞ্চ মার্জ করেন।
যখন আপনি একটি ব্রাঞ্চে নেভিগেট করেন, আপনি রিপোজিটরিকে এর ইতিহাসের একটি নির্দিষ্ট সময়ে ভিউ করতে পারেন এবং আপনার প্রয়োজনীয় পরিবর্তনগুলো করতে পারেন। আপনি যখন প্রস্তুত, পরিবর্তনগুলো কমিট করুন যাতে Git আপনার প্রজেক্টের ইভোলিউশন ট্র্যাক রাখে।
আপনি দুটি ব্রাঞ্চের মধ্যে সুইচ করতে পারবেন না যদি দুই ব্রাঞ্চই একটি আনকমিটেড ফাইল চেঞ্জ ধারণ করে। Git জানতে চায় একটি ফাইল সংরক্ষণ করা উচিত কিনা অথবা একটি কমিটের অংশ। এটি আপনাকে অকস্মাত কোড ওভাররাইট হতে থেকে রক্ষা করে যেটি আপনি পরে রেফার করতে চাইতে পারেন।
একটি উদাহরণ পরিস্থিতি
আমরা একটি রিপোজিটরি ক্লোন করব যেটিতে একটি ফাইল আছে README.md নামে:
git clone https://github.com/career-karma-tutorials/ck-git
README.md ফাইলের কন্টেন্ট নিচের মতো:
# ck-git
আমাদের রিপোজিটরিতে দুটি ব্রাঞ্চ আছে: development এবং master। আমাদের লোকাল ওয়ার্কিং ডিরেক্টরিতে, আমরা origin master ব্রাঞ্চের README.md ফাইল পরিবর্তন করব:
৮১% পার্টিসিপেন্ট заяви করেছেন যে বুটক্যাম্পে অংশগ্রহণের পর তাদের টেক জব প্রস্পেক্টস নিয়ে তারা আরও আত্মবিশ্বাসী মনে করছেন। আজই একটি বুটক্যাম্পে ম্যাচ করুন।
গড় বুটক্যাম্প গ্র্যাজুট ক্যারিয়ার ট্রানজিশনে ছয় মাসের কম সময় ব্যয় করেছেন, বুটক্যাম্প শুরু থেকে প্রথম জব পাওয়ার পর্যায়ে।
# Career Karma Git
আমাদের master ব্রাঞ্চ এখন আমাদের রিমোট রিপোজিটরির থেকে আলাদা। আমরা আমাদের development ব্রাঞ্চে সুইচ করব এবং এর README-এর কন্টেন্ট পরিবর্তন করব যাতে বলে:
# Career Karma [Development]
আমরা এই ফাইলটি development ব্রাঞ্চে এই কমান্ডগুলো এক্সিকিউট করে পরিবর্তন করতে পারি:
git checkout development nano README.md
পরবর্তী, master ব্রাঞ্চে ফিরে যাব, ব্রাঞ্চে করা পরিবর্তনগুলো কমিট করব, এবং সেগুলো আমাদের রিমোট রিপোজিটরিতে পুশ করব:
git checkout master git add README.md git commit -m "docs: Update README" git push
git checkout কমান্ড আমাদের master ব্রাঞ্চে সুইচ করতে দেয়। সংক্ষেপে, আমাদের রিমোট রিপোজিটরি এখন ধারণ করে:
- ডেভেলপমেন্ট ব্রাঞ্চে একটি মডিফাইড README.md
- এক কমিট অহেড একটি master ব্রাঞ্চ
এখন, আমরা আবার master ব্রাঞ্চে README.md মডিফাই করব:
# Tutorials
এটি মানে দুই ব্রাঞ্চই রিমোট master ব্রাঞ্চের সাথে ডিফারেন্স ধারণ করে। এখন এই পরিবর্তনগুলো রাখে আমাদের development ব্রাঞ্চে সুইচ করার চেষ্টা করি:
git checkout development
এই কমান্ড একটি এরর মেসেজ রিটার্ন করে:
error: Your local changes to the following files would be overwritten by checkout: README.md Please commit your changes or stash them before you switch branches. Aborting
সমাধান
কারণ আমাদের development এবং master ব্রাঞ্চ দুটোই আনকমিটেড চেঞ্জ ধারণ করে, Git চেকআউট দিয়ে প্রসিড করতে পারে না। যদি Git প্রসিড করত, আনকমিটেড পরিবর্তনগুলো যেগুলো আমরা master ব্রাঞ্চে করেছি সেগুলো সংরক্ষিত হত না।
আমরা এই এরর দুটি উপায়ে ফিক্স করতে পারি। প্রথম, আমরা master ব্রাঞ্চে আমাদের পরিবর্তনগুলো কমিট করি:
git add README.md git commit -m "docs: Add tutorials message to README.md file" git push
এই কমান্ডগুলোতে, আমরা README.md ফাইলটি স্টেজিং এরিয়াতে যোগ করি, স্টেজিং এরিয়ার সকল ফাইল একটি কমিটে যোগ করি, এবং আমাদের পরিবর্তনটি রিমোট রিপোজিটরিতে পুশ করি।
Git এখন আমাদের README.md ফাইল কীভাবে দেখে পরিবর্তনসহ তার একটি রেকর্ড রাখে।
বিকল্পভাবে, আমরা আমাদের পরিবর্তনগুলো স্ট্যাশ করতে পারি পরে জন্য। এটি একটি ভালো সমাধান যদি আপনি আপনার পরিবর্তনগুলো পরে অ্যাক্সেসযোগ্য রাখতে চান যখন আপনি এখনো কমিটে যোগ করার জন্য প্রস্তুত নন। আপনার পরিবর্তনগুলো স্ট্যাশ করতে, আপনি git stash কমান্ড রান করতে পারেন:
git stash save README.md
এটি আমাদের README.md ফাইলটি একটি স্ট্যাশে সংরক্ষণ করবে। যেকোনো সময় আমরা এই ফাইলটি রিভিজিট করার জন্য প্রস্তুত হলে, আমরা স্ট্যাশ অ্যাক্সেস করতে পারি stash pop কমান্ড ব্যবহার করে:
git stash pop
এই কমান্ড আমাদের রিপোজিটরিতে README.md ফাইলটি রিস্টোর করবে। "Stashing" আরেকটি উপায় "saving for later" বলার। স্ট্যাশগুলো আপনার পরিবর্তনগুলোর কোনো কমিট তৈরি করে না।
উপরের সমাধানগুলো থেকে যেকোনো একটি রান করার পর, আমরা সফলভাবে development ব্রাঞ্চে নেভিগেট করতে পারি:
git checkout development
এই কমান্ড আমাদের ব্রাঞ্চ "development"-এ সুইচ করে এবং আমাদের টার্মিনলে এই পরিবর্তনটি ইনফর্ম করে:
Switched to branch 'development'
আমরা সমস্যাটি সমাধান করেছি।
উপসংহার
Git "Your local changes to the following files would be overwritten by checkout" এরর ঘটে যখন আপনি দুটি ব্রাঞ্চে পরিবর্তন আনেন কমিট বা স্ট্যাশ ছাড়া এবং ব্রাঞ্চগুলোতে নেভিগেট করার চেষ্টা করেন।
আপনি এই ইস্যু ফিক্স করতে পারেন হয় আপনার পরিবর্তনগুলো স্ট্যাশ করে পরে জন্য বা সেগুলো একটি কমিটে যোগ করে।
এখন আপনার কাছে वो নলেজ রয়েছে যা আপনাকে এই এরর প্রো-এর মতো ফিক্স করতে দেবে!