গিট (Git) সিনারিও এবং তার সমাধান
Table of Contents
গিট (Git) হলো ডেভেলপারদের জন্য সবচেয়ে প্রয়োজনীয় টুল—এটি মূলত আপনার কোডের “টাইম মেশিন”। প্রজেক্টের কোডে কখন কী পরিবর্তন হয়েছে তা মনে রাখা এবং টিমের সাথে কাজ করার জন্য প্রফেশনালরা এটি ব্যবহার করেন।
নিচে বিগিনার থেকে অ্যাডভান্সড লেভেল পর্যন্ত Git-এর প্রয়োজনীয় কমান্ড, প্রফেশনাল সিনারিও এবং ইউজ-কেস (Use Case) সহজ বাংলায় আলোচনা করা হলো:
১. বিগিনার লেভেল: বেসিক ওয়ার্কফ্লো (একা কাজ করার ক্ষেত্রে)
আপনি যখন একা কোনো প্রজেক্টে কাজ শুরু করেন, তখন এই কমান্ডগুলো সবচেয়ে বেশি লাগে।
📌 কমান্ডসমূহ:
git init: নতুন প্রজেক্ট ফোল্ডারকে গিট রিপোজিটরি হিসেবে তৈরি করতে।git clone <url>: গিটহাব (GitHub) বা অন্য কোনো রিমোট সার্ভার থেকে প্রজেক্ট ডাউনলোড করতে।git status: কোন ফাইলগুলোতে পরিবর্তন হয়েছে, তা দেখতে।git add <file>বাgit add .: ফাইলগুলোকে কমিট করার জন্য স্টেজিং এরিয়ায় (Staging Area) নিতে।git commit -m "Message": পরিবর্তনগুলো একটি মেসেজসহ সেভ বা রেকর্ড করতে।git push: আপনার লোকাল পিসির কমিট করা কোড গিটহাবে আপলোড করতে।git pull: গিটহাব থেকে নতুন আপডেট আপনার লোকাল পিসিতে নামিয়ে আনতে।
💡 প্রফেশনাল সিনারিও (Use Case):
সিনারিও: আপনি একটি নতুন পোর্টফোলিও ওয়েবসাইট বানাচ্ছেন।
অ্যাকশন: ফোল্ডারে ঢুকে git init করে গিট চালু করলেন। কিছু কোড লেখার পর git add . দিয়ে ফাইলগুলো সিলেক্ট করলেন এবং git commit -m "Initial commit with index.html" দিয়ে সেভ করলেন। সবশেষে git push দিয়ে কোডগুলো গিটহাবে ব্যাকআপ রাখলেন।
২. ইন্টারমিডিয়েট লেভেল: ব্রাঞ্চিং এবং কোলাবোরেশন (টিমের সাথে কাজ)
টিমের সাথে কাজ করার সময় মূল কোড (Main/Master branch) যাতে নষ্ট না হয়, সেজন্য ব্রাঞ্চ (Branch) তৈরি করে কাজ করতে হয়।
📌 কমান্ডসমূহ:
git branch: প্রজেক্টে কী কী ব্রাঞ্চ আছে তা দেখতে।git branch <branch-name>: নতুন ব্রাঞ্চ তৈরি করতে।git switch <branch-name>বাgit checkout: এক ব্রাঞ্চ থেকে অন্য ব্রাঞ্চে যেতে।git checkout -b <branch-name>: একসাথে নতুন ব্রাঞ্চ তৈরি করা এবং সেই ব্রাঞ্চে চলে যাওয়া।git merge <branch-name>: অন্য একটি ব্রাঞ্চের কাজ আপনার বর্তমান ব্রাঞ্চের সাথে যুক্ত (Merge) করতে।git log: আগের সব কমিটের হিস্ট্রি দেখতে।
💡 প্রফেশনাল সিনারিও (Use Case):
সিনারিও: আপনি টিমের মূল প্রজেক্টে “লগিন সিস্টেম” তৈরি করবেন।
অ্যাকশন: আপনি সরাসরি main ব্রাঞ্চে কোড না লিখে git checkout -b feature-login দিয়ে একটি নতুন ব্রাঞ্চ খুললেন। সেখানে লগিনের কোড লিখে কমিট করলেন। কাজ শেষ হলে main ব্রাঞ্চে ফিরে গিয়ে git merge feature-login দিয়ে লগিন সিস্টেমটি মূল প্রজেক্টের সাথে যুক্ত করে দিলেন।
৩. অ্যাডভান্সড লেভেল: ভুল সংশোধন এবং হিস্ট্রি ম্যানিপুলেশন
কাজ করতে গিয়ে ভুল হলে বা ইমার্জেন্সি কোনো টাস্ক চলে এলে এই কমান্ডগুলো জীবন বাঁচায়।
📌 কমান্ডসমূহ:
git stash: আপনি একটি কাজ অর্ধেক করেছেন (কমিট করার মতো অবস্থায় নেই), এমন সময় অন্য একটি জরুরি কাজ এলো। তখন বর্তমান কাজগুলো টেম্পোরারি লুকিয়ে রাখতেgit stashব্যবহার হয়। পরে ফিরে এসেgit stash popদিলে আগের অসমাপ্ত কাজ আবার ফেরত পাওয়া যায়।git revert <commit-hash>: আগের কোনো কমিট মুছে না ফেলে, সেই কমিটের পরিবর্তনগুলোকে বাতিল করে নতুন একটি কমিট তৈরি করে (এটি সবচেয়ে নিরাপদ)।git reset --hard <commit-hash>: নির্দিষ্ট কমিটের পরের সব কমিট এবং পরিবর্তন স্থায়ীভাবে মুছে ফেলতে (বিপজ্জনক, সাবধানে ব্যবহার করতে হয়)।git rebase: একটি ব্রাঞ্চের কমিটগুলোকে অন্য ব্রাঞ্চের একদম উপরে বসিয়ে দেওয়া, যাতে হিস্ট্রি একদম পরিষ্কার (Linear) থাকে।
💡 প্রফেশনাল সিনারিও (Use Case):
সিনারিও: আপনি একটি ফিচারের কাজ করছেন, হঠাৎ বস বলল প্রোডাকশনে একটি বাগ (Bug) ফিক্স করতে হবে এখনি।
অ্যাকশন: আপনি বর্তমান অসমাপ্ত কাজ git stash করে রাখলেন। তারপর main ব্রাঞ্চে গিয়ে বাগ ফিক্স করে পুশ করলেন। এরপর আবার নিজের ব্রাঞ্চে ফিরে এসে git stash pop দিয়ে আগের কাজ সেখান থেকেই শুরু করলেন।
৪. প্রো লেভেল: ডিবাগিং এবং মেইনটেন্যান্স (সিনিয়র ডেভেলপার)
বড় প্রজেক্ট মেইনটেইন করা এবং কে কোথায় বাগ তৈরি করেছে তা খুঁজে বের করার জন্য।
📌 কমান্ডসমূহ:
git cherry-pick <commit-hash>: অন্য কোনো ব্রাঞ্চ থেকে শুধুমাত্র নির্দিষ্ট একটি কমিট (সবগুলো নয়) কপি করে আপনার বর্তমান ব্রাঞ্চে নিয়ে আসতে।git blame <filename>: ফাইলের প্রতিটি লাইন কে, কবে এবং কোন কমিটে লিখেছে তা বের করতে।git bisect: একটি বাগ কোন নির্দিষ্ট কমিটের কারণে তৈরি হয়েছে, তা বাইনারি সার্চ (Binary Search) এর মাধ্যমে দ্রুত খুঁজে বের করতে।
💡 প্রফেশনাল সিনারিও (Use Case):
সিনারিও: ওয়েবসাইটে একটি বড় সমস্যা দেখা দিয়েছে, কিন্তু কেউ জানে না কোডের কোন অংশে বা কখন এই ভুলটা হয়েছে।
অ্যাকশন: আপনি git blame index.js চালিয়ে দেখলেন এই ভুলের কোডটি কে লিখেছে। তারপর দেখলেন অন্য একটি ব্রাঞ্চে এই সমস্যা সমাধানের জন্য একটি হট-ফিক্স (Hotfix) কমিট করা আছে। আপনি git cherry-pick করে শুধু সেই সমাধানের কমিটটি আপনার main ব্রাঞ্চে নিয়ে আসলেন।
১০০টি গিট (Git) সিনারিও এবং তার সমাধান নিচে দেওয়া হলো। সহজে খুঁজে পাওয়ার জন্য এগুলোকে বিভিন্ন ক্যাটাগরিতে ভাগ করা হয়েছে। বিগিনার থেকে শুরু করে অ্যাডভান্সড প্রো লেভেল—সবকিছুই এখানে আছে।
### 🛠️ ক্যাটাগরি ১: প্রজেক্ট সেটআপ ও কনফিগারেশন (১-১০)
১. **সিনারিও:** নতুন প্রজেক্টে গিট চালু করতে চান।
**সমাধান:** `git init`
২. **সিনারিও:** গিটহাব থেকে কোনো প্রজেক্ট পিসিতে নামাতে চান।
**সমাধান:** `git clone
৩. **সিনারিও:** গিট-এ আপনার নাম সেট করতে চান (যাতে কমিটে নাম দেখায়)।
**সমাধান:** `git config –global user.name “আপনার নাম”`
৪. **সিনারিও:** গিট-এ আপনার ইমেইল সেট করতে চান।
**সমাধান:** `git config –global user.email “আপনার ইমেইল”`
৫. **সিনারিও:** প্রজেক্টের বর্তমান অবস্থা (কোন ফাইল মডিফাই হয়েছে) দেখতে চান।
**সমাধান:** `git status`
৬. **সিনারিও:** নির্দিষ্ট কোনো ফোল্ডারে গিট ক্লোন করতে চান।
**সমাধান:** `git clone
৭. **সিনারিও:** রিমোট রিপোজিটরির (GitHub) URL চেক করতে চান।
**সমাধান:** `git remote -v`
৮. **সিনারিও:** লোকাল প্রজেক্টের সাথে গিটহাবের নতুন রিপোজিটরি লিংক করতে চান।
**সমাধান:** `git remote add origin
৯. **সিনারিও:** রিমোট URL পরিবর্তন করতে চান (ভুল লিংকে কানেক্ট করলে)।
**সমাধান:** `git remote set-url origin
১০. **সিনারিও:** আপনার গিট কনফিগারেশনের সব লিস্ট দেখতে চান।
**সমাধান:** `git config –list`
### 📝 ক্যাটাগরি ২: স্টেজিং এবং কমিট করা (১১-২০)
১১. **সিনারিও:** একটি নির্দিষ্ট ফাইল কমিট করার জন্য রেডি (Stage) করতে চান।
**সমাধান:** `git add index.html`
১২. **সিনারিও:** মডিফাই হওয়া সব ফাইল একসাথে রেডি (Stage) করতে চান।
**সমাধান:** `git add .`
১৩. **সিনারিও:** কোডের পরিবর্তনগুলো একটি মেসেজ দিয়ে সেভ করতে চান।
**সমাধান:** `git commit -m “Added login feature”`
১৪. **সিনারিও:** add এবং commit একসাথে এক কমান্ডে করতে চান।
**সমাধান:** `git commit -am “Updated text”`
১৫. **সিনারিও:** সর্বশেষ কমিটের মেসেজ ভুল হয়েছে, ঠিক করতে চান।
**সমাধান:** `git commit –amend -m “Corrected message”`
১৬. **সিনারিও:** কমিট করার পর মনে পড়ল একটি ফাইল add করতে ভুলে গেছেন, কিন্তু নতুন কমিট বানাতে চান না।
**সমাধান:** `git add forgotten-file.js` তারপর `git commit –amend –no-edit`
১৭. **সিনারিও:** কোনো ফাইল স্টেজ (add) করে ফেলেছেন, কিন্তু এখন আনস্টেজ করতে চান।
**সমাধান:** `git restore –staged
১৮. **সিনারিও:** কোডে অনেক পরিবর্তন করেছেন, কিন্তু সব বাতিল করে আগের অবস্থায় (কমিট করা অবস্থায়) ফিরে যেতে চান।
**সমাধান:** `git restore
১৯. **সিনারিও:** কমিট করার আগে দেখতে চান কোডে ঠিক কী কী লাইন পরিবর্তন হয়েছে।
**সমাধান:** `git diff`
২০. **সিনারিও:** স্টেজ (add) করা ফাইলগুলোর পরিবর্তন দেখতে চান।
**সমাধান:** `git diff –staged`
### 🌿 ক্যাটাগরি ৩: ব্রাঞ্চিং (Branching) (২১-৩০)
২১. **সিনারিও:** প্রজেক্টে কী কী ব্রাঞ্চ আছে দেখতে চান।
**সমাধান:** `git branch`
২২. **সিনারিও:** নতুন একটি ব্রাঞ্চ তৈরি করতে চান।
**সমাধান:** `git branch feature-x`
২৩. **সিনারিও:** অন্য একটি ব্রাঞ্চে সুইচ করে যেতে চান।
**সমাধান:** `git switch feature-x` (অথবা `git checkout feature-x`)
২৪. **সিনারিও:** এক কমান্ডে নতুন ব্রাঞ্চ তৈরি করে সেটিতে চলে যেতে চান।
**সমাধান:** `git switch -c feature-y`
২৫. **সিনারিও:** বর্তমান ব্রাঞ্চের নাম পরিবর্তন করতে চান।
**সমাধান:** `git branch -m new-branch-name`
২৬. **সিনারিও:** একটি ব্রাঞ্চ মুছে ফেলতে চান (কাজ শেষ হওয়ার পর)।
**সমাধান:** `git branch -d feature-x`
২৭. **সিনারিও:** ব্রাঞ্চটি মার্জ করা হয়নি, তবুও জোরপূর্বক মুছে ফেলতে চান।
**সমাধান:** `git branch -D feature-x`
২৮. **সিনারিও:** গিটহাবের (রিমোট) সব ব্রাঞ্চসহ লোকাল ব্রাঞ্চ দেখতে চান।
**সমাধান:** `git branch -a`
২৯. **সিনারিও:** রিমোটের একটি নির্দিষ্ট ব্রাঞ্চ লোকাল পিসিতে নামাতে চান।
**সমাধান:** git checkout -b <branch> origin/<branch>
৩০. **সিনারিও:** কোন ব্রাঞ্চগুলো এখনো main-এর সাথে মার্জ করা হয়নি তা দেখতে চান।
**সমাধান:** `git branch –no-merged`
### 🔀 ক্যাটাগরি ৪: মার্জিং এবং সিঙ্কিং (৩১-৪০)
৩১. **সিনারিও:** `feature-x` ব্রাঞ্চের কাজ শেষ, সেটিকে বর্তমান ব্রাঞ্চের (যেমন main) সাথে মেলাতে (Merge) চান।
**সমাধান:** `git merge feature-x`
৩২. **সিনারিও:** গিটহাব থেকে প্রজেক্টের লেটেস্ট কোড লোকাল পিসিতে নামাতে চান।
**সমাধান:** `git pull origin main`
৩৩. **সিনারিও:** আপনার লোকাল কোড গিটহাবে আপলোড করতে চান।
**সমাধান:** `git push origin main`
৩৪. **সিনারিও:** নতুন ব্রাঞ্চ গিটহাবে প্রথমবারের মতো আপলোড করতে চান।
**সমাধান:** `git push -u origin
৩৫. **সিনারিও:** মার্জ করার সময় কনফ্লিক্ট (Conflict) হলো, আপনি মার্জ বাতিল করতে চান।
**সমাধান:** `git merge –abort`
৩৬. **সিনারিও:** রিমোটে (গিটহাবে) কী কী নতুন পরিবর্তন এসেছে তা চেক করতে চান (কিন্তু কোড চেঞ্জ না করে)।
**সমাধান:** `git fetch`
৩৭. **সিনারিও:** রিমোটে কোনো ব্রাঞ্চ ডিলিট করা হয়েছে, আপনার লোকাল পিসির লিস্ট থেকে তা আপডেট করতে চান।
**সমাধান:** `git fetch -p` (prune)
৩৮. **সিনারিও:** গিটহাব থেকে ডিলিট করা ব্রাঞ্চ লোকাল থেকেও পুশ করে রিমুভ করতে চান।
**সমাধান:** `git push origin –delete
৩৯. **সিনারিও:** শুধু একটি নির্দিষ্ট ফাইল অন্য ব্রাঞ্চ থেকে বর্তমান ব্রাঞ্চে কপি করে আনতে চান।
**সমাধান:** `git checkout
৪০. **সিনারিও:** মার্জ করার সময় ফাস্ট-ফরোয়ার্ড (Fast-forward) না করে একটি মার্জ কমিট মেসেজ রাখতে চান।
**সমাধান:** `git merge –no-ff
### ⏪ ক্যাটাগরি ৫: ভুল সংশোধন ও আন্ডু (Undo) করা (৪১-৫০)
৪১. **সিনারিও:** সর্বশেষ কমিটটি মুছে ফেলতে চান, কিন্তু কোডের পরিবর্তনগুলো রেখে দিতে চান।
**সমাধান:** `git reset –soft HEAD~1`
৪২. **সিনারিও:** সর্বশেষ কমিট এবং কোডের পরিবর্তন—সবকিছু পুরোপুরি মুছে ফেলতে চান।
**সমাধান:** `git reset –hard HEAD~1`
৪৩. **সিনারিও:** আগের একটি নির্দিষ্ট কমিটের অবস্থায় পুরো প্রজেক্ট ফিরিয়ে নিতে চান (মাঝখানের সব কমিট বাদ দিয়ে)।
**সমাধান:** `git reset –hard
৪৪. **সিনারিও:** আগের একটি কমিটের পরিবর্তন বাতিল করতে চান, কিন্তু হিস্ট্রি না মুছে নতুন একটি ‘Undo’ কমিট তৈরি করে। (সবচেয়ে নিরাপদ)
**সমাধান:** `git revert
৪৫. **সিনারিও:** ভুলে মূল ব্রাঞ্চে (main) কাজ শুরু করেছেন, এখনো কমিট করেননি। কাজগুলো নতুন ব্রাঞ্চে সরাতে চান।
**সমাধান:** `git switch -c new-branch` (পরিবর্তনগুলো অটো নতুন ব্রাঞ্চে চলে যাবে)।
৪৬. **সিনারিও:** ভুলে main ব্রাঞ্চে কমিট করে ফেলেছেন। কমিটটি অন্য ব্রাঞ্চে নিতে চান।
**সমাধান:** `git branch new-branch`, তারপর `git reset –hard HEAD~1`, তারপর `git switch new-branch`
৪৭. **সিনারিও:** এমন একটি ফাইল আনট্র্যাক (Untrack) করতে চান যা গিট ইতোমধ্যে ট্র্যাক করছে (যেমন `.env`), কিন্তু পিসি থেকে মুছতে চান না।
**সমাধান:** `git rm –cached .env`
৪৮. **সিনারিও:** গিট ইগনোর (`.gitignore`) ফাইল আপডেট করেছেন, কিন্তু আগের ফাইলগুলো ক্যাশ ধরে রেখেছে। পুরো ক্যাশ ক্লিয়ার করতে চান।
**সমাধান:** `git rm -r –cached .` এবং তারপর কমিট করুন।
৪৯. **সিনারিও:** গিট রি-সেট (`reset –hard`) করে ভুল করে সব ডিলিট করে ফেলেছেন! হারানো কমিট রিকভার করতে চান।
**সমাধান:** `git reflog` দিয়ে হারানো কমিটের হ্যাশ বের করুন, তারপর git reset --hard <hash>
৫০. **সিনারিও:** আনট্র্যাকড (নতুন তৈরি করা কিন্তু add না করা) ফাইল বা ফোল্ডার ডিলিট করতে চান (ক্লিনআপ)।
**সমাধান:** `git clean -fd`
### 📦 ক্যাটাগরি ৬: স্ট্যাশিং (Stashing) - অসমাপ্ত কাজ লুকিয়ে রাখা (৫১-৬০)
৫১. **সিনারিও:** কাজ অর্ধেক হয়েছে, কিন্তু হঠাৎ অন্য ব্রাঞ্চে যেতে হবে। বর্তমান পরিবর্তনগুলো সেভ না করেই লুকিয়ে রাখতে চান।
**সমাধান:** `git stash`
৫২. **সিনারিও:** লুকানো (Stashed) কাজগুলো আবার বর্তমান ব্রাঞ্চে ফেরত আনতে চান।
**সমাধান:** `git stash pop`
৫৩. **সিনারিও:** লুকানো কাজ ফেরত আনতে চান, কিন্তু স্ট্যাশ লিস্ট থেকেও মুছতে চান না।
**সমাধান:** `git stash apply`
৫৪. **সিনারিও:** কয়টি অসমাপ্ত কাজ স্ট্যাশ করে রেখেছেন তার লিস্ট দেখতে চান।
**সমাধান:** `git stash list`
৫৫. **সিনারিও:** আনট্র্যাকড ফাইলগুলোসহ (নতুন ফাইল) স্ট্যাশ করতে চান।
**সমাধান:** `git stash -u`
৫৬. **সিনারিও:** নির্দিষ্ট একটি মেসেজ দিয়ে স্ট্যাশ করতে চান, যাতে পরে মনে থাকে কী কাজ লুকিয়েছিলেন।
**সমাধান:** `git stash save “Working on header”`
৫৭. **সিনারিও:** লিস্টের নির্দিষ্ট একটি স্ট্যাশ (যেমন ২ নাম্বারটা) ফেরত আনতে চান।
**সমাধান:** `git stash apply stash@{2}`
৫৮. **সিনারিও:** একটি নির্দিষ্ট স্ট্যাশ লিস্ট থেকে ডিলিট করতে চান।
**সমাধান:** `git stash drop stash@{1}`
৫৯. **সিনারিও:** স্ট্যাশ করে রাখা সব কাজ একেবারে মুছে ফেলতে চান।
**সমাধান:** `git stash clear`
৬০. **সিনারিও:** স্ট্যাশ করা কাজগুলো নিয়ে একটি সম্পূর্ণ নতুন ব্রাঞ্চ তৈরি করতে চান।
**সমাধান:** `git stash branch
### 🔍 ক্যাটাগরি ৭: হিস্ট্রি ও লগ (History & Logging) (৬১-৭০)
৬১. **সিনারিও:** আগের সব কমিটের লিস্ট দেখতে চান।
**সমাধান:** `git log`
৬২. **সিনারিও:** কমিটগুলো খুব সংক্ষেপে (এক লাইনে) দেখতে চান।
**সমাধান:** `git log –oneline`
৬৩. **সিনারিও:** শেষ ৩টি কমিট দেখতে চান।
**সমাধান:** `git log -3`
৬৪. **সিনারিও:** কমিটের গ্রাফ, ব্রাঞ্চিং এবং মার্জিংয়ের ভিজ্যুয়াল হিস্ট্রি দেখতে চান।
**সমাধান:** `git log –graph –oneline –all`
৬৫. **সিনারিও:** নির্দিষ্ট একজন ডেভেলপারের (যেমন John) সব কমিট দেখতে চান।
**সমাধান:** `git log –author=“John”`
৬৬. **সিনারিও:** একটি নির্দিষ্ট ফাইলে কবে কে কী কমিট করেছে দেখতে চান।
**সমাধান:** `git log
৬৭. **সিনারিও:** নির্দিষ্ট দুই তারিখের মাঝখানের কমিট দেখতে চান।
**সমাধান:** `git log –since=“2023-10-01” –until=“2023-10-31”`
৬৮. **সিনারিও:** কমিট মেসেজে নির্দিষ্ট কোনো শব্দ (যেমন “fix”) খুঁজতে চান।
**সমাধান:** `git log –grep=“fix”`
৬৯. **সিনারিও:** নির্দিষ্ট কোনো ফাইলে কোডের পরিবর্তন (diff) সহ লগ দেখতে চান।
**সমাধান:** `git log -p
৭০. **সিনারিও:** কোন লাইনের কোড কে, কবে লিখেছে তা বের করতে চান (Blame)।
**সমাধান:** `git blame
### ✂️ ক্যাটাগরি ৮: রিব্যাস এবং চেরি-পিক (Rebase & Cherry-pick) (৭১-৮০)
৭১. **সিনারিও:** অন্য ব্রাঞ্চের (যেমন main) নতুন আপডেট আপনার ব্রাঞ্চে আনবেন, কিন্তু মার্জ কমিট মেসেজ না দিয়ে একদম লিনিয়ার হিস্ট্রি রাখতে চান।
**সমাধান:** `git rebase main`
৭২. **সিনারিও:** রিব্যাস করার সময় কনফ্লিক্ট ঠিক করার পর রিব্যাস কন্টিনিউ করতে চান।
**সমাধান:** `git rebase –continue`
৭৩. **সিনারিও:** রিব্যাস করার সময় অবস্থা খারাপ হয়ে গেলে রিব্যাস বাতিল করতে চান।
**সমাধান:** `git rebase –abort`
৭৪. **সিনারিও:** আপনার করা শেষের ৩টি কমিটকে একত্রিত (Squash) করে একটি কমিট বানাতে চান।
**সমাধান:** `git rebase -i HEAD~3` (এরপর `pick` চেঞ্জ করে `squash` বা `s` লিখুন)।
৭৫. **সিনারিও:** অন্য একটি ব্রাঞ্চ থেকে শুধুমাত্র নির্দিষ্ট একটি কমিট কপি করে আপনার ব্রাঞ্চে আনতে চান।
**সমাধান:** `git cherry-pick
৭৬. **সিনারিও:** অন্য ব্রাঞ্চ থেকে পরপর কয়েকটি কমিট একসাথে চেরি-পিক করতে চান।
**সমাধান:** git cherry-pick <hash1> <hash2>
৭৭. **সিনারিও:** চেরি-পিক করার পর কনফ্লিক্ট হলে সমাধান করে কন্টিনিউ করতে চান।
**সমাধান:** `git cherry-pick –continue`
৭৮. **সিনারিও:** চেরি-পিক বাতিল করতে চান।
**সমাধান:** `git cherry-pick –abort`
৭৯. **সিনারিও:** পুশ করার আগে লেটেস্ট কোড নামিয়ে রিব্যাস করতে চান।
**সমাধান:** `git pull –rebase`
৮০. **সিনারিও:** গিট পুশ করার সময় রিব্যাস করেছেন, তাই পুশ নিচ্ছে না। ফোর্স পুশ করতে চান (সাবধানে)।
**সমাধান:** git push origin <branch> --force\ বা `–force-with-lease`
### 🏷️ ক্যাটাগরি ৯: ট্যাগিং এবং রিলিজ (Tagging & Releases) (৮১-৯০)
৮১. **সিনারিও:** প্রজেক্টের নতুন ভার্সন রিলিজের জন্য একটি ট্যাগ (Tag) বানাতে চান (যেমন v1.0)।
**সমাধান:** `git tag v1.0`
৮২. **সিনারিও:** ট্যাগটিতে বিস্তারিত মেসেজ যুক্ত করতে চান।
**সমাধান:** `git tag -a v1.0 -m “Release version 1.0”`
৮৩. **সিনারিও:** প্রজেক্টের সব ট্যাগের লিস্ট দেখতে চান।
**সমাধান:** `git tag`
৮৪. **সিনারিও:** নির্দিষ্ট কোনো কমিটে (আগের) ট্যাগ লাগাতে চান।
**সমাধান:** `git tag v1.1
৮৫. **সিনারিও:** একটি নির্দিষ্ট ট্যাগ গিটহাবে আপলোড করতে চান।
**সমাধান:** `git push origin v1.0`
৮৬. **সিনারিও:** একসাথে সব ট্যাগ গিটহাবে আপলোড করতে চান।
**সমাধান:** `git push origin –tags`
৮৭. **সিনারিও:** একটি লোকাল ট্যাগ ডিলিট করতে চান।
**সমাধান:** `git tag -d v1.0`
৮৮. **সিনারিও:** গিটহাব (রিমোট) থেকে একটি ট্যাগ ডিলিট করতে চান।
**সমাধান:** `git push origin –delete v1.0`
৮৯. **সিনারিও:** একটি নির্দিষ্ট ট্যাগের কোড চেকআউট করতে চান (যেমন ভার্সন ১ দেখতে চান)।
**সমাধান:** `git checkout v1.0`
৯০. **সিনারিও:** নির্দিষ্ট ট্যাগ সম্পর্কে বিস্তারিত তথ্য দেখতে চান।
**সমাধান:** `git show v1.0`
### 🕵️♂️ ক্যাটাগরি ১০: অ্যাডভান্সড ট্রাবলশুটিং এবং প্রো-টিপস (৯১-১০০)
৯১. **সিনারিও:** প্রজেক্টে একটি বাগ (Bug) ঢুকেছে, কিন্তু জানেন না কোন কমিটে বাগটি তৈরি হয়েছে। বাইনারি সার্চ করে দ্রুত বের করতে চান।
**সমাধান:** `git bisect start` (এরপর ভালো ও খারাপ কমিট বলে দিলে গিট নিজে খুঁজে দেবে)।
৯২. **সিনারিও:** নির্দিষ্ট একটি কমিটে কোনো ফাইলে কী লেখা ছিল তা দেখতে চান (ফাইলটি রিস্টোর না করেই)।
**সমাধান:** `git show
৯৩. **সিনারিও:** আপনার প্রজেক্টের সাইজ বিশাল হয়ে গেছে, শুধু লটেস্ট কমিটটুকু ক্লোন করতে চান (Shallow Clone)।
**সমাধান:** `git clone –depth 1
৯৪. **সিনারিও:** প্রজেক্ট থেকে সম্পূর্ণভাবে একটি বড় ফাইল (যা আগে কমিট হয়েছিল) হিস্ট্রি থেকে চিরতরে মুছে ফেলতে চান।
**সমাধান:** `git filter-branch` অথবা `bfg repo-cleaner` ব্যবহার করতে হয়।
৯৫. **সিনারিও:** কোন ফাইলটি গিট ইগনোর (.gitignore) ফাইলের কারণে ব্লক হচ্ছে তা চেক করতে চান।
**সমাধান:** `git check-ignore -v
৯৬. **সিনারিও:** আপনি চান অন্য কোনো লোকাল ডিরেক্টরিকে মূল রিপোজিটরির কাজ করার ফোল্ডার হিসেবে সেট করতে (Worktree)।
**সমাধান:** git worktree add <path> <branch>
৯৭. **সিনারিও:** কমিট মেসেজ লেখার সময় টার্মিনালের বদলে ডিফল্ট এডিটর (যেমন VS Code) ওপেন করতে চান।
**সমাধান:** `git config –global core.editor “code –wait”`
৯৮. **সিনারিও:** বড় প্রজেক্টে (monorepo) স্পেসিফিক শুধু একটি ফোল্ডার ক্লোন করতে চান (Sparse Checkout)।
**সমাধান:** `git sparse-checkout init` এরপর ফোল্ডার সেট করুন।
৯৯. **সিনারিও:** আপনার লেখা একটি গিট এলিয়াস (Shortcut) তৈরি করতে চান (যেমন: git co দিলে checkout কাজ করবে)।
**সমাধান:** `git config –global alias.co checkout`
১০০. **সিনারিও:** গিট ডাটাবেসের ভেতরের অবজেক্টগুলোর অবস্থা চেক করতে এবং অকেজো ডেটা মুছে ক্লিনআপ করতে চান।
**সমাধান:** `git gc –prune=now`
-–
এই ১০০টি সিনারিও আপনার গিট (Git) ব্যবহারের দক্ষতাকে একদম জিরো থেকে প্রো লেভেলে নিয়ে যাওয়ার জন্য যথেষ্ট! চাইলে এই উত্তরটি আপনি সংরক্ষণ করে রাখতে পারেন।