যখন আপনি একটি প্রজেক্টে একা বা একটি টিমের অংশ হিসেবে কাজ করছেন, এমন প্রসঙ্গ আসতে পারে যখন আপনি একটি কমিট анডু করতে চান। git reset কমান্ড এমন একটি টুল যা আসল জীবনরক্ষক।
Git-এর ট্র্যাকিং মেকানিজম
git reset-এ যাওয়ার আগে, আমাদের Git-এর অন্তর্নিহিত স্ট্রাকচার বুঝতে হবে। Git ফাইলগুলো ম্যানেজ এবং ট্র্যাক করে, ট্রি-লাইক স্ট্রাকচার দিয়ে নোডস এবং পয়েন্টারসহ।
আপনার লোকাল git রিপোজিটরিতে মূলত তিনটি এই "ট্রি" রয়েছে:
- দ্যা ওয়ার্কিং ডিরেক্টরি: অথবা ওয়ার্কিং ট্রি, এবং এটি আপনার লোকাল ডিরেক্টরি রেফার করে এবং
git statusআপনাকে আপনার ওয়ার্কিং ডিরেক্টরির স্টেট দেবে। - HEAD: আপনার কারেন্ট ব্রাঞ্চের লাস্ট কমিট স্ন্যাপশট। আপনি যদি ব্রাঞ্চ সুইচ করেন
git checkoutদিয়ে, তবে HEAD পরিবর্তন করবে সেই ব্রাঞ্চের লাস্ট কমিটে। - ইন্ডেক্স: অথবা স্টেজিং এরিয়া। তাই যখন আপনি
git addফাইলগুলো কমিট করার জন্য যোগ করেন, সেগুলো এই ইন্ডেক্সে যোগ হয়।
Git Workflow
নিচের উদাহরণ একটি ফাইলে পরিবর্তন আনতে এবং তারপর ইন্ডেক্সে (স্টেজিং) যোগ করতে git add ব্যবহার করে তারপর git status চেক করতে কমিট করা পরিবর্তনগুলো দেখতে।
এখন যখন আমরা git commit করি, এটি একটি অধিক পারমানেন্ট স্ন্যাপশট হিসেবে সংরক্ষণ হয় এবং master এবং HEAD আপডেট হয় সেই পয়েন্টারে। তাই যদি আমরা git commit এর পর git status করি, আমরা দেখব সকল তিনটি ট্রি একই স্টেটে (কমিট করার কিছু থাকবে না)।
তাহলে git reset-র উদ্দেশ্য কী?
আপনি কীভাবে এই সব প্রিম্বল শুধু git reset-এ পৌঁছাতে? ভালো git reset এই ট্রিগুলো বিভিন্নভাবে ম্যানিপুলেট করে। তাই git reset 온갖 অপশন এক্সেপ্ট করবে যেটা আপনি কী করতে চান তার ওপর নির্ভর করে।
Git Reset মোডস
ধরা যাক আমরা কিছু পরিবর্তন এবং ফাইল কমিট করেছি, তারপর বুঝলাম আমরা সেগুলো ভুল ব্রাঞ্চে কমিট করেছি বা আমাদের কমিট বাগি তাই আমরা রিওয়াইন্ড করতে চাই। এখানে git reset মোডস জানা উপকারী।
৮১% পার্টিসিপেন্ট заяви করেছেন যে বুটক্যাম্পে অংশগ্রহণের পর তাদের টেক জব প্রস্পেক্টস নিয়ে তারা আরও আত্মবিশ্বাসী মনে করছেন। আজই একটি বুটক্যাম্পে ম্যাচ করুন।
গড় বুটক্যাম্প গ্র্যাজুট ক্যারিয়ার ট্রানজিশনে ছয় মাসের কম সময় ব্যয় করেছেন, বুটক্যাম্প শুরু থেকে প্রথম জব পাওয়ার পর্যায়ে।
সব git reset with mode HEAD পয়েন্টার আপডেট করবে। এর সিনট্যাক্স নিচের মতো:
git reset <mode> <commit-optional>
প্রধান মোডগুলো হলো:
--soft: HEAD পয়েন্টার রিসেট করে এবং ইন্ডেক্স এবং ওয়ার্কিং ডিরেক্টরি অপরিবর্তিত রাখে। তাই আপনার HEAD রিসেট হবে এবং অন্যান্য ট্রি লেটেস্ট চেঞ্জ দেখাবে।--mixed: ডিফল্ট অপশন। HEAD এবং ইন্ডেক্স রিসেট করে। এটি বেসিক্যালি আপনার সকল চেঞ্জ আন-স্টেজ করে এবং আপনাকেgit addকরার আগের অবস্থায় ফেরত দেয়। নোট: আপনি যদি git reset কোনো অপশন ছাড়া করুন, এটি ইন্টারপ্রেট হবেgit reset --mixed- হিসেবে।--hard: এটিতে সাবধান থাকুন। HEAD, ইন্ডেক্স রিসেট করার পাশাপাশি, এটি আপনার ওয়ার্কিং ডিরেক্টরিও রিসেট করে। তাই আপনি লিখা কোড হারাতে পারেন! কারণ কারেন্ট HEAD পয়েন্টার (লাস্ট কমিট) এর পর যেকোনো পরিবর্তন ডিসকার্ড হয়ে যাবে।
--merge এবং --keep gibi অন্যান্য মোডস অফিসিয়াল ডকুমেন্টেশনে পড়া যাবে।
উপকারী git reset ট্রিকস
একটি কমিট রিওয়াইন্ড করা
মনে রাখবেন যদি আমরা মোড অমিট করি (git reset কোনো অপশন ছাড়া) এটি ইন্টারপ্রেট হবে –mixed হিসেবে।
এখন যদি আমরা শুধু টাইপ করি git reset HEAD কিছুই হবে না, কিন্তু যদি আমরা git reset HEAD~1 করি তবে আমাদের HEAD এখন এর পূর্বের কমিটে পয়েন্ট করবে।
নিচের উদাহরণ পূর্বের উদাহরণ থেকে কন্টিনিউ। ধরা যাক আমরা আমাদের স্যাম্পল ফাইলে নতুন টেক্সট যোগ করি। তারপর git add এবং commit করি। তারপর git reset HEAD~1 করলে, আমাদের সকল চেঞ্জ আন-স্টেজড হয়ে যাবে এবং পূর্বের কমিটে থাকবে।
এটি একটি উপকারী এবং দ্রুত উপায় যখন আমরা একটি কমিট আনডু করতে চাই!
একটি নির্দিষ্ট ফাইল আন-স্টেজ করা
ধরা যাক আপনি একটি ফাইল ইন্ডেক্সে যোগ করলেন git add দিয়ে। আমরা সেই ফাইলটি শুধু এইভাবে রিমুভ করতে পারি:
git reset HEAD <file-name>
পরিস্থিতি: আমার সকল কোড গুলো গুলিয়ে দিয়েছি! কি আমি তখন ফিরে যেতে পারি যখন সেটি কাজ করত?
আপনি যদি সকল লোকাল চেঞ্জ ফেলে দিতে চান এবং আপনার পূর্বের কমিটে ফিরে যেতে চান আপনার লাস্ট রিসোর্ট হলো git reset --hard।
প্রায়শই আপনি যদি আপনার কোড ব্রেক করেন এই আপনার একমাত্র অপশন হতে পারে। আপনি যদি কমিট হ্যাশ জানেন, আপনি do git reset --hard <commit> করতে পারেন। কিন্তু নোট করুন এইটিও সেই স্পেসিফিক কমিটের পর যেকোনো কমিটকে প্রভাবিত করবে (যদি কোনো থাকে)!
পরিস্থিতি: এই কমিটটি একটি নতুন ব্রাঞ্চে থাকা উচিত ছিল!
এটি ঘন ঘন ঘটে, বিশেষত যখন আপনি প্রোডাকশনে কাজ শুরু করেন। আপনার সাথে যদি এটি ঘটে, প্যানিক করবেন না!
আমাদের যা করতে হবে তা বেসিক্যালি নতুন ব্রাঞ্চ তৈরি করা যেটি সেটি ব্রাঞ্চের স্টেট ধারণ করে যেটি আমাদের রিওয়াইন্ড করতে হবে। তারপর আমরা প্রভাবিত ব্রাঞ্চটি রিসেট করব, এবং তারপর নতুন ব্রাঞ্চে চেকআউট করব এবং কমিট করব সেখানে:
git branch new-branch
git reset HEAD~1 --hard
git checkout new-branch
Lifesaver ঠিকই!
একটি শেষ কথা
git reset --hard এবং একটি স্পেসিফিক কমিটে রিওয়াইন্ড করার समय সতর্ক থাকুন, বিশেষত প্রোডাকশন কোডে এবং যখন আপনি অন্যান্য ডেভেলপারদের সাথে কাজ করছেন। প্রায়শই git revert এই পরিবর্তনগুলো করার সেফ উপায়। কিন্তু সেটি আরেকটু কথা। তবুও! 👋🏼