Git আপনাকে আপনার লোকাল মেশিনে ফাইল পুল করতে দেয় না যদি কোনো আনসেভড বা আনট্র্যাকড পরিবর্তন মার্জ অপারেশনে ওভাররাইট হয়। আপনি ফোর্স পুল মেথড ব্যবহার করে Git-কে বাধ্য করতে পারেন আপনার লোকাল কম্পিউটারে আপনি যে পরিবর্তনগুলো পেতে চান সেগুলো পুল করার জন্য।
এই গাইডে, আমরা একটি উদাহরণের রেফারেন্স দিয়ে আলোচনা করব কীভাবে একটি Git রিপোজিটরির কন্টেন্ট ফোর্স পুল করতে হয়। আমরা git pull এবং fetch কমান্ড, এবং রিসেট অপশন ব্যবহার করে কীভাবে ফোর্স পুল করতে হয় সেটি কভার করব।
পুলিং কী?
একটি Git পুল অপারেশন একটি রিমোট রিপোজিটরির থেকে সকল মেটাডেটা এবং ফাইল ডাউনলোড করে এবং রিট্রিভ করা ডেটা অনুযায়ী লোকাল রিপোজিটরি আপডেট করে।
পুলিং হলো আপনার লোকাল ফাইলগুলোকে একটি রিপোজিটরির রিমোট ভার্সনের সাথে সিঙ্ক করার মেথড। আপনাকে একটি রিপোজিটরি পুল করতে হবে যদি আপনি কেউ অন্য কর্তৃক একটি রিমোট রিপোজিটরিতে করা পরিবর্তনগুলো ডাউনলোড করতে চান। পুলিং অটোমেটিক্যালি হয় না।
আপনার আনট্র্যাকড ফাইল থাকলে পুলিং হতে পারে না যা ওভাররাইট হয়ে যাবে। এর মানে আপনার লোকাল ব্রাঞ্চে একটি ফাইল রয়েছে যা Git রিপোজিটরিতে অ্যাড করা হয়নি এবং পুল হলে সেটি রিপ্লেস হয়ে যাবে।
আপনি একটি রিপোজিটরি পুল করতে পারবেন না যদি আপনার লোকাল মেশিনে আনসেভড পরিবর্তন থাকে যা পুল দ্বারা ওভাররাইট হয়ে যাবে।
Git: Force Pull
আমরা ck-git নামক একটি রিপোজিটরিতে কাজ করছি, যেটিতে একটি ওয়েব প্রজেক্টের কোড রয়েছে। একজন কলাবরেটর সメートル README.md ফাইল আপডেট করেছেন। আমরা আমাদের মেশিনে সেই ফাইল আপডেট করেছি এবং আমাদের পরিবর্তনগুলো রিপোজিটরিতে পুশ করিনি।
চলুন দেখি কী হয় যখন আমরা আমাদের পরিবর্তন পুল করতে চাই:
git pull
এই কমান্ডটি একটি এরর রিটার্ন করে:
error: Your local changes to the following files would be overwritten by merge: README.md Please, commit your changes or stash them before you can merge.
আমাদের তিনটি অপশন রয়েছে। আমরা আমাদের পরিবর্তন কমিট করতে পারি, সেগুলো স্ট্যাশ করতে পারি, অথবা Git-কে বাধ্য করতে পারি পরিবর্তনগুলো পুল করার জন্য। এগুলো আমাদের ফাইল ওভাররাইট করবে।
আমরা Git-কে ফোর্স করে পরিবর্তনগুলো পুল করতে পারি যেকোনো পরিবর্তন ফেচ করে এবং তারপর আমাদের রিপোজিটরি রিসেট করে সেই পরিবর্তনগুলো দেখানোর জন্য। চলুন প্রথমে git fetch কমান্ড ব্যবহার করে পরিবর্তনগুলো ফেচ করি:
git fetch --all
এই কমান্ডটি আমাদের রিমোট রিপোজিটরিতে করা পরিবর্তনগুলোর সকল মেটাডেটা রিট্রিভ করে। পরবর্তি, আমরা আমাদের কারেন্ট ব্রাঞ্চ ব্যাকআপ করব। এটি আমরা করি নিশ্চিত করার জন্য যে আমাদের কোড ওভাররাইট হলে আমাদের কাজ হারিয়ে যাবে না।
আমরা git branch কমান্ড ব্যবহার করে আমাদের ব্রাঞ্চ ব্যাকআপ করতে পারি:
git branch backup
এই কমান্ডটি "backup" নামে একটি নতুন ব্রাঞ্চ তৈরি করে। এখন যেহেতু আমাদের ব্যাকআপ ব্রাঞ্চ inplace আছে, আমরা আমাদের রিপোজিটরি রিসেট করতে পারি আমাদের রিমোট রিপোজিটরির কন্টেন্ট দেখানোর জন্য।
আমরা git reset কমান্ড ব্যবহার করে আমাদের রিপোজিটরি আপডেট করব:
git reset --hard origin/master
--hard অপশন রিমোট রিপোজিটরির থেকে সকল ফাইল ডাউনলোড করে এবং আপনার লোকাল ওয়ার্কিং কপিতে যোগ করে। এটি আপনার করা যেকোনো পরিবর্তন ওভাররাইট করবে।
origin/master স্টেটমেন্টটি সেই ব্রাঞ্চকে রেফার করে যেটি আমরা রিট্রিভ করছি। আমরা আমাদের "origin" রিমোট রিপোজিটরির থেকে "master" ব্রাঞ্চের কন্টেন্ট ডাউনলোড করছি।
আপনি যদি একটি ভিন্ন ব্রাঞ্চ বা রিমোট নামের রিপোজিটরির সাথে কাজ করেন, তবে আপনি এই ফর্মুলা ব্যবহার করে গাইড করতে পারেন কীভাবে রিসেট কমান্ড ব্যবহার করবেন:
git reset --hard/
Git reset কমান্ড আমাদের রিপোজিটরিকে আমরা যে কমিট ফেচ করেছি সেটির সর্বশেষ কমিটে রিসেট করে।
অনকমিটেড পরিবর্তন সংরক্ষণ করা
আপনি git stash কমান্ড ব্যবহার করে আপনার করা অনকমিটেড পরিবর্তনগুলো সংরক্ষণ করতে পারেন। এই কমান্ড আপনাকে আপনার কোড "stash" করে পরে রাখতে দেয়। চলুন আমাদের কোডের একটি স্ট্যাশ তৈরি করি:
git stash
আমরা আমাদের রিপোজিটরিতে যে সব পরিবর্তন করেছি সেগুলো স্ট্যাশে সংরক্ষিত হবে। আপনি যখন সেই পরিবর্তনগুলো আবার কাজ করার জন্য রেডি হবেন, আপনি আপনার স্ট্যাশ "pop" করতে পারেন:
git stash pop
Git stash দিয়ে সংরক্ষণ সম্পর্কে আরও জানতে আপনি আমাদের git stash টিউটোরিয়াল পড়তে পারেন।
উপসংহার
আপনি একটি Git রিপোজিটরি বাধ্য করতে পারেন রিমোট রিপোজিটরির কন্টেন্ট পুল করার জন্য। এর জন্য, আপনাকে রিপোজিটরির কন্টেন্ট ফেচ করতে হবে। একবার আপনি রিপোজিটরি ফেচ করলে, আপনি আপনার পরিবর্তনগুলো আপনার রিমোট রিপোজিটরির যে ব্রাঞ্চটি আপনি আপনার কোডবেসে ব্যবহার করতে চান সেটিতে রিসেট করতে পারেন।
এখন আপনার কাছে সেই নলেজ রয়েছে যাতে আপনি একটি প্রো 것처럼 Git ফোর্স পুল অপারেশন করতে পারেন!