গিট ও গিটহাব শিখি বাংলায়
স্বাগতম! এই বইটা তাদের জন্য যারা গিট (Git) আর গিটহাব (GitHub) একদম শুরু থেকে শিখতে চায়।
তুমি হয়তো ভাবছো — “গিট কি এতই দরকার?” হ্যাঁ ভাই, দরকার! তুমি যদি কোড করো, তাহলে গিট ছাড়া চলবে না। আর গিটহাব হলো তোমার কোড অনলাইনে রাখার জায়গা, যেখানে পুরো দুনিয়ার ডেভেলপাররা একসাথে কাজ করে।
এই বইতে কি কি আছে?
- গিট কি, কেন দরকার — একদম বেসিক থেকে শুরু
- গিট সেটআপ ও কনফিগার — তোমার কম্পিউটারে গিট রেডি করা
- ডেইলি ওয়ার্কফ্লো — প্রতিদিনের কাজে গিট কিভাবে ব্যবহার করবে
- ব্রাঞ্চিং ও মার্জিং — একসাথে অনেক কাজ করার সিস্টেম
- গিটহাব — অনলাইনে কোড রাখা, পুশ-পুল করা
- ওপেন সোর্সে কন্ট্রিবিউট — অন্যের প্রোজেক্টে কিভাবে কাজ করবে
- অ্যাডভান্সড গিট — restore, stash, reset, rebase এসব
কাদের জন্য এই বই?
- যারা একদম নতুন, গিট কখনো ব্যবহার করেনি
- যারা একটু একটু জানে, কিন্তু ক্লিয়ার না
- যারা বাংলায় শিখতে চায়, ইংরেজি ডকুমেন্টেশন পড়ে মাথা ঘুরে যায়
কিভাবে পড়বে?
বইটা সিরিয়ালি সাজানো। প্রথম থেকে শুরু করো, একটা একটা করে পড়ো আর সাথে সাথে প্র্যাকটিস করো। শুধু পড়লে হবে না — নিজের কম্পিউটারে করে দেখতে হবে!
টিপ: প্রতিটা চ্যাপ্টারে কমান্ড দেওয়া আছে। সেগুলো কপি-পেস্ট না করে নিজে টাইপ করো। তাহলে হাতে-কলমে শেখা হবে।
চলো শুরু করা যাক! 🚀
কিছু কথা
কেন এই বই?
তুমি হয়তো কোডিং শিখছো। হতে পারে ওয়েব ডেভেলপমেন্ট, হতে পারে Python, হতে পারে অন্য কিছু। একটা সময়ে তুমি শুনবে — “ভাই, গিট শিখো।” তখন তুমি YouTube-এ যাবে, ইংরেজিতে টিউটোরিয়াল দেখবে, হয়তো কিছুটা বুঝবে, কিন্তু পুরোটা ক্লিয়ার হবে না।
এই বইটা ঠিক সেই জায়গা থেকে লেখা — যাতে তুমি বাংলায়, সহজ ভাষায়, একদম গোড়া থেকে গিট আর গিটহাব শিখতে পারো।
কি কি লাগবে?
শুরু করার জন্য তোমার দরকার:
- একটা কম্পিউটার (Windows, Mac, বা Linux — যেকোনোটা হলেই হবে)
- ইন্টারনেট কানেকশন (গিটহাবের জন্য)
- শেখার ইচ্ছা — এইটাই সবচেয়ে বেশি দরকার!
কিভাবে লেখা হয়েছে?
এই বইতে আমি তোমাকে “তুমি” বলে সম্বোধন করেছি। কারণ আমি চাই তুমি মনে করো — একজন বন্ধু তোমাকে গিট শেখাচ্ছে। কোনো ফর্মাল ক্লাস না, কোনো লেকচার না। একদম ক্যাজুয়াল আড্ডার মতো।
প্রতিটা টপিকে:
- আগে বলছি কি জিনিসটা
- তারপর বলছি কেন দরকার
- তারপর দেখাচ্ছি কিভাবে করবে (কমান্ড সহ)
- শেষে একটা উদাহরণ দিচ্ছি
একটা কথা মাথায় রাখো
গিট শেখা মানে মুখস্থ করা না। গিট শেখা মানে বুঝে বুঝে প্র্যাকটিস করা। তুমি যত বেশি ব্যবহার করবে, তত ভালো বুঝবে। প্রথমে একটু কনফিউজিং লাগতে পারে — সেটা একদম নরমাল। সবারই লাগে। কিন্তু কয়েকদিন প্র্যাকটিস করলেই দেখবে — “আরে, এইটা তো সোজা!”
চলো, শুরু করি গিট কি সেটা দিয়ে।
গিট কি?
সহজ ভাষায় বলতে গেলে
ধরো তুমি একটা প্রোজেক্ট করছো। কোড লিখছো, ফাইল বানাচ্ছো। একদিন কিছু চেইঞ্জ করলে, কিন্তু পরে দেখলে আগেরটাই ভালো ছিলো। এখন কি করবে? আগের ভার্শনে কিভাবে যাবে?
অনেকে কি করে জানো? ফোল্ডারের নাম দেয় এরকম:
my-project
my-project-final
my-project-final-2
my-project-REAL-final
my-project-LAST-final-DONE
হাসি পাচ্ছে? কিন্তু আমরা সবাই এটা করেছি! 😄
গিট (Git) হলো এই সমস্যার সমাধান। গিট হলো একটা ভার্শন কন্ট্রোল সিস্টেম (Version Control System)। মানে এটা তোমার প্রোজেক্টের প্রতিটা ভার্শন মনে রাখে। তুমি যখন খুশি আগের যেকোনো ভার্শনে ফিরে যেতে পারো।
একটা রিয়েল লাইফ উদাহরণ
ধরো তুমি একটা গল্প লিখছো:
- প্রথমে লিখলে চ্যাপ্টার ১ — গিটে সেভ করলে (এটাকে বলে কমিট)
- তারপর চ্যাপ্টার ২ লিখলে — আবার কমিট করলে
- এখন চ্যাপ্টার ২ এর কিছু অংশ মুছে দিলে
- হঠাৎ মনে হলো — আগেরটাই ভালো ছিলো
গিট থাকলে তুমি সহজেই বলতে পারবে — “ভাই, আমাকে চ্যাপ্টার ২ এর আগের ভার্শনটা দাও।” ব্যস, গিট তোমাকে সেটা ফিরিয়ে দেবে!
গিট কি কি করতে পারে?
| কাজ | গিট দিয়ে কি হয় |
|---|---|
| ভার্শন ট্র্যাক করা | প্রতিটা চেইঞ্জের হিস্ট্রি থাকে |
| আগের ভার্শনে যাওয়া | যেকোনো সময়ে পুরানো ভার্শনে ফেরত যাওয়া যায় |
| টিমে কাজ করা | অনেকজন একসাথে একই প্রোজেক্টে কাজ করতে পারে |
| ভুল ঠিক করা | কিছু ভুল হলে সহজেই আগের অবস্থায় ফিরে যাওয়া যায় |
| ব্রাঞ্চ তৈরি করা | মূল কোড না ছুঁয়ে আলাদা ফিচারে কাজ করা যায় |
গিট কে বানিয়েছে?
গিট বানিয়েছেন লিনাস টোরভাল্ডস (Linus Torvalds) — হ্যাঁ, ঐ মানুষটাই যিনি লিনাক্স (Linux) অপারেটিং সিস্টেম বানিয়েছেন। ২০০৫ সালে উনি গিট বানান, কারণ লিনাক্স প্রোজেক্টের কোড ম্যানেজ করার জন্য একটা ভালো টুল দরকার ছিলো।
গিট কি শুধু প্রোগ্রামারদের জন্য?
মূলত হ্যাঁ, গিট প্রোগ্রামারদের জন্যই বানানো হয়েছে। কিন্তু যেকোনো ফাইলের ভার্শন কন্ট্রোল করতে গিট ব্যবহার করা যায় — লেখালেখি, ডকুমেন্টেশন, এমনকি এই বইটাও গিট দিয়ে ম্যানেজ করা হচ্ছে!
মনে রাখো
গিট = তোমার প্রোজেক্টের টাইম মেশিন। যেকোনো সময়ে আগের যেকোনো পয়েন্টে ফিরে যেতে পারবে।
পরের পেজে জানবো — গিটহাব কি, আর গিটের সাথে এটার সম্পর্ক কি।
গিটহাব কি?
গিট আর গিটহাব কি একই জিনিস?
অনেকে গিট আর গিটহাবকে গুলিয়ে ফেলে। আসলে এই দুইটা আলাদা জিনিস:
- গিট (Git) = একটা সফটওয়্যার, যেটা তোমার কম্পিউটারে চলে
- গিটহাব (GitHub) = একটা ওয়েবসাইট, যেখানে তুমি তোমার গিট প্রোজেক্ট অনলাইনে রাখতে পারো
সহজ উদাহরণ দিয়ে বুঝি
ধরো তুমি ছবি তোলো ফোনের ক্যামেরা দিয়ে। এখানে:
- ক্যামেরা = গিট (ছবি তোলার টুল)
- গুগল ফটোস = গিটহাব (ছবি অনলাইনে রাখার জায়গা)
ক্যামেরা ছাড়া ছবি তুলতে পারবে না। আর গুগল ফটোস ছাড়াও ছবি তুলতে পারবে, কিন্তু অনলাইনে শেয়ার করতে পারবে না। দুইটা মিলে কাজটা কমপ্লিট হয়।
ঠিক তেমনি:
- গিট ছাড়া তুমি লোকালি কোড ট্র্যাক করতে পারবে না
- গিটহাব ছাড়াও তুমি গিট ব্যবহার করতে পারবে, কিন্তু অনলাইনে কোড রাখা, শেয়ার করা, টিমে কাজ করা — এসব পারবে না
গিটহাব দিয়ে কি কি করা যায়?
- কোড অনলাইনে রাখা — তোমার প্রোজেক্ট সেফ থাকবে, কম্পিউটার নষ্ট হলেও কোড হারাবে না
- টিমে কাজ করা — তুমি আর তোমার বন্ধুরা একই প্রোজেক্টে কাজ করতে পারবে
- পোর্টফোলিও বানানো — চাকরি খোঁজার সময় গিটহাব দেখায়, এটা তোমার কাজের প্রমাণ
- ওপেন সোর্সে কন্ট্রিবিউট — বড় বড় প্রোজেক্টে (যেমন React, Linux) তুমিও কন্ট্রিবিউট করতে পারবে
- কোড রিভিউ — অন্যরা তোমার কোড দেখে ফিডব্যাক দিতে পারবে
গিটহাবই কি একমাত্র অপশন?
না! গিটহাবের মতো আরো প্ল্যাটফর্ম আছে:
- GitLab — গিটহাবের মতোই, কিছু বাড়তি ফিচার আছে
- Bitbucket — Atlassian এর প্রোডাক্ট, Jira এর সাথে ভালো কাজ করে
কিন্তু গিটহাব সবচেয়ে জনপ্রিয়। বেশিরভাগ ওপেন সোর্স প্রোজেক্ট গিটহাবেই আছে। তাই আমরা গিটহাবই শিখবো।
গিটহাবে অ্যাকাউন্ট খোলা
গিটহাব ব্যবহার করতে হলে আগে একটা অ্যাকাউন্ট খুলতে হবে। এটা ফ্রি:
- github.com এ যাও
- Sign up বাটনে ক্লিক করো
- ইমেইল, পাসওয়ার্ড, ইউজারনেম দিয়ে অ্যাকাউন্ট খোলো
- ইমেইল ভেরিফাই করো — ব্যস!
টিপ: ইউজারনেম ভালো কিছু দাও। এটা তোমার প্রোফাইল URL হবে —
github.com/tomar-username। পরে চেইঞ্জ করা যায়, কিন্তু শুরুতেই ভালো কিছু দেওয়া বুদ্ধিমানের কাজ।
মনে রাখো
গিট = লোকাল টুল (তোমার কম্পিউটারে চলে)
গিটহাব = অনলাইন প্ল্যাটফর্ম (ক্লাউডে কোড রাখার জায়গা)
এবার চলো গিট ইন্সটল করি তোমার কম্পিউটারে!
গিট সেটআপ
গিট ইন্সটল করা
গিট ব্যবহার করতে হলে আগে তোমার কম্পিউটারে গিট ইন্সটল করতে হবে। চলো দেখি কিভাবে করবে।
Windows এ ইন্সটল
- git-scm.com এ যাও
- Download for Windows বাটনে ক্লিক করো
- ডাউনলোড হওয়া ফাইলটা ওপেন করো
- Next, Next করে ইন্সটল করো — ডিফল্ট সেটিংস রাখলেই চলবে
- ইন্সটল শেষ হলে Git Bash নামে একটা অ্যাপ পাবে
Mac এ ইন্সটল
Mac এ সবচেয়ে সহজ উপায় হলো টার্মিনাল খুলে লেখো:
brew install git
Homebrew না থাকলে আগে Homebrew ইন্সটল করো। অথবা git-scm.com থেকে ডাউনলোড করো।
Linux এ ইন্সটল
Ubuntu/Debian হলে:
sudo apt update
sudo apt install git
Fedora হলে:
sudo dnf install git
গিট ইন্সটল হয়েছে কিনা চেক করা
ইন্সটল করার পর টার্মিনাল (বা Git Bash) খুলে লেখো:
git --version
এরকম কিছু দেখাবে:
git version 2.43.0
যদি ভার্শন নম্বর দেখায়, তাহলে গিট ঠিকমতো ইন্সটল হয়েছে! 🎉
কোন টার্মিনাল ব্যবহার করবে?
- Windows: Git Bash ব্যবহার করো (গিটের সাথেই ইন্সটল হয়)। চাইলে VS Code এর বিল্ট-ইন টার্মিনালও ব্যবহার করতে পারো।
- Mac: বিল্ট-ইন Terminal বা iTerm2 ব্যবহার করো।
- Linux: যেকোনো টার্মিনাল ব্যবহার করো।
টিপ: VS Code ব্যবহার করলে সরাসরি VS Code এর টার্মিনালে গিট কমান্ড চালাতে পারবে। `Ctrl + `` (backtick) চেপে টার্মিনাল খোলো।
পরের পেজে গিট কনফিগার করা শিখবো — মানে গিটকে বলবো তুমি কে!
গিট কনফিগার
কেন কনফিগার করতে হয়?
গিট ইন্সটল হয়ে গেছে, কিন্তু এখনো গিট জানে না — তুমি কে! যখন তুমি কোড সেভ (কমিট) করবে, তখন গিটের জানা দরকার এই কমিটটা কে করেছে। তাই তোমার নাম আর ইমেইল সেট করতে হবে।
নাম আর ইমেইল সেট করা
টার্মিনাল খুলে এই দুইটা কমান্ড লেখো:
git config --global user.name "Tanvir Rahman"
git config --global user.email "tanvir@example.com"
এখানে:
user.name= তোমার নাম (যেটা কমিটে দেখাবে)user.email= তোমার ইমেইল (গিটহাবে যেটা ব্যবহার করো, সেটা দাও)--global= মানে এই সেটিং তোমার কম্পিউটারের সব প্রোজেক্টে কাজ করবে
গুরুত্বপূর্ণ: ইমেইলটা গিটহাবে যেটা ব্যবহার করো, সেটাই দাও। তাহলে তোমার কমিটগুলো গিটহাব প্রোফাইলে দেখাবে।
সেটিং চেক করা
ঠিকমতো সেট হয়েছে কিনা দেখতে:
git config --global user.name
আউটপুট:
Tanvir Rahman
git config --global user.email
আউটপুট:
tanvir@example.com
সব কনফিগ একসাথে দেখা
সব সেটিংস একসাথে দেখতে চাইলে:
git config --list
এটা তোমার সব গিট সেটিংস দেখাবে।
ডিফল্ট ব্রাঞ্চ নাম সেট করা
গিটে নতুন প্রোজেক্ট শুরু করলে একটা ডিফল্ট ব্রাঞ্চ তৈরি হয়। আগে এটার নাম ছিলো master, কিন্তু এখন main ব্যবহার করা হয়:
git config --global init.defaultBranch main
উদাহরণ: পুরো কনফিগারেশন
ধরো তোমার নাম “রাকিব হাসান” আর ইমেইল “rakib@gmail.com”। তাহলে তুমি এভাবে কনফিগার করবে:
git config --global user.name "Rakib Hasan"
git config --global user.email "rakib@gmail.com"
git config --global init.defaultBranch main
ব্যস! গিট এখন জানে তুমি কে। এবার চলো একটা প্রোজেক্টে গিট চালু করি!
গিট রিপোজিটরি সেটআপ
রিপোজিটরি কি?
রিপোজিটরি (সংক্ষেপে “রিপো”) হলো তোমার প্রোজেক্টের ফোল্ডার, যেটাতে গিট চালু আছে। মানে গিট ঐ ফোল্ডারের সব ফাইলের উপর নজর রাখছে — কি চেইঞ্জ হলো, কখন হলো, কে করলো।
সহজ কথায়: রিপো = গিট দিয়ে ট্র্যাক করা ফোল্ডার।
নতুন রিপো তৈরি করা
ধরো তুমি একটা নতুন প্রোজেক্ট শুরু করতে চাও। প্রথমে একটা ফোল্ডার বানাও, তারপর সেই ফোল্ডারে গিট চালু করো:
mkdir my-first-project
cd my-first-project
git init
এখানে:
mkdir my-first-project= নতুন ফোল্ডার বানালোcd my-first-project= ঐ ফোল্ডারে ঢুকলোgit init= এই ফোল্ডারে গিট চালু করলো
আউটপুট এরকম আসবে:
Initialized empty Git repository in /home/user/my-first-project/.git/
কি হলো আসলে?
git init কমান্ড দেওয়ার পর গিট তোমার ফোল্ডারে একটা .git নামের হিডেন ফোল্ডার তৈরি করে। এই ফোল্ডারের মধ্যে গিট তার সব ডাটা রাখে — কমিট হিস্ট্রি, ব্রাঞ্চের তথ্য, সবকিছু।
my-first-project/
├── .git/ ← গিটের নিজের ফোল্ডার (এটা ছুঁবে না!)
└── (তোমার ফাইলগুলো এখানে থাকবে)
সাবধান:
.gitফোল্ডারটা কখনো ডিলিট করো না! এটা ডিলিট করলে পুরো গিট হিস্ট্রি মুছে যাবে।
একটা ফাইল বানিয়ে দেখি
চলো একটা ফাইল বানাই:
echo "Hello, Git!" > hello.txt
এটা hello.txt নামে একটা ফাইল বানাবে যেখানে লেখা থাকবে “Hello, Git!”।
এখন তোমার প্রোজেক্ট দেখতে এরকম:
my-first-project/
├── .git/
└── hello.txt
চেক করো গিট কি বলছে
git status
আউটপুট:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
গিট বলছে — “ভাই, hello.txt নামে একটা নতুন ফাইল দেখতে পাচ্ছি, কিন্তু আমি এখনো এটা ট্র্যাক করছি না। চাইলে git add দিয়ে আমাকে বলো এটা ট্র্যাক করতে।”
পরের সেকশনে ঠিক এটাই শিখবো — কিভাবে গিটকে বলবো কোন ফাইলগুলো ট্র্যাক করতে হবে!
স্ট্যাটাস চেক করা
git status কি?
git status হলো গিটের সবচেয়ে বেশি ব্যবহৃত কমান্ডগুলোর একটা। এটা তোমাকে বলে — “তোমার প্রোজেক্টে এখন কি অবস্থা?” কোন ফাইল নতুন, কোনটা চেইঞ্জ হয়েছে, কোনটা সেভের জন্য রেডি — সবকিছু দেখায়।
কিভাবে ব্যবহার করবে?
git status
ব্যস, এটুকুই! এই কমান্ড দিলেই গিট তোমাকে পুরো অবস্থা জানিয়ে দেবে।
বিভিন্ন অবস্থায় git status
১. একদম ক্লিন অবস্থা (কোনো চেইঞ্জ নেই)
On branch main
nothing to commit, working tree clean
মানে — “সব ঠিক আছে, কোনো নতুন চেইঞ্জ নেই।”
২. নতুন ফাইল তৈরি করেছ (Untracked)
ধরো তুমি একটা নতুন ফাইল বানালে:
echo "নতুন ফাইল" > new-file.txt
git status
আউটপুট:
Untracked files:
(use "git add <file>..." to include in what will be committed)
new-file.txt
Untracked মানে — “গিট এই ফাইলটা দেখতে পাচ্ছে, কিন্তু এখনো ট্র্যাক করছে না।” তোমাকে git add দিয়ে বলতে হবে এটা ট্র্যাক করতে।
৩. ফাইল স্টেজিং এরিয়াতে আছে
git add new-file.txt
git status
আউটপুট:
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: new-file.txt
মানে — “এই ফাইলটা কমিটের জন্য রেডি!”
৪. আগের ফাইল মডিফাই করেছ
echo "নতুন লাইন" >> hello.txt
git status
আউটপুট:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: hello.txt
মানে — “hello.txt ফাইলে কিছু চেইঞ্জ হয়েছে, কিন্তু স্টেজিং এরিয়াতে যোগ হয়নি।”
মনে রাখার সহজ ট্রিক
| রঙ | মানে কি |
|---|---|
| 🔴 লাল | চেইঞ্জ আছে, কিন্তু স্টেজ করা হয়নি |
| 🟢 সবুজ | স্টেজ করা হয়েছে, কমিটের জন্য রেডি |
টিপ: কিছু করার আগে আর পরে সবসময়
git statusচালাও। এটা তোমার সেরা বন্ধু!
পরের পেজে শিখবো — স্টেজিং এরিয়া কি আর git add কিভাবে কাজ করে।
স্টেজিং এরিয়াতে নেওয়া
স্টেজিং এরিয়া কি?
গিটে কোনো চেইঞ্জ সরাসরি সেভ (কমিট) হয় না। আগে তোমাকে বলতে হয় — “এই ফাইলগুলো আমি সেভ করতে চাই।” এই “বলার” জায়গাটাই হলো স্টেজিং এরিয়া।
একটা উদাহরণ দিই। ধরো তুমি বাজার করতে গেছো:
- দোকানে ঘুরছো = তোমার ফাইলগুলোতে কাজ করছো (Working Directory)
- ঝুড়িতে/কার্টে রাখছো = যে ফাইলগুলো সেভ করবে সেগুলো বাছাই করছো (Staging Area)
- কাউন্টারে গিয়ে পে করছো = ফাইনাল সেভ করছো (Commit)
git add কমান্ড দিয়ে তুমি ফাইলকে ঝুড়িতে (স্টেজিং এরিয়াতে) রাখো।
একটা ফাইল স্টেজ করা
git add hello.txt
এটা শুধু hello.txt ফাইলটাকে স্টেজিং এরিয়াতে নেবে।
একসাথে অনেকগুলো ফাইল স্টেজ করা
git add file1.txt file2.txt file3.txt
স্পেস দিয়ে আলাদা করে অনেকগুলো ফাইলের নাম দিতে পারো।
সব ফাইল একসাথে স্টেজ করা
git add .
এই ডট (.) মানে “এই ফোল্ডারের সবকিছু।” নতুন ফাইল, চেইঞ্জ করা ফাইল — সব স্টেজিং এরিয়াতে যাবে।
সাবধান:
git add .দেওয়ার আগেgit statusদিয়ে চেক করো কি কি চেইঞ্জ আছে। নাহলে অপ্রয়োজনীয় ফাইলও স্টেজ হয়ে যেতে পারে!
স্টেজ থেকে ফাইল বের করা (Unstage)
ভুল করে কোনো ফাইল স্টেজ করে ফেললে? চিন্তা নেই:
git rm --cached hello.txt
এটা ফাইলটাকে স্টেজিং এরিয়া থেকে বের করবে, কিন্তু ফাইলটা ডিলিট হবে না।
উদাহরণ: পুরো ফ্লো
# নতুন ফাইল বানাই
echo "আমার প্রথম ফাইল" > first.txt
echo "আমার দ্বিতীয় ফাইল" > second.txt
# স্ট্যাটাস চেক
git status
# Output: দুইটা Untracked ফাইল দেখাবে
# শুধু first.txt স্টেজ করি
git add first.txt
# আবার স্ট্যাটাস চেক
git status
# Output: first.txt সবুজ (স্টেজড), second.txt লাল (আনস্টেজড)
গিটের তিনটা জায়গা
Working Directory ──git add──▶ Staging Area ──git commit──▶ Repository
(কাজের জায়গা) (ঝুড়ি/কার্ট) (ফাইনাল সেভ)
এই তিনটা জায়গা মাথায় রাখলে গিটের অনেক কিছু সহজ হয়ে যাবে!
পরের পেজে শিখবো — কিভাবে ফাইনাল সেভ (কমিট) করতে হয়।
ফাইনাল কমিট করা
কমিট কি?
কমিট হলো তোমার প্রোজেক্টের একটা স্ন্যাপশট। ধরো তুমি একটা ছবি তুললে — ঐ মুহূর্তের সবকিছু ছবিতে ধরা পড়লো। কমিটও ঠিক তেমন — ঐ মুহূর্তে তোমার প্রোজেক্টের সব ফাইল কি অবস্থায় আছে, সেটা গিট মনে রাখে।
কিভাবে কমিট করবে?
আগে ফাইল স্টেজ করো (git add), তারপর কমিট করো:
git add .
git commit -m "প্রথম কমিট - hello.txt ফাইল যোগ করেছি"
এখানে:
git commit= কমিট করো-m= মেসেজ দাও"..."= কমিট মেসেজ — কি চেইঞ্জ করেছো সেটা লেখো
আউটপুট কেমন দেখাবে?
[main (root-commit) a1b2c3d] প্রথম কমিট - hello.txt ফাইল যোগ করেছি
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
এখানে:
main= ব্রাঞ্চের নামa1b2c3d= কমিটের ইউনিক আইডি (হ্যাশ)1 file changed= একটা ফাইলে চেইঞ্জ হয়েছে1 insertion(+)= একটা নতুন লাইন যোগ হয়েছে
ভালো কমিট মেসেজ কিভাবে লিখবে?
কমিট মেসেজ খুব গুরুত্বপূর্ণ। পরে যখন হিস্ট্রি দেখবে, তখন এই মেসেজ দেখেই বুঝতে হবে কি করেছিলে।
❌ খারাপ কমিট মেসেজ
git commit -m "update"
git commit -m "fix"
git commit -m "changes"
git commit -m "asdf"
✅ ভালো কমিট মেসেজ
git commit -m "হোমপেজে নেভবার যোগ করেছি"
git commit -m "লগিন ফর্মের বাগ ফিক্স করেছি"
git commit -m "README ফাইল আপডেট করেছি"
git commit -m "ইউজার প্রোফাইল পেজ তৈরি করেছি"
কমিটের পর স্ট্যাটাস
git status
আউটপুট:
On branch main
nothing to commit, working tree clean
গিট বলছে — “সব সেভ হয়ে গেছে, কোনো পেন্ডিং চেইঞ্জ নেই।” 🎉
উদাহরণ: শুরু থেকে শেষ পর্যন্ত
# ১. ফাইল বানাই
echo "Hello, Git!" > hello.txt
# ২. স্ট্যাটাস চেক
git status
# ৩. স্টেজ করি
git add hello.txt
# ৪. কমিট করি
git commit -m "hello.txt ফাইল তৈরি করেছি"
এটাই হলো গিটের সবচেয়ে বেসিক ওয়ার্কফ্লো — চেইঞ্জ করো → স্টেজ করো → কমিট করো।
পরের পেজে দেখবো — ফাইল মডিফাই করে আবার কিভাবে কমিট করতে হয়।
ফাইল মডিফাই করে আবার কমিট
ফাইল চেইঞ্জ করলে কি হয়?
ধরো তুমি আগে hello.txt ফাইল তৈরি করে কমিট করেছো। এখন ঐ ফাইলে কিছু নতুন লিখতে চাও। চলো দেখি:
echo "এটা আমার দ্বিতীয় লাইন" >> hello.txt
>> মানে ফাইলের শেষে নতুন লাইন যোগ করো (আগেরটা মুছবে না)।
স্ট্যাটাস চেক
git status
আউটপুট:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: hello.txt
গিট বলছে — “hello.txt ফাইলে কিছু চেইঞ্জ হয়েছে, কিন্তু স্টেজ করা হয়নি।”
চেইঞ্জটা কি দেখতে চাও?
git diff
আউটপুট:
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
Hello, Git!
+এটা আমার দ্বিতীয় লাইন
+ চিহ্ন দিয়ে নতুন যোগ হওয়া লাইন দেখাচ্ছে।
আবার কমিট করি
আগের মতোই — স্টেজ করো, তারপর কমিট করো:
git add hello.txt
git commit -m "hello.txt এ নতুন লাইন যোগ করেছি"
নতুন ফাইল বানিয়ে কমিট
চাইলে নতুন ফাইলও বানাতে পারো:
echo "এটা দ্বিতীয় ফাইল" > second.txt
git add second.txt
git commit -m "second.txt ফাইল তৈরি করেছি"
একসাথে অনেক চেইঞ্জ কমিট
ধরো তুমি দুইটা ফাইলে চেইঞ্জ করেছো:
echo "আপডেট ১" >> hello.txt
echo "আপডেট ২" >> second.txt
git add .
git commit -m "দুইটা ফাইলেই আপডেট করেছি"
git add . দিলে সব চেইঞ্জ একসাথে স্টেজ হবে।
মনে রাখো
প্রতিবার কাজ করার পর কমিট করো। ছোট ছোট কমিট করা ভালো — একটা বিশাল কমিটের চেয়ে অনেকগুলো ছোট কমিট অনেক ভালো। কারণ:
- পরে সহজে বুঝা যায় কি চেইঞ্জ হয়েছে
- কোনো কিছু ভুল হলে শুধু ঐ একটা কমিট বাদ দিলেই হয়
- কোড রিভিউ করতে সুবিধা হয়
টিপ: ভাবো প্রতিটা কমিট একটা সেভ পয়েন্ট — গেমে যেমন সেভ করো, কোডেও তেমন কমিট করো!
পুনরায় মডিফাই করে কমিট
এতক্ষণ কি শিখলাম?
এতক্ষণে তুমি শিখেছো:
- ফাইল তৈরি করা
git addদিয়ে স্টেজ করাgit commit -m "মেসেজ"দিয়ে কমিট করা- ফাইল মডিফাই করে আবার কমিট করা
এবার চলো আরেকবার পুরো ওয়ার্কফ্লোটা প্র্যাকটিস করি, একটু ভিন্নভাবে।
প্র্যাকটিস
ধাপ ১: আগের ফাইলে আরো কিছু যোগ করো
echo "তৃতীয় লাইন - গিট শিখছি" >> hello.txt
ধাপ ২: একটা নতুন ফাইল বানাও
echo "এটা আমার নোটস ফাইল" > notes.txt
ধাপ ৩: স্ট্যাটাস দেখো
git status
আউটপুট:
Changes not staged for commit:
modified: hello.txt
Untracked files:
notes.txt
দেখো — দুই ধরনের চেইঞ্জ দেখাচ্ছে:
modified= আগের ফাইল চেইঞ্জ হয়েছেUntracked= নতুন ফাইল, এখনো ট্র্যাক করা হচ্ছে না
ধাপ ৪: সব স্টেজ করো
git add .
ধাপ ৫: কমিট করো
git commit -m "hello.txt আপডেট এবং notes.txt ফাইল যোগ করেছি"
–amend দিয়ে শেষ কমিট ঠিক করা
ধরো তুমি কমিট করেছো, কিন্তু মেসেজে ভুল হয়ে গেছে। আবার নতুন কমিট করার দরকার নেই! --amend ব্যবহার করো:
git commit --amend -m "hello.txt আপডেট ও notes.txt যোগ করা হয়েছে"
এটা শেষ কমিটের মেসেজ বদলে দেবে।
সাবধান:
--amendশুধু তখনই ব্যবহার করবে যখন কমিটটা এখনো গিটহাবে পুশ করোনি। পুশ করার পর amend করলে ঝামেলা হতে পারে!
ফাইল ভুলে গেলে?
ধরো কমিট করেছো, কিন্তু একটা ফাইল অ্যাড করতে ভুলে গেছো:
# ভুলে যাওয়া ফাইল স্টেজ করো
git add forgotten-file.txt
# আগের কমিটে যোগ করো
git commit --amend --no-edit
--no-edit মানে মেসেজ আগেরটাই থাকবে, শুধু নতুন ফাইলটা যোগ হবে।
মূল কথা
গিটের বেসিক ওয়ার্কফ্লো হলো:
কোড লেখো → git add → git commit → রিপিট
এটা বারবার করতে থাকো। যত বেশি করবে, তত স্বাভাবিক লাগবে!
কমিট লগ চেক
git log কি?
তুমি এতক্ষণে কয়েকটা কমিট করেছো। এখন যদি জানতে চাও — “আমি এতদিনে কি কি কমিট করেছি?” — তাহলে git log ব্যবহার করবে।
git log তোমার প্রোজেক্টের পুরো কমিট হিস্ট্রি দেখায়।
বেসিক ব্যবহার
git log
আউটপুট এরকম দেখাবে:
commit a1b2c3d4e5f6g7h8i9j0 (HEAD -> main)
Author: Tanvir Rahman <tanvir@example.com>
Date: Thu Feb 13 10:30:00 2026 +0600
hello.txt আপডেট ও notes.txt যোগ করা হয়েছে
commit b2c3d4e5f6g7h8i9j0k1
Author: Tanvir Rahman <tanvir@example.com>
Date: Thu Feb 13 10:15:00 2026 +0600
second.txt ফাইল তৈরি করেছি
commit c3d4e5f6g7h8i9j0k1l2
Author: Tanvir Rahman <tanvir@example.com>
Date: Thu Feb 13 10:00:00 2026 +0600
প্রথম কমিট - hello.txt ফাইল যোগ করেছি
প্রতিটা কমিটে দেখাচ্ছে:
- commit hash = কমিটের ইউনিক আইডি (লম্বা একটা কোড)
- Author = কে করেছে
- Date = কবে করেছে
- মেসেজ = কি করেছে
ছোট করে দেখা (One Line)
কমিট অনেক হলে লম্বা লিস্ট আসে। ছোট করে দেখতে চাইলে:
git log --oneline
আউটপুট:
a1b2c3d hello.txt আপডেট ও notes.txt যোগ করা হয়েছে
b2c3d4e second.txt ফাইল তৈরি করেছি
c3d4e5f প্রথম কমিট - hello.txt ফাইল যোগ করেছি
অনেক ক্লিন! শুধু হ্যাশের শুরুটা আর মেসেজ দেখাচ্ছে।
নির্দিষ্ট সংখ্যক কমিট দেখা
শেষ ৩টা কমিট দেখতে চাইলে:
git log -3
অথবা ওয়ান লাইনে:
git log --oneline -3
গ্রাফ আকারে দেখা
ব্রাঞ্চ থাকলে গ্রাফ ভিউ অনেক কাজে লাগে:
git log --oneline --graph
আউটপুট:
* a1b2c3d hello.txt আপডেট ও notes.txt যোগ করা হয়েছে
* b2c3d4e second.txt ফাইল তৈরি করেছি
* c3d4e5f প্রথম কমিট - hello.txt ফাইল যোগ করেছি
নির্দিষ্ট ফাইলের হিস্ট্রি
শুধু একটা ফাইলে কি কি চেইঞ্জ হয়েছে দেখতে:
git log hello.txt
লগ থেকে বের হওয়া
লগ অনেক লম্বা হলে স্ক্রল করতে হয়। বের হতে q চাপো।
টিপ:
git log --onelineসবচেয়ে বেশি কাজে লাগে। এটা মনে রাখো!
পরের পেজে শিখবো — পুরানো কোনো কমিটে কিভাবে ফিরে যেতে হয়।
পূর্বের ভার্শনে যাওয়া
কেন পুরানো ভার্শনে যেতে চাইবে?
ধরো তুমি কোডে কিছু চেইঞ্জ করেছো, কিন্তু সেটা কাজ করছে না। আগের ভার্শনে সব ঠিক ছিলো। এখন তুমি চাও — “আমাকে আগের অবস্থায় ফিরিয়ে দাও!” গিটে এটা করা খুবই সহজ।
আগে কমিট হিস্ট্রি দেখো
git log --oneline
আউটপুট:
a1b2c3d (HEAD -> main) তৃতীয় কমিট
b2c3d4e দ্বিতীয় কমিট
c3d4e5f প্রথম কমিট
এখানে HEAD হলো তুমি এখন যেখানে আছো।
শুধু দেখতে চাও? (checkout)
যদি শুধু আগের একটা কমিটে গিয়ে দেখতে চাও — তখনকার কোড কেমন ছিলো — কিন্তু কিছু চেইঞ্জ করবে না:
git checkout c3d4e5f
এটা তোমাকে ঐ কমিটে নিয়ে যাবে। তুমি ফাইলগুলো দেখতে পারবে, কিন্তু এটা একটা “ভিজিটিং” মোড।
গিট তোমাকে বলবে: “You are in ‘detached HEAD’ state.” — ঘাবড়াবে না! এটা মানে তুমি শুধু দেখতে এসেছো।
আবার বর্তমানে ফিরে আসতে:
git checkout main
পুরোপুরি ফিরে যেতে চাও?
যদি চাও শেষ কমিটের চেইঞ্জটাই বাদ দিতে, তাহলে বিভিন্ন উপায় আছে। সেগুলো আমরা অ্যাডভান্সড সেকশনে (git reset, git revert) বিস্তারিত শিখবো।
এখন শুধু এটুকু জানো:
| কি করতে চাও | কমান্ড |
|---|---|
| আগের কমিট দেখতে চাও | git checkout <hash> |
| বর্তমানে ফিরে আসতে চাও | git checkout main |
| শেষ কমিট বাতিল করতে চাও | git revert (পরে শিখবো) |
| হিস্ট্রি থেকে মুছে দিতে চাও | git reset (পরে শিখবো) |
উদাহরণ
# হিস্ট্রি দেখো
git log --oneline
# আউটপুট:
# a1b2c3d (HEAD -> main) নোটস আপডেট
# b2c3d4e hello.txt চেইঞ্জ
# c3d4e5f প্রথম কমিট
# প্রথম কমিটে যাও
git checkout c3d4e5f
# ফাইলগুলো দেখো - প্রথম কমিটের অবস্থায় আছে!
cat hello.txt
# আবার বর্তমানে ফিরে এসো
git checkout main
মনে রাখো
git checkout = টাইম ট্রাভেল। আগের যেকোনো পয়েন্টে গিয়ে দেখে আসতে পারো, আবার ফিরেও আসতে পারো!
এবার চলো ব্রাঞ্চিং শিখি — গিটের সবচেয়ে পাওয়ারফুল ফিচারগুলোর একটা!
ব্রাঞ্চ তৈরি
ব্রাঞ্চ কি?
ধরো তুমি একটা ওয়েবসাইট বানাচ্ছো। মেইন সাইটটা ঠিকঠাক চলছে। এখন তুমি একটা নতুন ফিচার যোগ করতে চাও — ধরো একটা ডার্ক মোড। কিন্তু ডার্ক মোড বানাতে গিয়ে যদি মেইন সাইট ভেঙে যায়?
এই সমস্যার সমাধান হলো ব্রাঞ্চ!
ব্রাঞ্চ হলো তোমার প্রোজেক্টের একটা আলাদা কপি। মেইন কোড (main ব্রাঞ্চ) ছুঁতে হবে না — আলাদা একটা ব্রাঞ্চে কাজ করো। কাজ হয়ে গেলে মেইনে মিলিয়ে দাও।
রিয়েল লাইফ উদাহরণ
ধরো তুমি একটা গাছের কাণ্ড (trunk)। এটা হলো তোমার main ব্রাঞ্চ। গাছ থেকে ডাল বের হয় — এগুলো হলো ব্রাঞ্চ। প্রতিটা ডালে আলাদা আলাদা ফুল/ফল ধরে। কিন্তু সবই এক গাছের অংশ।
● ডার্ক মোড (feature/dark-mode)
/
main ●───●───●───●
\
● বাগ ফিক্স (fix/login-bug)
কোন ব্রাঞ্চে আছো দেখা
git branch
আউটপুট:
* main
* চিহ্ন দিয়ে বোঝাচ্ছে তুমি এখন main ব্রাঞ্চে আছো।
নতুন ব্রাঞ্চ তৈরি করা
git branch dark-mode
এটা dark-mode নামে একটা নতুন ব্রাঞ্চ তৈরি করবে। কিন্তু তুমি এখনো main ব্রাঞ্চেই আছো!
চেক করো:
git branch
আউটপুট:
dark-mode
* main
দেখো — dark-mode তৈরি হয়েছে, কিন্তু * এখনো main এ আছে।
ব্রাঞ্চ তৈরি করে সাথে সাথে যাওয়া
বেশিরভাগ সময় তুমি ব্রাঞ্চ তৈরি করেই সেখানে যেতে চাইবে। তখন একটা কমান্ডেই দুইটা কাজ হবে:
git checkout -b dark-mode
অথবা নতুন ভার্শনে:
git switch -c dark-mode
দুইটাই একই কাজ করে — নতুন ব্রাঞ্চ তৈরি করে সেখানে নিয়ে যায়।
ব্রাঞ্চের নাম কেমন হওয়া উচিত?
ভালো ব্রাঞ্চ নামের কিছু উদাহরণ:
| টাইপ | উদাহরণ |
|---|---|
| নতুন ফিচার | feature/dark-mode, feature/login-page |
| বাগ ফিক্স | fix/login-bug, fix/header-style |
| হটফিক্স | hotfix/security-patch |
টিপ: ব্রাঞ্চের নাম ছোট হাতের অক্ষরে, হাইফেন (-) দিয়ে লেখো। স্পেস ব্যবহার করো না!
পরের পেজে শিখবো — তৈরি করা ব্রাঞ্চে কিভাবে যাবে (চেকআউট করবে)।
ব্রাঞ্চ এ চেকআউট
চেকআউট মানে কি?
চেকআউট মানে এক ব্রাঞ্চ থেকে আরেক ব্রাঞ্চে যাওয়া। ধরো তুমি এখন main ব্রাঞ্চে আছো, তুমি dark-mode ব্রাঞ্চে যেতে চাও। এটাকেই বলে চেকআউট।
ব্রাঞ্চ বদলানো
git checkout dark-mode
অথবা নতুন ভার্শনে:
git switch dark-mode
আউটপুট:
Switched to branch 'dark-mode'
কোন ব্রাঞ্চে আছো চেক করো
git branch
আউটপুট:
* dark-mode
main
* এখন dark-mode এ — মানে তুমি dark-mode ব্রাঞ্চে আছো!
আবার main এ ফিরে যাওয়া
git checkout main
অথবা:
git switch main
checkout vs switch — কোনটা ব্যবহার করবো?
git switch হলো নতুন কমান্ড, শুধু ব্রাঞ্চ বদলানোর জন্য। git checkout পুরানো কমান্ড, এটা আরো অনেক কাজ করে (ফাইল রিস্টোর, পুরানো কমিটে যাওয়া ইত্যাদি)।
| কাজ | পুরানো উপায় | নতুন উপায় |
|---|---|---|
| ব্রাঞ্চ বদলানো | git checkout dark-mode | git switch dark-mode |
| নতুন ব্রাঞ্চ তৈরি ও যাওয়া | git checkout -b new-branch | git switch -c new-branch |
দুইটাই কাজ করে। তবে git switch বেশি ক্লিয়ার, কারণ এটা শুধু ব্রাঞ্চের জন্য।
গুরুত্বপূর্ণ কথা
ব্রাঞ্চ বদলানোর আগে নিশ্চিত করো তোমার কোনো আনকমিটেড চেইঞ্জ নেই। git status দিয়ে চেক করো:
git status
যদি “working tree clean” দেখায়, তাহলে নিশ্চিন্তে ব্রাঞ্চ বদলাও। নাহলে আগে কমিট করো অথবা স্ট্যাশ করো (স্ট্যাশ পরে শিখবো)।
উদাহরণ: পুরো ফ্লো
# main ব্রাঞ্চে আছো
git branch
# * main
# dark-mode ব্রাঞ্চে যাও
git switch dark-mode
# Switched to branch 'dark-mode'
# কোন ব্রাঞ্চে আছো চেক করো
git branch
# * dark-mode
# main
# আবার main এ ফিরে যাও
git switch main
পরের পেজে শিখবো — ব্রাঞ্চে গিয়ে কিভাবে কাজ করবে এবং কমিট করবে।
নতুন ব্রাঞ্চে মডিফিকেশন
ব্রাঞ্চে কাজ করা
এখন তুমি dark-mode ব্রাঞ্চে আছো। এখানে যা কিছু করবে, সেটা main ব্রাঞ্চকে প্রভাবিত করবে না। মানে তুমি নিশ্চিন্তে এক্সপেরিমেন্ট করতে পারো!
চলো কিছু কাজ করি
ধাপ ১: dark-mode ব্রাঞ্চে যাও
git switch dark-mode
ধাপ ২: একটা নতুন ফাইল বানাও
echo "ডার্ক মোডের CSS" > dark-mode.css
ধাপ ৩: আগের ফাইলে কিছু চেইঞ্জ করো
echo "ডার্ক মোড ফিচার যোগ হয়েছে" >> hello.txt
ধাপ ৪: স্ট্যাটাস দেখো
git status
আউটপুট:
On branch dark-mode
Changes not staged for commit:
modified: hello.txt
Untracked files:
dark-mode.css
ধাপ ৫: স্টেজ করো এবং কমিট করো
git add .
git commit -m "ডার্ক মোড ফিচার যোগ করেছি"
এখন main ব্রাঞ্চে ফিরে দেখো
git switch main
এখন hello.txt দেখো:
cat hello.txt
কি দেখলে? তোমার “ডার্ক মোড ফিচার যোগ হয়েছে” লাইনটা নেই! আর dark-mode.css ফাইলটাও নেই!
কারণ — ঐ চেইঞ্জগুলো dark-mode ব্রাঞ্চে আছে, main ব্রাঞ্চে নেই। দুইটা ব্রাঞ্চ আলাদা আলাদা!
আবার dark-mode ব্রাঞ্চে গেলে
git switch dark-mode
cat hello.txt
দেখবে — “ডার্ক মোড ফিচার যোগ হয়েছে” লাইনটা আবার ফিরে এসেছে! আর dark-mode.css ফাইলটাও আছে!
এটাই ব্রাঞ্চিংয়ের মজা!
main ব্রাঞ্চ: hello.txt (আগের মতোই)
dark-mode ব্রাঞ্চ: hello.txt (নতুন লাইন সহ) + dark-mode.css
দুইটা আলাদা দুনিয়া! মেইন কোড সেফ আছে, আর তুমি নতুন ব্রাঞ্চে হাতের কাজ করছো।
টিপ: প্রতিটা ফিচারের জন্য আলাদা ব্রাঞ্চ বানানো একটা ভালো অভ্যাস। এতে কোড পরিষ্কার থাকে আর টিমে কাজ করা সহজ হয়।
পরের পেজে শিখবো — কাজ শেষ হলে ব্রাঞ্চটাকে main এ কিভাবে মার্জ করবে।
ব্রাঞ্চ মেইনে মার্জ
মার্জ কি?
মার্জ মানে দুইটা ব্রাঞ্চকে একসাথে মেলানো। তুমি dark-mode ব্রাঞ্চে কাজ শেষ করেছো, সব ঠিকঠাক চলছে। এখন এই চেইঞ্জগুলো main ব্রাঞ্চে নিয়ে আসতে চাও। এটাই মার্জ।
কিভাবে মার্জ করবে?
ধাপ ১: main ব্রাঞ্চে যাও
মার্জ করার আগে সবসময় main ব্রাঞ্চে যেতে হবে:
git switch main
ধাপ ২: মার্জ করো
git merge dark-mode
আউটপুট:
Updating b2c3d4e..a1b2c3d
Fast-forward
dark-mode.css | 1 +
hello.txt | 1 +
2 files changed, 2 insertions(+)
create mode 100644 dark-mode.css
ব্যস! dark-mode ব্রাঞ্চের সব চেইঞ্জ এখন main ব্রাঞ্চে চলে এসেছে!
মার্জের পর চেক করো
cat hello.txt
এখন main ব্রাঞ্চেও “ডার্ক মোড ফিচার যোগ হয়েছে” লাইনটা দেখতে পাবে!
কাজ শেষে ব্রাঞ্চ ডিলিট
মার্জ হয়ে গেলে পুরানো ব্রাঞ্চটা আর দরকার নেই। ডিলিট করে দাও:
git branch -d dark-mode
আউটপুট:
Deleted branch dark-mode (was a1b2c3d).
মার্জ কনফ্লিক্ট কি?
কখনো কখনো মার্জ এত সোজা হয় না। ধরো তুমি main ব্রাঞ্চেও hello.txt চেইঞ্জ করেছো, আর dark-mode ব্রাঞ্চেও একই ফাইলের একই জায়গায় চেইঞ্জ করেছো। তখন গিট বলবে — “ভাই, আমি বুঝতে পারছি না কোন চেইঞ্জটা রাখবো।” এটাকে বলে মার্জ কনফ্লিক্ট।
কনফ্লিক্ট হলে ফাইলে এরকম দেখাবে:
<<<<<<< HEAD
main ব্রাঞ্চের চেইঞ্জ
=======
dark-mode ব্রাঞ্চের চেইঞ্জ
>>>>>>> dark-mode
তোমাকে ম্যানুয়ালি ঠিক করতে হবে — কোনটা রাখবে, কোনটা বাদ দেবে। তারপর:
git add .
git commit -m "মার্জ কনফ্লিক্ট সমাধান করেছি"
মনে রাখো
মার্জ করার স্টেপ:
git switch main— মেইন ব্রাঞ্চে যাওgit merge branch-name— মার্জ করো- কনফ্লিক্ট থাকলে সমাধান করো
git branch -d branch-name— পুরানো ব্রাঞ্চ ডিলিট করো
টিপ: রেগুলার মার্জ করো। অনেকদিন ধরে ব্রাঞ্চে কাজ করে তারপর মার্জ করতে গেলে কনফ্লিক্ট বেশি হয়।
কমিটের সাথে কমিটের পার্থক্য
git diff কি?
git diff দিয়ে তুমি দেখতে পারো — দুইটা কমিটের মধ্যে, বা বর্তমান চেইঞ্জ আর আগের অবস্থার মধ্যে কি পার্থক্য আছে।
বর্তমান চেইঞ্জ দেখা
ফাইল মডিফাই করার পর কি চেইঞ্জ হয়েছে দেখতে:
echo "নতুন একটা লাইন" >> hello.txt
git diff
আউটপুট:
diff --git a/hello.txt b/hello.txt
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,3 @@
Hello, Git!
আমার দ্বিতীয় লাইন
+নতুন একটা লাইন
এখানে:
---= আগের ভার্শন+++= এখনকার ভার্শন-(লাল) = মুছে যাওয়া লাইন+(সবুজ) = যোগ হওয়া লাইন
স্টেজ করা চেইঞ্জ দেখা
git add করার পর git diff আর কিছু দেখাবে না! কারণ git diff শুধু আনস্টেজড চেইঞ্জ দেখায়। স্টেজ করা চেইঞ্জ দেখতে:
git diff --staged
দুইটা কমিটের পার্থক্য
দুইটা কমিটের মধ্যে পার্থক্য দেখতে:
git log --oneline
# a1b2c3d তৃতীয় কমিট
# b2c3d4e দ্বিতীয় কমিট
# c3d4e5f প্রথম কমিট
git diff c3d4e5f a1b2c3d
এটা প্রথম কমিট থেকে তৃতীয় কমিট পর্যন্ত কি কি চেইঞ্জ হয়েছে দেখাবে।
দুইটা ব্রাঞ্চের পার্থক্য
git diff main dark-mode
এটা main আর dark-mode ব্রাঞ্চের মধ্যে পার্থক্য দেখাবে।
নির্দিষ্ট ফাইলের পার্থক্য
শুধু একটা ফাইলের পার্থক্য দেখতে:
git diff hello.txt
সারাংশ
| কমান্ড | কি করে |
|---|---|
git diff | আনস্টেজড চেইঞ্জ দেখায় |
git diff --staged | স্টেজ করা চেইঞ্জ দেখায় |
git diff commit1 commit2 | দুই কমিটের পার্থক্য |
git diff branch1 branch2 | দুই ব্রাঞ্চের পার্থক্য |
git diff filename | নির্দিষ্ট ফাইলের পার্থক্য |
টিপ: কমিট করার আগে
git diffদিয়ে চেক করো কি কি চেইঞ্জ করেছো। এটা একটা ভালো অভ্যাস!
এবার চলো গিটহাবের সাথে কাজ করা শিখি! 🚀
গিটহাবের সাথে লিঙ্ক
লোকাল রিপো আর রিমোট রিপো
এতক্ষণ তুমি গিট দিয়ে তোমার কম্পিউটারে (লোকালি) কাজ করেছো। এখন তোমার কোড গিটহাবে নিয়ে যেতে হবে। এর জন্য তোমার লোকাল রিপো আর গিটহাবের রিপো — দুইটা কানেক্ট করতে হবে।
ধাপ ১: গিটহাবে নতুন রিপো তৈরি করো
- github.com এ লগইন করো
- ডান পাশে উপরে + বাটনে ক্লিক করো
- New repository সিলেক্ট করো
- রিপোর নাম দাও (যেমন:
my-first-project) - Public রাখো (সবাই দেখতে পারবে)
- Add a README file টিক দিও না (কারণ লোকাল রিপো আগেই আছে)
- Create repository ক্লিক করো
ধাপ ২: লোকাল রিপোর সাথে কানেক্ট করো
গিটহাবে রিপো তৈরি করলে একটা URL পাবে। সেটা কপি করো। তারপর তোমার কম্পিউটারের টার্মিনালে:
git remote add origin https://github.com/tomar-username/my-first-project.git
এখানে:
git remote add= রিমোট রিপো যোগ করোorigin= রিমোটের নাম (কনভেনশন অনুযায়ীoriginদেওয়া হয়)- URL = গিটহাব রিপোর লিঙ্ক
ধাপ ৩: চেক করো কানেক্ট হয়েছে কিনা
git remote -v
আউটপুট:
origin https://github.com/tomar-username/my-first-project.git (fetch)
origin https://github.com/tomar-username/my-first-project.git (push)
এটা দেখায় যে origin নামে একটা রিমোট কানেক্ট করা আছে।
origin মানে কি?
origin হলো তোমার রিমোট রিপোর নাম। এটা একটা নিকনেম — পুরো URL বারবার লেখার বদলে শুধু origin লিখলেই হয়।
তুমি চাইলে অন্য নামও দিতে পারতে (যেমন github বা server), কিন্তু সবাই origin ব্যবহার করে, তাই এটাই ব্যবহার করো।
রিমোট URL চেইঞ্জ করা
ভুল URL দিয়ে ফেললে চেইঞ্জ করতে:
git remote set-url origin https://github.com/correct-username/correct-repo.git
রিমোট ডিলিট করা
git remote remove origin
মনে রাখো
লোকাল রিপো (তোমার কম্পিউটার) ◄──── git remote ────► গিটহাব রিপো (ক্লাউড)
কানেকশন তৈরি হয়ে গেছে! এবার চলো শিখি কোড গিটহাবে পুশ করা।
গিটহাবে পুশ
পুশ কি?
পুশ মানে তোমার লোকাল কম্পিউটারের কোড গিটহাবে আপলোড করা। তুমি লোকালে কমিট করেছো, এখন সেটা অনলাইনে পাঠাতে চাও — এটাই পুশ।
প্রথমবার পুশ করা
একদম প্রথমবার পুশ করতে:
git push -u origin main
এখানে:
git push= কোড পাঠাও-u= upstream সেট করো (প্রথমবারের জন্য)origin= কোথায় পাঠাবে (গিটহাব রিপো)main= কোন ব্রাঞ্চ পাঠাবে
আউটপুট:
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 500 bytes | 500.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/tomar-username/my-first-project.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
পরেরবার পুশ করা
-u একবার দিলেই হয়। পরেরবার থেকে শুধু:
git push
এটাই যথেষ্ট!
অথেনটিকেশন
প্রথমবার পুশ করতে গেলে গিটহাব তোমার ইউজারনেম আর পাসওয়ার্ড চাইবে। কিন্তু এখন গিটহাব সরাসরি পাসওয়ার্ড সাপোর্ট করে না। তোমাকে Personal Access Token (PAT) অথবা SSH Key ব্যবহার করতে হবে।
Personal Access Token বানানো
- GitHub এ যাও → Settings → Developer settings → Personal access tokens → Tokens (classic)
- Generate new token ক্লিক করো
- একটা নোট দাও (যেমন: “my laptop”)
- Expiration সিলেক্ট করো
- repo এ টিক দাও
- Generate token ক্লিক করো
- টোকেনটা কপি করো — এটা আর দেখানো হবে না, তাই এখনই কপি করো!
পুশ করার সময় পাসওয়ার্ডের জায়গায় এই টোকেন পেস্ট করো।
টিপ: SSH Key সেটআপ করলে বারবার টোকেন দিতে হবে না। সেটা পরের চ্যাপ্টারে শিখবো!
পুশের পর গিটহাবে দেখো
পুশ হয়ে গেলে তোমার গিটহাব রিপোতে যাও। দেখবে তোমার সব ফাইল আর কমিট হিস্ট্রি অনলাইনে দেখা যাচ্ছে! 🎉
সাধারণ ওয়ার্কফ্লো
# কোনো চেইঞ্জ করো
echo "নতুন লাইন" >> hello.txt
# স্টেজ করো
git add .
# কমিট করো
git commit -m "hello.txt আপডেট"
# গিটহাবে পাঠাও
git push
কোড লেখো → add → commit → push — এটাই তোমার ডেইলি রুটিন!
SSH কী সেটআপ
SSH কি?
SSH (Secure Shell) হলো একটা সিকিউর কানেকশন। SSH Key সেটআপ করলে তোমাকে বারবার ইউজারনেম-পাসওয়ার্ড দিতে হবে না। একবার সেটআপ করলে গিটহাব তোমার কম্পিউটারকে চিনে নেবে।
কেন SSH ব্যবহার করবে?
- বারবার পাসওয়ার্ড/টোকেন দিতে হবে না
- বেশি সিকিউর
- একবার সেটআপ করলে চিরকাল কাজ করবে
ধাপ ১: SSH Key আছে কিনা চেক করো
ls -al ~/.ssh
যদি id_ed25519 আর id_ed25519.pub ফাইল দেখায়, তাহলে আগেই SSH Key আছে। না থাকলে পরের ধাপে যাও।
ধাপ ২: নতুন SSH Key তৈরি করো
ssh-keygen -t ed25519 -C "tomar-email@example.com"
এরপর কিছু প্রশ্ন করবে:
Enter file in which to save the key: (Enter চাপো)
Enter passphrase: (Enter চাপো, অথবা পাসওয়ার্ড দাও)
Enter same passphrase again: (আবার Enter চাপো)
ধাপ ৩: SSH Agent চালু করো
eval "$(ssh-agent -s)"
আউটপুট:
Agent pid 12345
ধাপ ৪: Key যোগ করো
ssh-add ~/.ssh/id_ed25519
ধাপ ৫: Public Key কপি করো
cat ~/.ssh/id_ed25519.pub
যে টেক্সটটা দেখাবে সেটা পুরোটা কপি করো।
Windows এ Git Bash ব্যবহার করলে:
clip < ~/.ssh/id_ed25519.pub
এটা সরাসরি ক্লিপবোর্ডে কপি হয়ে যাবে।
ধাপ ৬: গিটহাবে SSH Key যোগ করো
- GitHub → Settings → SSH and GPG keys
- New SSH key ক্লিক করো
- Title দাও (যেমন: “My Laptop”)
- Key ফিল্ডে কপি করা key টা পেস্ট করো
- Add SSH key ক্লিক করো
ধাপ ৭: কানেকশন টেস্ট করো
ssh -T git@github.com
আউটপুট:
Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.
এই মেসেজ আসলে SSH ঠিকমতো কাজ করছে! 🎉
SSH URL ব্যবহার করা
এখন থেকে গিটহাব রিপো কানেক্ট করার সময় HTTPS এর বদলে SSH URL ব্যবহার করো:
# HTTPS (আগের মতো)
git remote add origin https://github.com/username/repo.git
# SSH (এখন থেকে এটা ব্যবহার করো)
git remote add origin git@github.com:username/repo.git
আগে HTTPS দিয়ে কানেক্ট করে থাকলে SSH তে বদলাও:
git remote set-url origin git@github.com:username/repo.git
টিপ: SSH সেটআপ করা একটু ঝামেলা, কিন্তু একবার করলে জীবন অনেক সহজ হয়ে যাবে!
গিটহাব থেকে পুল
পুল কি?
পুশ হলো লোকাল থেকে গিটহাবে পাঠানো, আর পুল হলো গিটহাব থেকে লোকালে আনা। ধরো তুমি অফিসে কোড পুশ করেছো, এখন বাসায় এসে সেই আপডেটেড কোড নিতে চাও — তখন পুল করবে।
কখন পুল দরকার?
- তুমি অন্য কম্পিউটার থেকে কাজ করেছো
- তোমার টিমের কেউ কোড পুশ করেছে
- গিটহাবে সরাসরি কোনো ফাইল এডিট করেছো
কিভাবে পুল করবে?
git pull
ব্যস! এটাই যথেষ্ট (যদি upstream আগেই সেট করা থাকে)।
ফুল কমান্ড:
git pull origin main
পুল করলে কি হয়?
পুল আসলে দুইটা কাজ করে:
- fetch = গিটহাব থেকে নতুন ডাটা ডাউনলোড করে
- merge = ডাউনলোড করা ডাটা তোমার লোকাল কোডের সাথে মেলায়
git pull = git fetch + git merge
উদাহরণ
ধরো তোমার টিমের কেউ গিটহাবে একটা নতুন ফাইল পুশ করেছে। তুমি পুল করলে:
git pull
আউটপুট:
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
From github.com:username/my-project
a1b2c3d..d4e5f6g main -> origin/main
Updating a1b2c3d..d4e5f6g
Fast-forward
new-feature.js | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 new-feature.js
নতুন ফাইলটা তোমার কম্পিউটারে চলে এসেছে!
পুলে কনফ্লিক্ট
তুমি আর তোমার টিমমেট যদি একই ফাইলের একই জায়গায় চেইঞ্জ করো, তাহলে পুল করার সময় কনফ্লিক্ট হতে পারে। সমাধান একই — ম্যানুয়ালি ফাইল এডিট করো, তারপর কমিট করো।
ভালো অভ্যাস
কাজ শুরু করার আগে সবসময় পুল করো:
git pull
# কাজ শুরু করো
# ...
# কাজ শেষ
git add .
git commit -m "নতুন কাজ"
git push
টিপ: প্রতিদিন কাজ শুরুর আগে
git pullদাও। এতে তোমার কোড আপ-টু-ডেট থাকবে আর কনফ্লিক্ট কম হবে!
নিজের প্রোজেক্টে পুল রিকোয়েস্ট
পুল রিকোয়েস্ট (PR) কি?
পুল রিকোয়েস্ট হলো গিটহাবে কোড রিভিউ করার সিস্টেম। তুমি একটা ব্রাঞ্চে কাজ করেছো, এখন সেটা main ব্রাঞ্চে মার্জ করতে চাও। সরাসরি মার্জ না করে যদি আগে দেখতে চাও কি কি চেইঞ্জ হয়েছে, বা অন্য কাউকে রিভিউ করাতে চাও — তখন পুল রিকোয়েস্ট খোলো।
কেন PR ব্যবহার করবে?
- কোড রিভিউ — মার্জ করার আগে চেইঞ্জগুলো দেখতে পারো
- ডিসকাশন — কমেন্ট করে আলোচনা করতে পারো
- রেকর্ড — কি কেন চেইঞ্জ হয়েছে তার হিস্ট্রি থাকে
- টিমওয়ার্ক — প্রফেশনাল টিমে এটাই স্ট্যান্ডার্ড
কিভাবে PR করবে?
ধাপ ১: নতুন ব্রাঞ্চে কাজ করো
git switch -c feature/contact-page
# কিছু কাজ করো
echo "<h1>Contact</h1>" > contact.html
git add .
git commit -m "কন্ট্যাক্ট পেজ তৈরি করেছি"
ধাপ ২: ব্রাঞ্চটা গিটহাবে পুশ করো
git push -u origin feature/contact-page
ধাপ ৩: গিটহাবে PR খোলো
- গিটহাবে তোমার রিপোতে যাও
- একটা হলুদ রঙের ব্যানার দেখবে — “Compare & pull request” বাটন
- ক্লিক করো
- Title দাও (যেমন: “কন্ট্যাক্ট পেজ যোগ করেছি”)
- Description এ বিস্তারিত লেখো কি কি করেছো
- Create pull request ক্লিক করো
ধাপ ৪: রিভিউ করো
PR খোলার পর:
- Files changed ট্যাবে সব চেইঞ্জ দেখতে পারবে
- কোনো লাইনে ক্লিক করে কমেন্ট করতে পারবে
- সব ঠিক থাকলে Merge pull request ক্লিক করো
ধাপ ৫: মার্জ করো
- Merge pull request ক্লিক করো
- Confirm merge ক্লিক করো
- চাইলে Delete branch ক্লিক করে পুরানো ব্রাঞ্চ ডিলিট করো
মার্জের পর লোকালে আপডেট
git switch main
git pull
এখন তোমার লোকাল main ব্রাঞ্চেও নতুন চেইঞ্জগুলো চলে আসবে।
টিপ: একা কাজ করলেও PR ব্যবহার করা ভালো অভ্যাস। এতে তোমার কোড চেইঞ্জের একটা সুন্দর হিস্ট্রি থাকে!
গিটহাব থেকে প্রোজেক্ট ক্লোন
ক্লোন কি?
ক্লোন মানে গিটহাবের কোনো প্রোজেক্ট কপি করে তোমার কম্পিউটারে নিয়ে আসা। পুরো প্রোজেক্ট — সব ফাইল, সব কমিট হিস্ট্রি, সবকিছু চলে আসবে।
কখন ক্লোন করবে?
- অন্য কারো প্রোজেক্ট দেখতে চাও
- নিজের প্রোজেক্ট অন্য কম্পিউটারে আনতে চাও
- কোনো ওপেন সোর্স প্রোজেক্টে কন্ট্রিবিউট করতে চাও
- কোনো টিউটোরিয়ালের কোড ডাউনলোড করতে চাও
কিভাবে ক্লোন করবে?
ধাপ ১: গিটহাবে রিপোর URL কপি করো
- গিটহাবে রিপোতে যাও
- সবুজ Code বাটনে ক্লিক করো
- HTTPS বা SSH URL কপি করো
ধাপ ২: ক্লোন করো
git clone https://github.com/username/repo-name.git
SSH দিয়ে:
git clone git@github.com:username/repo-name.git
ধাপ ৩: ফোল্ডারে ঢোকো
cd repo-name
ব্যস! পুরো প্রোজেক্ট তোমার কম্পিউটারে চলে এসেছে!
ক্লোন vs ডাউনলোড ZIP
গিটহাব থেকে ZIP ডাউনলোডও করা যায়, কিন্তু ক্লোন অনেক ভালো:
| ক্লোন | ZIP ডাউনলোড | |
|---|---|---|
| গিট হিস্ট্রি | থাকে ✅ | থাকে না ❌ |
| পুশ/পুল করা যায় | হ্যাঁ ✅ | না ❌ |
| ব্রাঞ্চ পাওয়া যায় | হ্যাঁ ✅ | না ❌ |
| আপডেট পাওয়া যায় | git pull দিলেই ✅ | আবার ডাউনলোড লাগবে ❌ |
অন্য নামে ক্লোন
ডিফল্টে রিপোর নামে ফোল্ডার তৈরি হয়। অন্য নামে চাইলে:
git clone https://github.com/username/repo-name.git my-custom-name
নির্দিষ্ট ব্রাঞ্চ ক্লোন
git clone -b develop https://github.com/username/repo-name.git
উদাহরণ
ধরো তুমি এই বইয়ের রিপো ক্লোন করতে চাও:
git clone https://github.com/tanvir-cpp/learn-git-bangla.git
cd learn-git-bangla
এখন তুমি পুরো বইটার সোর্স কোড তোমার কম্পিউটারে পাবে!
টিপ: ক্লোন করার সময় তুমি যেই ফোল্ডারে আছো, সেখানে একটা নতুন ফোল্ডার তৈরি হবে। তাই আগে ঠিক করো কোথায় ক্লোন করতে চাও।
অন্য প্রোজেক্টে পুল রিকোয়েস্ট
অন্যের প্রোজেক্টে কন্ট্রিবিউট
তুমি চাইলে অন্য কারো প্রোজেক্টেও কন্ট্রিবিউট করতে পারো! এটাই ওপেন সোর্সের মজা। কিন্তু অন্যের রিপোতে তুমি সরাসরি পুশ করতে পারবে না। তাহলে কিভাবে করবে?
ফ্লো টা কেমন?
অন্যের রিপো ──Fork──▶ তোমার কপি ──Clone──▶ লোকাল
│
চেইঞ্জ করো
│
Push করো
│
Pull Request পাঠাও
│
◀── মেইনটেইনার রিভিউ করে মার্জ করে
স্টেপ বাই স্টেপ
ধাপ ১: ফর্ক করো
- যে রিপোতে কন্ট্রিবিউট করতে চাও, সেখানে যাও
- ডান পাশে উপরে Fork বাটনে ক্লিক করো
- এটা তোমার অ্যাকাউন্টে ঐ রিপোর একটা কপি তৈরি করবে
ধাপ ২: ফর্ক করা রিপো ক্লোন করো
git clone https://github.com/TOMAR-USERNAME/forked-repo.git
cd forked-repo
মনে রাখো — তোমার ফর্ক করা রিপো ক্লোন করবে, মূল রিপো না!
ধাপ ৩: নতুন ব্রাঞ্চ তৈরি করো
git switch -c fix/typo-in-readme
গুরুত্বপূর্ণ: সরাসরি
mainব্রাঞ্চে কাজ করো না। সবসময় নতুন ব্রাঞ্চে কাজ করো।
ধাপ ৪: চেইঞ্জ করো
# কোনো ফাইল এডিট করো
# তারপর:
git add .
git commit -m "README তে টাইপো ফিক্স করেছি"
ধাপ ৫: পুশ করো
git push origin fix/typo-in-readme
ধাপ ৬: পুল রিকোয়েস্ট পাঠাও
- তোমার ফর্ক করা রিপোতে যাও (গিটহাবে)
- Compare & pull request বাটন দেখবে
- ক্লিক করো
- Title আর Description ভালো করে লেখো
- Create pull request ক্লিক করো
ভালো PR কেমন হয়?
Title
Fix: README তে টাইপো সংশোধন
Description
## কি চেইঞ্জ করেছি?
README.md ফাইলে "instlation" শব্দটা "installation" এ পরিবর্তন করেছি।
## কেন?
টাইপো ছিলো, ঠিক করেছি।
PR এর পর কি হয়?
- প্রোজেক্টের মেইনটেইনার তোমার PR দেখবে
- ফিডব্যাক দিতে পারে — তখন সেই অনুযায়ী চেইঞ্জ করো
- সব ঠিক থাকলে মার্জ করবে
- তুমি এখন একজন ওপেন সোর্স কন্ট্রিবিউটর! 🎉
টিপ: প্রথমে ছোট ছোট কন্ট্রিবিউশন দিয়ে শুরু করো — টাইপো ফিক্স, ডকুমেন্টেশন আপডেট। এতে কনফিডেন্স বাড়বে!
প্রোজেক্ট খোঁজা
কোথায় খুঁজবে?
ওপেন সোর্সে কন্ট্রিবিউট করতে চাও, কিন্তু কোন প্রোজেক্টে করবে বুঝতে পারছো না? চিন্তা নেই! চলো দেখি কোথায় খুঁজবে।
১. GitHub Explore
github.com/explore — এখানে গিটহাব নিজেই ট্রেন্ডিং আর জনপ্রিয় প্রোজেক্টগুলো দেখায়।
২. Good First Issues
নতুনদের জন্য সবচেয়ে ভালো জায়গা! অনেক প্রোজেক্টে good first issue লেবেল দেওয়া থাকে — মানে এই ইস্যুগুলো নতুনদের জন্য সহজ।
খোঁজার উপায়:
- github.com/topics/good-first-issue
- গিটহাবে সার্চ করো:
label:"good first issue" is:open
৩. First Timers Only
firsttimersonly.com — এই সাইটে নতুনদের জন্য রিসোর্স আর প্রোজেক্ট লিস্ট আছে।
৪. Up For Grabs
up-for-grabs.net — নতুন কন্ট্রিবিউটরদের জন্য ইস্যু খোঁজার সাইট।
কেমন প্রোজেক্ট বাছাই করবে?
নতুন হলে
- ছোট প্রোজেক্ট দিয়ে শুরু করো
- ডকুমেন্টেশন আপডেট, টাইপো ফিক্স — এগুলো দিয়ে শুরু করো
- যেসব প্রোজেক্টের
CONTRIBUTING.mdফাইল আছে, সেগুলো ভালো। এই ফাইলে বলা থাকে কিভাবে কন্ট্রিবিউট করবে।
একটু অভিজ্ঞ হলে
- তুমি যেই ল্যাংগুয়েজ/ফ্রেমওয়ার্ক ব্যবহার করো, সেগুলোর প্রোজেক্ট খোঁজো
- বাগ ফিক্স করো
- নতুন ফিচার যোগ করো
প্রোজেক্ট পছন্দ করার আগে দেখো
| বিষয় | কেন দেখবে |
|---|---|
| Stars ⭐ | জনপ্রিয়তা বোঝায় |
| Last commit | সম্প্রতি আপডেট হয়েছে কিনা |
| Issues | ওপেন ইস্যু আছে কিনা |
CONTRIBUTING.md | কন্ট্রিবিউশন গাইড আছে কিনা |
| License | ওপেন সোর্স লাইসেন্স আছে কিনা |
মনে রাখো
ওপেন সোর্সে কন্ট্রিবিউট করতে তোমাকে এক্সপার্ট হতে হবে না। সবাই নতুন থেকেই শুরু করে। একটা ছোট টাইপো ফিক্সও একটা ভ্যালুয়েবল কন্ট্রিবিউশন!
পরের পেজে শিখবো — প্রোজেক্ট ফর্ক কিভাবে করবে।
প্রোজেক্ট ফর্ক
ফর্ক কি?
ফর্ক মানে অন্য কারো প্রোজেক্টের একটা কপি তোমার গিটহাব অ্যাকাউন্টে নিয়ে আসা। এটা ক্লোনের মতো, কিন্তু গিটহাবের মধ্যেই হয়।
ধরো তুমি একটা রান্নার রেসিপি বই থেকে একটা রেসিপি কপি করলে নিজের খাতায়। এখন তুমি চাইলে সেটায় নিজের মতো করে মশলা বদলাতে পারো — আসল বইয়ের কিছু হবে না!
কিভাবে ফর্ক করবে?
ধাপ ১: রিপোতে যাও
যে প্রোজেক্টে কন্ট্রিবিউট করতে চাও, তার গিটহাব পেজে যাও।
ধাপ ২: Fork বাটনে ক্লিক করো
পেজের উপরে ডান পাশে Fork বাটন আছে। ক্লিক করো।
ধাপ ৩: রিপো সেটিংস
- Owner = তোমার অ্যাকাউন্ট
- Repository name = ডিফল্ট রাখো (চাইলে বদলাতে পারো)
- Create fork ক্লিক করো
ব্যস! এখন তোমার অ্যাকাউন্টে ঐ প্রোজেক্টের একটা কপি আছে!
ফর্কের পর কি করবে?
# তোমার ফর্ক ক্লোন করো
git clone https://github.com/TOMAR-USERNAME/project-name.git
# ফোল্ডারে ঢোকো
cd project-name
# আসল রিপো upstream হিসেবে যোগ করো
git remote add upstream https://github.com/ORIGINAL-OWNER/project-name.git
upstream কেন দরকার?
আসল প্রোজেক্টে নতুন চেইঞ্জ হলে তোমার ফর্কে সেটা আনতে হবে। এজন্য আসল রিপোকে upstream হিসেবে রাখো।
ফর্ক আপডেট রাখা
আসল রিপোতে নতুন কমিট হলে তোমার ফর্ক পুরানো হয়ে যায়। আপডেট করতে:
# upstream থেকে নতুন চেইঞ্জ আনো
git fetch upstream
# main ব্রাঞ্চে যাও
git switch main
# upstream এর সাথে মিলাও
git merge upstream/main
# তোমার ফর্কে পুশ করো
git push
ফর্ক vs ক্লোন
| ফর্ক | ক্লোন | |
|---|---|---|
| কোথায় হয় | গিটহাবে | তোমার কম্পিউটারে |
| কার রিপো | তোমার (কপি) | যেকারো |
| পুশ করা যায় | হ্যাঁ (নিজের ফর্কে) | হ্যাঁ (যদি পারমিশন থাকে) |
| PR পাঠানো যায় | হ্যাঁ | না (ফর্ক ছাড়া) |
মনে রাখো: অন্যের প্রোজেক্টে কন্ট্রিবিউট করতে হলে — ফর্ক করো → ক্লোন করো → চেইঞ্জ করো → পুশ করো → PR পাঠাও!
কন্ট্রিবিউট
চলো একটা রিয়েল কন্ট্রিবিউশন করি!
এতক্ষণে তুমি শিখেছো — ফর্ক করা, ক্লোন করা, ব্রাঞ্চ তৈরি করা। এবার পুরো ফ্লোটা একসাথে প্র্যাকটিস করি একটা রিয়েল উদাহরণ দিয়ে।
পুরো ফ্লো: শুরু থেকে শেষ
১. প্রোজেক্ট ফর্ক করো
গিটহাবে যে প্রোজেক্টে কন্ট্রিবিউট করতে চাও, সেটা ফর্ক করো।
২. ক্লোন করো
git clone https://github.com/tomar-username/project-name.git
cd project-name
৩. Upstream সেট করো
git remote add upstream https://github.com/original-owner/project-name.git
৪. ফর্ক আপডেট করো
git fetch upstream
git switch main
git merge upstream/main
৫. নতুন ব্রাঞ্চ তৈরি করো
git switch -c fix/improve-readme
৬. চেইঞ্জ করো
ফাইল এডিট করো। ধরো README এ একটা টাইপো ঠিক করলে।
৭. কমিট করো
git add .
git commit -m "README তে বানান ভুল ঠিক করেছি"
৮. পুশ করো
git push origin fix/improve-readme
৯. PR তৈরি করো
গিটহাবে যাও → Compare & pull request → PR তৈরি করো।
PR তে কি লিখবে?
একটা ভালো PR এর উদাহরণ:
## কি চেইঞ্জ করেছি?
README.md ফাইলে ইন্সটলেশন সেকশনে বানান ভুল ঠিক করেছি।
## কেন?
"instlation" লেখা ছিলো, "installation" হওয়া উচিত।
## স্ক্রিনশট
প্রযোজ্য না।
## টেস্ট
ডকুমেন্টেশন চেইঞ্জ, কোনো টেস্ট দরকার নেই।
PR তৈরির পর
- ধৈর্য ধরো — মেইনটেইনার ব্যস্ত থাকতে পারে
- ফিডব্যাক দিলে সেই অনুযায়ী আপডেট করো:
# একই ব্রাঞ্চে চেইঞ্জ করো
git add .
git commit -m "রিভিউ ফিডব্যাক অনুযায়ী আপডেট"
git push
নতুন পুশ করলে PR আপনাআপনি আপডেট হয়ে যাবে।
কন্ট্রিবিউশনের নিয়ম
প্রতিটা প্রোজেক্টের কিছু নিয়ম থাকে। কন্ট্রিবিউট করার আগে পড়ো:
CONTRIBUTING.md— কিভাবে কন্ট্রিবিউট করবেCODE_OF_CONDUCT.md— আচরণবিধিREADME.md— প্রোজেক্ট সম্পর্কে জানো
টিপ: বিনয়ী থাকো, ধৈর্য রাখো, আর মনে রাখো — তুমি কারো প্রোজেক্টে সাহায্য করতে এসেছো। এটা একটা সুন্দর কাজ!
এখনো শেষ হয়নি
গিটের যাত্রা চলতেই থাকে
তুমি এতক্ষণে গিট আর গিটহাবের বেসিক থেকে শুরু করে কন্ট্রিবিউশন পর্যন্ত শিখে ফেলেছো। কিন্তু শেখার এখনো অনেক বাকি আছে!
এখন পর্যন্ত তুমি যা শিখেছো
- ✅ গিট কি এবং কেন দরকার
- ✅ গিট ইন্সটল ও কনফিগার করা
- ✅ রিপো তৈরি করা
- ✅ add, commit, status, log — বেসিক কমান্ড
- ✅ ব্রাঞ্চিং ও মার্জিং
- ✅ গিটহাবে পুশ ও পুল
- ✅ SSH সেটআপ
- ✅ পুল রিকোয়েস্ট
- ✅ ওপেন সোর্সে কন্ট্রিবিউট
এর পরে কি শিখবে?
পরের সেকশনে আমরা গিটের আরো কিছু পাওয়ারফুল ফিচার শিখবো:
- git restore — ভুল করে ফেলা চেইঞ্জ ফিরিয়ে আনা
- git stash — অসম্পূর্ণ কাজ সাময়িকভাবে লুকিয়ে রাখা
- git reset — কমিট বাতিল করা
- git revert — নিরাপদে কমিট বাতিল করা
- git rebase — কমিট হিস্ট্রি পরিষ্কার করা
- git squash — অনেকগুলো কমিটকে একটাতে মেলানো
প্র্যাকটিস করো!
শুধু পড়ে লাভ নেই — প্র্যাকটিস করো! কিছু আইডিয়া:
- নিজের একটা প্রোজেক্ট বানাও — যেকোনো ছোট প্রোজেক্ট, গিটে ট্র্যাক করো
- প্রতিদিন কমিট করো — অভ্যাস তৈরি করো
- একটা ওপেন সোর্স প্রোজেক্টে কন্ট্রিবিউট করো — ছোট কিছু দিয়ে শুরু করো
- বন্ধুদের সাথে কলাবোরেট করো — একটা রিপো শেয়ার করে একসাথে কাজ করো
মনে রাখো: গিট শেখা একটা journey, destination না। তুমি যত বেশি ব্যবহার করবে, তত ভালো হবে!
সেলিব্রেট 🎉
তুমি কন্ট্রিবিউটর!
যদি তুমি সত্যিই কোনো ওপেন সোর্স প্রোজেক্টে PR পাঠিয়ে থাকো এবং সেটা মার্জ হয়ে থাকে — তাহলে অভিনন্দন! তুমি এখন একজন ওপেন সোর্স কন্ট্রিবিউটর! 🎊
তোমার প্রোফাইলে দেখাবে
গিটহাব প্রোফাইলে তোমার কন্ট্রিবিউশন গ্রাফে সবুজ বক্স দেখাবে। যত বেশি কন্ট্রিবিউট করবে, তত বেশি সবুজ!
এখন কি করবে?
১. আরো কন্ট্রিবিউট করো
প্রথমটা সবচেয়ে কঠিন ছিলো। এখন থেকে আরো সহজ হবে। নতুন নতুন প্রোজেক্ট খোঁজো, ইস্যু সলভ করো।
২. নিজের প্রোজেক্ট শেয়ার করো
তোমার নিজের কোনো প্রোজেক্ট থাকলে গিটহাবে পুশ করো। অন্যরাও কন্ট্রিবিউট করতে পারবে।
৩. Hacktoberfest এ অংশ নাও
প্রতি অক্টোবরে Hacktoberfest হয়। ৪টা PR করলে ফ্রি টি-শার্ট পাও! এটা ওপেন সোর্সে শুরু করার দারুণ একটা সুযোগ।
৪. গিটহাব প্রোফাইল সাজাও
- একটা ভালো README বানাও তোমার প্রোফাইলে
- বেস্ট প্রোজেক্টগুলো পিন করো
- কন্ট্রিবিউশন স্ট্রিক ধরে রাখো
কিছু অনুপ্রেরণামূলক কথা
“Every expert was once a beginner.”
তুমি আজকে যেখানে আছো, সেখান থেকেই শুরু করো। প্রতিদিন একটু একটু করে শেখো। একদিন দেখবে — তুমি নিজেই একটা বড় প্রোজেক্ট মেইনটেইন করছো, নতুনদের সাহায্য করছো।
গিটের দুনিয়ায় স্বাগতম! চলো এবার অ্যাডভান্সড গিট শিখি! 🚀
গিট রিস্টোর
কখন দরকার?
ধরো তুমি একটা ফাইলে অনেক কিছু চেইঞ্জ করেছো, কিন্তু এখন মনে হচ্ছে — “না, আগেরটাই ভালো ছিলো।” কমিট করোনি এখনো। তাহলে কি করবে? ফাইলটাকে আগের অবস্থায় ফিরিয়ে নিতে চাও।
এই কাজেই git restore ব্যবহার হয়!
আনস্টেজড চেইঞ্জ বাতিল করা
ফাইলে চেইঞ্জ করেছো কিন্তু git add করোনি:
# hello.txt এ কিছু চেইঞ্জ করেছো
echo "ভুল কিছু লিখে ফেলেছি" >> hello.txt
# আগের অবস্থায় ফিরিয়ে নাও
git restore hello.txt
ব্যস! ফাইলটা শেষ কমিটের অবস্থায় ফিরে গেছে। তোমার চেইঞ্জ মুছে গেছে।
সাবধান:
git restoreকরলে চেইঞ্জগুলো ফিরিয়ে আনার কোনো উপায় নেই! তাই নিশ্চিত হয়ে ব্যবহার করো।
স্টেজড চেইঞ্জ আনস্টেজ করা
ফাইল git add করে ফেলেছো, কিন্তু এখন স্টেজিং থেকে বের করতে চাও:
git add hello.txt
# ওহ, ভুল করে add করে ফেলেছি!
git restore --staged hello.txt
এটা ফাইলটাকে স্টেজিং এরিয়া থেকে বের করবে, কিন্তু তোমার চেইঞ্জ ফাইলে থাকবে।
সব ফাইলের চেইঞ্জ বাতিল
সব ফাইলের আনস্টেজড চেইঞ্জ বাতিল করতে:
git restore .
নির্দিষ্ট কমিট থেকে ফাইল আনা
ধরো তুমি ৩ কমিট আগের ভার্শনের hello.txt চাও:
git restore --source=HEAD~3 hello.txt
এটা ৩ কমিট আগের hello.txt নিয়ে আসবে।
restore vs checkout
আগে ফাইল রিস্টোরের জন্য git checkout -- filename ব্যবহার হতো। git restore হলো নতুন, বেশি ক্লিয়ার কমান্ড।
| কাজ | পুরানো | নতুন |
|---|---|---|
| চেইঞ্জ বাতিল | git checkout -- file.txt | git restore file.txt |
| আনস্টেজ করা | git reset HEAD file.txt | git restore --staged file.txt |
মনে রাখো
git restore file.txt → চেইঞ্জ বাতিল (আনস্টেজড)
git restore --staged file.txt → স্টেজ থেকে বের করো
git restore . → সব চেইঞ্জ বাতিল
টিপ:
git restoreব্যবহারের আগে সবসময়git statusআরgit diffদিয়ে চেক করো — কি বাতিল হচ্ছে!
গিট স্ট্যাশ
স্ট্যাশ কি?
ধরো তুমি একটা ফিচারে কাজ করছো, অর্ধেক হয়েছে। হঠাৎ বস বললো — “ভাই, একটা জরুরি বাগ ফিক্স করো!” এখন তুমি কি করবে? অর্ধেক কাজ কমিট করতে চাও না, আবার ফেলে দিতেও চাও না।
এখানেই git stash কাজে আসে! স্ট্যাশ মানে তোমার অসম্পূর্ণ কাজ একটা জায়গায় লুকিয়ে রাখা। পরে যখন দরকার, ফিরিয়ে আনো।
কিভাবে ব্যবহার করবে?
স্ট্যাশ করা (লুকিয়ে রাখা)
# অর্ধেক কাজ হয়েছে, এখন স্ট্যাশ করো
git stash
আউটপুট:
Saved working directory and index state WIP on main: a1b2c3d শেষ কমিট মেসেজ
এখন git status দিলে দেখবে — সব ক্লিন! তোমার চেইঞ্জগুলো লুকিয়ে গেছে।
জরুরি কাজ করো
# অন্য ব্রাঞ্চে যাও
git switch fix/urgent-bug
# বাগ ফিক্স করো
git add .
git commit -m "জরুরি বাগ ফিক্স"
# main এ ফিরে যাও
git switch main
স্ট্যাশ ফিরিয়ে আনো
git stash pop
ব্যস! তোমার আগের অসম্পূর্ণ কাজ ফিরে এসেছে! এখন সেখান থেকে কাজ চালিয়ে যেতে পারো।
স্ট্যাশের আরো কমান্ড
মেসেজসহ স্ট্যাশ
git stash save "ডার্ক মোড অর্ধেক হয়েছে"
স্ট্যাশ লিস্ট দেখা
git stash list
আউটপুট:
stash@{0}: On main: ডার্ক মোড অর্ধেক হয়েছে
stash@{1}: WIP on main: a1b2c3d পুরানো কাজ
নির্দিষ্ট স্ট্যাশ ফিরিয়ে আনা
git stash apply stash@{1}
pop vs apply
git stash pop= ফিরিয়ে আনে এবং স্ট্যাশ লিস্ট থেকে মুছে দেয়git stash apply= ফিরিয়ে আনে কিন্তু স্ট্যাশ লিস্টে রেখে দেয়
স্ট্যাশ ডিলিট করা
# একটা স্ট্যাশ ডিলিট
git stash drop stash@{0}
# সব স্ট্যাশ ডিলিট
git stash clear
সারাংশ
| কমান্ড | কি করে |
|---|---|
git stash | চেইঞ্জ লুকিয়ে রাখে |
git stash pop | ফিরিয়ে আনে ও মুছে দেয় |
git stash apply | ফিরিয়ে আনে, মুছে না |
git stash list | সব স্ট্যাশ দেখায় |
git stash drop | স্ট্যাশ ডিলিট করে |
টিপ: স্ট্যাশ হলো তোমার পকেট — অসম্পূর্ণ কাজ পকেটে রাখো, জরুরি কাজ সারো, তারপর পকেট থেকে বের করো!
গিট রিসেট
রিসেট কি?
git reset দিয়ে তুমি কমিট হিস্ট্রি থেকে কমিট মুছে ফেলতে পারো। মনে করো — “শেষ কমিটটা ভুল হয়ে গেছে, বাতিল করতে চাই।”
সাবধান: রিসেট হিস্ট্রি চেইঞ্জ করে। গিটহাবে পুশ করার পর রিসেট করা ঝুঁকিপূর্ণ!
তিন ধরনের রিসেট
১. –soft (সবচেয়ে নিরাপদ)
git reset --soft HEAD~1
কি হবে:
- শেষ কমিটটা বাতিল হবে
- কিন্তু ফাইলের চেইঞ্জ স্টেজিং এরিয়াতেই থাকবে
- মানে তুমি চাইলে নতুন মেসেজ দিয়ে আবার কমিট করতে পারো
২. –mixed (ডিফল্ট)
git reset HEAD~1
বা:
git reset --mixed HEAD~1
কি হবে:
- শেষ কমিটটা বাতিল হবে
- ফাইলের চেইঞ্জ ওয়ার্কিং ডিরেক্টরিতে থাকবে (আনস্টেজড)
git addথেকে আবার শুরু করতে হবে
৩. –hard (সবচেয়ে বিপজ্জনক!)
git reset --hard HEAD~1
কি হবে:
- শেষ কমিটটা বাতিল হবে
- ফাইলের চেইঞ্জও মুছে যাবে!
- ফিরিয়ে আনার কোনো সহজ উপায় নেই!
HEAD~1 মানে কি?
HEAD= তুমি এখন যেখানে আছো (শেষ কমিট)HEAD~1= শেষ কমিটের ১টা আগেHEAD~2= শেষ কমিটের ২টা আগেHEAD~3= শেষ কমিটের ৩টা আগে
উদাহরণ
# হিস্ট্রি দেখো
git log --oneline
# a1b2c3d (HEAD -> main) তৃতীয় কমিট
# b2c3d4e দ্বিতীয় কমিট
# c3d4e5f প্রথম কমিট
# শেষ কমিট soft reset (চেইঞ্জ স্টেজড থাকবে)
git reset --soft HEAD~1
# হিস্ট্রি আবার দেখো
git log --oneline
# b2c3d4e (HEAD -> main) দ্বিতীয় কমিট
# c3d4e5f প্রথম কমিট
তৃতীয় কমিটটা গায়েব! কিন্তু ফাইলের চেইঞ্জ এখনো আছে।
কোন রিসেট কখন ব্যবহার করবে?
| রিসেট | চেইঞ্জ কোথায় থাকে | কখন ব্যবহার করবে |
|---|---|---|
--soft | স্টেজিং এরিয়াতে | কমিট মেসেজ বদলাতে চাও |
--mixed | ওয়ার্কিং ডিরেক্টরিতে | কমিট বাতিল করতে চাও, চেইঞ্জ রাখতে চাও |
--hard | সব মুছে যায় | সবকিছু বাতিল করতে চাও |
টিপ: শুরুতে
--softব্যবহার করো।--hardশুধু তখনই ব্যবহার করো যখন ১০০% নিশ্চিত চেইঞ্জগুলো আর দরকার নেই!
গিট রিভার্ট
রিভার্ট কি?
git revert দিয়ে তুমি কোনো কমিটের চেইঞ্জ বাতিল করতে পারো — কিন্তু হিস্ট্রি মুছে না! এটা একটা নতুন কমিট তৈরি করে যেটা আগের কমিটের উল্টো কাজ করে।
reset vs revert
| reset | revert | |
|---|---|---|
| হিস্ট্রি | মুছে ফেলে ❌ | রেখে দেয় ✅ |
| নতুন কমিট | না | হ্যাঁ |
| পুশ করার পর | ঝুঁকিপূর্ণ ⚠️ | নিরাপদ ✅ |
| টিমে কাজ | সমস্যা হতে পারে | সমস্যা হবে না |
সহজ কথায়:
reset= সময়ে পিছনে যাওয়া (হিস্ট্রি মুছে যায়)revert= ভুলটা ঠিক করে নতুন কমিট করা (হিস্ট্রি থাকে)
কিভাবে ব্যবহার করবে?
# হিস্ট্রি দেখো
git log --oneline
# a1b2c3d (HEAD -> main) বাগওয়ালা কমিট
# b2c3d4e ভালো কমিট
# c3d4e5f প্রথম কমিট
# শেষ কমিট রিভার্ট করো
git revert HEAD
গিট একটা এডিটর খুলবে কমিট মেসেজের জন্য। ডিফল্ট মেসেজ রাখতে পারো, অথবা বদলাতে পারো। সেভ করে বেরিয়ে এসো।
আউটপুট:
[main d5e6f7g] Revert "বাগওয়ালা কমিট"
1 file changed, 1 deletion(-)
এখন হিস্ট্রি দেখো:
git log --oneline
# d5e6f7g (HEAD -> main) Revert "বাগওয়ালা কমিট"
# a1b2c3d বাগওয়ালা কমিট
# b2c3d4e ভালো কমিট
# c3d4e5f প্রথম কমিট
দেখো — পুরানো কমিট হিস্ট্রিতে আছে, কিন্তু তার চেইঞ্জ বাতিল হয়ে গেছে!
নির্দিষ্ট কমিট রিভার্ট
শেষেরটা না, মাঝখানের কোনো কমিট রিভার্ট করতে:
git revert b2c3d4e
মেসেজ ছাড়া রিভার্ট
এডিটর না খোলে মেসেজ দিতে:
git revert HEAD --no-edit
কখন revert ব্যবহার করবে?
- কোড গিটহাবে পুশ করার পরে কমিট বাতিল করতে চাইলে
- টিমে কাজ করলে
- হিস্ট্রি সংরক্ষণ করতে চাইলে
কখন reset ব্যবহার করবে?
- কোড এখনো পুশ করোনি
- একা কাজ করছো
- হিস্ট্রি পরিষ্কার রাখতে চাও
টিপ: সন্দেহ থাকলে সবসময়
revertব্যবহার করো। এটা নিরাপদ!
গিট রিবেস
রিবেস কি?
git rebase দিয়ে তুমি তোমার ব্রাঞ্চের কমিটগুলো অন্য ব্রাঞ্চের উপর বসাতে পারো। শুনতে কনফিউজিং লাগছে? চলো উদাহরণ দিয়ে বুঝি।
merge vs rebase
ধরো তুমি feature ব্রাঞ্চে কাজ করছো, আর main ব্রাঞ্চেও নতুন কমিট হচ্ছে।
merge করলে
main: A ── B ── C ── D ── M (merge commit)
\ /
feature: E ── F ──
একটা বাড়তি merge commit তৈরি হয়। হিস্ট্রিতে ব্রাঞ্চিং দেখা যায়।
rebase করলে
main: A ── B ── C ── D ── E' ── F'
তোমার কমিটগুলো (E, F) main এর শেষে বসে যায়। হিস্ট্রি সোজা লাইনে থাকে, পরিষ্কার দেখায়!
কিভাবে রিবেস করবে?
ধাপ ১: feature ব্রাঞ্চে যাও
git switch feature
ধাপ ২: main এর উপর রিবেস করো
git rebase main
আউটপুট:
Successfully rebased and updated refs/heads/feature.
ধাপ ৩: main এ গিয়ে merge করো
git switch main
git merge feature
এটা একটা “fast-forward” merge হবে — মানে কোনো বাড়তি merge commit নেই!
রিবেসে কনফ্লিক্ট হলে
কনফ্লিক্ট হলে গিট থামবে আর বলবে কোথায় কনফ্লিক্ট:
# কনফ্লিক্ট ফিক্স করো (ফাইল এডিট করো)
# ফিক্স করা ফাইল স্টেজ করো
git add .
# রিবেস চালিয়ে যাও
git rebase --continue
রিবেস বাতিল করতে চাইলে:
git rebase --abort
রিবেসের সুবিধা
- হিস্ট্রি পরিষ্কার আর সোজা থাকে
- বাড়তি merge commit হয় না
git log --onelineদেখতে অনেক সুন্দর লাগে
রিবেসের সমস্যা
- হিস্ট্রি রিরাইট হয়
- পুশ করা কমিট রিবেস করলে ঝামেলা হতে পারে
সোনালী নিয়ম
কখনো পাবলিক/শেয়ার করা ব্রাঞ্চে রিবেস করো না!
মানে — যদি তোমার ব্রাঞ্চ গিটহাবে পুশ করে থাকো এবং অন্যরাও ঐ ব্রাঞ্চে কাজ করছে, তাহলে রিবেস করো না। মার্জ ব্যবহার করো।
রিবেস শুধু তোমার লোকাল ব্রাঞ্চে ব্যবহার করো যেটা এখনো পুশ করোনি।
কখন কোনটা ব্যবহার করবে?
| পরিস্থিতি | ব্যবহার করো |
|---|---|
| টিমে কাজ, শেয়ার করা ব্রাঞ্চ | merge |
| একা কাজ, লোকাল ব্রাঞ্চ | rebase |
| পরিষ্কার হিস্ট্রি চাও | rebase |
| নিরাপদে থাকতে চাও | merge |
টিপ: শুরুতে merge ব্যবহার করো। rebase তখনই ব্যবহার করো যখন তুমি পুরোপুরি বুঝতে পারবে কি হচ্ছে!
গিট স্কোয়াশিং
স্কোয়াশ কি?
স্কোয়াশ মানে অনেকগুলো ছোট ছোট কমিটকে একটা কমিটে মিলিয়ে দেওয়া। ধরো তুমি একটা ফিচার বানাতে গিয়ে ১০টা কমিট করেছো:
fix typo
add button
fix button color
oops forgot semicolon
fix again
now it works
final fix
really final
ok done
এই ১০টা কমিট main ব্রাঞ্চে গেলে হিস্ট্রি নোংরা দেখায়। স্কোয়াশ করলে এগুলো একটাতে মিলে যাবে:
কন্ট্যাক্ট পেজের বাটন তৈরি করেছি
অনেক পরিষ্কার!
কিভাবে স্কোয়াশ করবে?
উপায় ১: Interactive Rebase
শেষ ৩টা কমিট স্কোয়াশ করতে:
git rebase -i HEAD~3
একটা এডিটর খুলবে:
pick a1b2c3d প্রথম কমিট
pick b2c3d4e দ্বিতীয় কমিট
pick c3d4e5f তৃতীয় কমিট
দ্বিতীয় আর তৃতীয়টার pick বদলে squash (বা শুধু s) লেখো:
pick a1b2c3d প্রথম কমিট
squash b2c3d4e দ্বিতীয় কমিট
squash c3d4e5f তৃতীয় কমিট
সেভ করে বেরিয়ে আসো। তারপর আরেকটা এডিটর খুলবে কমিট মেসেজের জন্য। নতুন মেসেজ লেখো:
কন্ট্যাক্ট পেজ তৈরি করেছি (সব চেইঞ্জসহ)
সেভ করো। ব্যস!
উপায় ২: মার্জ করার সময় স্কোয়াশ
git switch main
git merge --squash feature-branch
git commit -m "ফিচার ব্রাঞ্চের সব চেইঞ্জ একসাথে"
এটা ফিচার ব্রাঞ্চের সব কমিটকে একটা কমিটে মেলাবে।
উপায় ৩: গিটহাবে PR মার্জ করার সময়
গিটহাবে PR মার্জ করার সময় “Squash and merge” অপশন আছে। এটা সিলেক্ট করলে সব কমিট স্কোয়াশ হয়ে একটা কমিটে মার্জ হবে।
কখন স্কোয়াশ করবে?
- ফিচার ব্রাঞ্চ main এ মার্জ করার আগে
- অনেকগুলো ছোট “fix” কমিট থাকলে
- হিস্ট্রি পরিষ্কার রাখতে চাইলে
কখন স্কোয়াশ করবে না?
- যখন প্রতিটা কমিট আলাদা আলাদা অর্থবহ কাজ
- যখন হিস্ট্রিতে প্রতিটা স্টেপ দেখতে চাও
সারাংশ
| কমান্ড | কি করে |
|---|---|
git rebase -i HEAD~N | শেষ N টা কমিট ইন্টার্যাক্টিভলি এডিট করা |
git merge --squash branch | ব্রাঞ্চের সব কমিট একটাতে মেলানো |
| GitHub “Squash and merge” | PR মার্জের সময় স্কোয়াশ |
টিপ: PR পাঠানোর আগে স্কোয়াশ করলে মেইনটেইনাররা খুশি হয়। পরিষ্কার হিস্ট্রি সবাই পছন্দ করে!
গিটহাব ব্যবহার করব না
গিটহাব ছাড়াও কি গিট চলে?
হ্যাঁ! গিট আর গিটহাব আলাদা জিনিস, মনে আছে তো? গিট হলো তোমার কম্পিউটারের সফটওয়্যার, আর গিটহাব হলো অনলাইন প্ল্যাটফর্ম। তুমি চাইলে শুধু গিট ব্যবহার করতে পারো, গিটহাব ছাড়াই।
কিভাবে শুধু গিট ব্যবহার করবে?
একদম আগের মতোই! সব কমান্ড কাজ করবে:
git init
git add .
git commit -m "কমিট মেসেজ"
git branch
git merge
git log
শুধু git push আর git pull কাজ করবে না, কারণ রিমোট রিপো নেই।
গিটহাবের বিকল্প কি কি?
গিটহাব পছন্দ না? কোনো সমস্যা নেই! আরো অনেক অপশন আছে:
১. GitLab
- gitlab.com
- ফ্রি প্রাইভেট রিপো
- বিল্ট-ইন CI/CD (অটো ডিপ্লয়মেন্ট)
- সেলফ-হোস্ট করা যায় (নিজের সার্ভারে চালানো)
২. Bitbucket
- bitbucket.org
- Atlassian এর প্রোডাক্ট (Jira, Trello এর কোম্পানি)
- Jira এর সাথে দারুণ ইন্টিগ্রেশন
- ছোট টিমের জন্য ফ্রি
৩. Codeberg
- codeberg.org
- ওপেন সোর্স প্ল্যাটফর্ম
- প্রাইভেসি ফোকাসড
- কমিউনিটি চালিত
৪. নিজের সার্ভার
তুমি চাইলে নিজের সার্ভারে গিট হোস্ট করতে পারো:
- Gitea — হালকা, সহজ
- GitLab Self-hosted — ফুল ফিচার
তুলনা
| ফিচার | GitHub | GitLab | Bitbucket |
|---|---|---|---|
| ফ্রি প্রাইভেট রিপো | ✅ | ✅ | ✅ |
| CI/CD | GitHub Actions | বিল্ট-ইন | Pipelines |
| সেলফ-হোস্ট | ❌ | ✅ | ❌ |
| জনপ্রিয়তা | সবচেয়ে বেশি | বেশি | মাঝামাঝি |
তাহলে কোনটা ব্যবহার করবে?
- বেশিরভাগ ক্ষেত্রে → GitHub (সবচেয়ে বড় কমিউনিটি, সবচেয়ে বেশি ওপেন সোর্স)
- কোম্পানি/প্রাইভেসি → GitLab
- Jira ব্যবহার করলে → Bitbucket
টিপ: শুরুতে গিটহাব দিয়েই চলো। পরে যদি অন্য কিছু দরকার হয়, তখন বদলাতে পারবে। গিটের কমান্ড সব প্ল্যাটফর্মে একই!
গিটহাবে SSH ব্যবহার না করা
SSH সেটআপ করতে চাও না?
কিছু কারণে SSH সেটআপ করা সম্ভব না বা করতে চাও না? কোনো সমস্যা নেই! HTTPS দিয়েও গিটহাবে কাজ করা যায়।
HTTPS দিয়ে কাজ করা
HTTPS ব্যবহার করলে গিটহাব রিপোর HTTPS URL ব্যবহার করবে:
git remote add origin https://github.com/username/repo.git
Personal Access Token (PAT)
গিটহাব এখন আর সরাসরি পাসওয়ার্ড সাপোর্ট করে না। HTTPS ব্যবহার করলে Personal Access Token দরকার হবে।
টোকেন তৈরি করা
- GitHub → Settings (প্রোফাইল ড্রপডাউন থেকে)
- বাম পাশে Developer settings
- Personal access tokens → Tokens (classic)
- Generate new token → Generate new token (classic)
- Note দাও (যেমন: “My Laptop Token”)
- Expiration সেট করো (30 days, 60 days, বা No expiration)
- Scopes এ repo তে টিক দাও
- Generate token ক্লিক করো
- টোকেনটা কপি করো!
সাবধান: টোকেন একবারই দেখানো হবে! কপি করে নিরাপদ জায়গায় রাখো।
টোকেন ব্যবহার করা
পুশ করার সময় পাসওয়ার্ডের জায়গায় টোকেন দাও:
Username: tomar-username
Password: ghp_xxxxxxxxxxxxxxxxxxxx (টোকেন পেস্ট করো)
বারবার টোকেন দিতে হবে?
প্রতিবার পুশ/পুল করার সময় টোকেন দেওয়া ঝামেলা। এটা সমাধান করতে Credential Manager ব্যবহার করো:
Windows
Git for Windows ইন্সটল করলে Git Credential Manager আপনাআপনি ইন্সটল হয়। প্রথমবার টোকেন দিলে পরেরবার থেকে মনে রাখবে।
Mac
git config --global credential.helper osxkeychain
Linux
git config --global credential.helper store
সাবধান:
credential.helper storeটোকেনটা প্লেইন টেক্সটে সেভ করে। বেশি সিকিউর চাইলে SSH ব্যবহার করো।
HTTPS vs SSH
| HTTPS | SSH | |
|---|---|---|
| সেটআপ | সহজ | একটু জটিল |
| অথেনটিকেশন | টোকেন দরকার | Key দিয়ে অটো |
| ফায়ারওয়াল | সাধারণত কাজ করে | মাঝে মাঝে ব্লক হয় |
| সিকিউরিটি | ভালো | আরো ভালো |
মনে রাখো
- HTTPS দিয়ে শুরু করো, সমস্যা নেই
- কিন্তু যখন পারো SSH সেটআপ করে ফেলো — লং টার্মে অনেক সুবিধা!
টিপ: অফিস/ইউনিভার্সিটির নেটওয়ার্কে SSH পোর্ট (22) ব্লক থাকতে পারে। তখন HTTPS ই একমাত্র অপশন।
স্টুডেন্টদের জন্য গিটহাব অফার
GitHub Student Developer Pack
তুমি যদি স্টুডেন্ট হও, তাহলে তোমার জন্য দারুণ খবর আছে! গিটহাব স্টুডেন্টদের জন্য একটা বিশাল ফ্রি প্যাকেজ দেয় — GitHub Student Developer Pack।
কি কি পাবে?
এই প্যাকে অনেক কিছু ফ্রি পাবে। কিছু হাইলাইট:
গিটহাব প্রো (ফ্রি!)
- আনলিমিটেড প্রাইভেট রিপো
- GitHub Copilot (AI কোডিং অ্যাসিস্ট্যান্ট) — ফ্রি!
- GitHub Pages (ফ্রি ওয়েবসাইট হোস্টিং)
- আরো অনেক ফিচার
অন্যান্য টুল
| টুল | কি পাবে |
|---|---|
| JetBrains | IntelliJ, PyCharm সব IDE ফ্রি |
| DigitalOcean | $200 ক্রেডিট |
| Namecheap | .me ডোমেইন ফ্রি (১ বছর) |
| Canva Pro | ফ্রি |
| Microsoft Azure | $100 ক্রেডিট |
| MongoDB Atlas | ফ্রি ক্রেডিট |
| Frontend Masters | ৬ মাস ফ্রি |
| educative.io | ৬ মাস ফ্রি |
এবং আরো ১০০+ টুল ও সার্ভিস!
কিভাবে পাবে?
ধাপ ১: গিটহাব অ্যাকাউন্ট থাকতে হবে
না থাকলে github.com এ গিয়ে বানাও।
ধাপ ২: আবেদন করো
- education.github.com/pack এ যাও
- Get your pack ক্লিক করো
- Students সিলেক্ট করো
ধাপ ৩: প্রমাণ দাও
তোমাকে প্রমাণ করতে হবে তুমি স্টুডেন্ট। কয়েকটা উপায়:
- ইউনিভার্সিটি ইমেইল (.edu বা .ac ইমেইল সবচেয়ে ভালো)
- স্টুডেন্ট আইডি কার্ডের ছবি
- এনরোলমেন্ট লেটার
ধাপ ৪: অপেক্ষা করো
আবেদন রিভিউ হতে কিছুদিন সময় লাগতে পারে। অনুমোদন হলে ইমেইল পাবে।
টিপস: আবেদন অনুমোদন পেতে
- ইউনিভার্সিটি ইমেইল ব্যবহার করো (gmail/yahoo দিয়ে কঠিন হতে পারে)
- পরিষ্কার ছবি আপলোড করো
- তোমার নাম আর ইউনিভার্সিটির নাম যেন মিলে
- ইতিমধ্যে অ্যাকাউন্টে কিছু কাজ থাকলে ভালো (রিপো, কমিট)
কতদিন ফ্রি থাকবে?
তুমি যতদিন স্টুডেন্ট, ততদিন ফ্রি। সাধারণত ২ বছর পরপর রিনিউ করতে হয়। স্টুডেন্ট না থাকলে বন্ধ হয়ে যাবে।
মনে রাখো
এটা একটা গোল্ডেন অপরচুনিটি! স্টুডেন্ট থাকতে থাকতে এই প্যাক নিয়ে নাও। পরে এই টুলগুলো কিনতে গেলে অনেক টাকা লাগবে!
আবেদন করো এখনই: education.github.com/pack
আরো কিছু
গিটের আরো কিছু কাজের কমান্ড
এই বইতে সবকিছু কভার করা সম্ভব না। তবে কিছু বাড়তি কমান্ড আছে যেগুলো কাজে লাগবে:
.gitignore ফাইল
কিছু ফাইল আছে যেগুলো গিটে রাখা উচিত না — যেমন পাসওয়ার্ড ফাইল, node_modules ফোল্ডার, বিল্ড ফাইল ইত্যাদি। .gitignore ফাইল বানিয়ে বলে দাও কোন ফাইলগুলো ইগনোর করবে:
# .gitignore ফাইল তৈরি করো
touch .gitignore
.gitignore এ লেখো:
# Node modules
node_modules/
# Environment variables (পাসওয়ার্ড থাকে!)
.env
# বিল্ড ফাইল
dist/
build/
# OS ফাইল
.DS_Store
Thumbs.db
# IDE ফাইল
.vscode/
.idea/
টিপ: gitignore.io সাইটে গিয়ে তোমার প্রোজেক্টের টাইপ লিখলে অটো
.gitignoreতৈরি করে দেবে!
git tag
গুরুত্বপূর্ণ পয়েন্টে ট্যাগ দাও — যেমন রিলিজ ভার্শন:
# ট্যাগ তৈরি
git tag v1.0.0
# মেসেজসহ ট্যাগ
git tag -a v1.0.0 -m "প্রথম রিলিজ"
# সব ট্যাগ দেখা
git tag
# ট্যাগ পুশ
git push origin v1.0.0
git alias
বেশি ব্যবহৃত কমান্ডের শর্টকাট বানাও:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph"
এখন git status এর বদলে git st লিখলেই হবে!
git cherry-pick
অন্য ব্রাঞ্চের নির্দিষ্ট একটা কমিট নিয়ে আসতে:
git cherry-pick a1b2c3d
git blame
কোন লাইন কে লিখেছে জানতে:
git blame hello.txt
কিছু দরকারি রিসোর্স
শেখার জন্য
- Pro Git Book — ফ্রি বই
- Learn Git Branching — ইন্টার্যাক্টিভ গেম
- Git Cheat Sheet — চিট শিট
প্র্যাকটিস করার জন্য
- First Contributions — প্রথম কন্ট্রিবিউশন প্র্যাকটিস
- GitHub Skills — গিটহাবের অফিসিয়াল কোর্স
শেষ কথা
গিট শেখা একদিনে হয় না। প্রতিদিন একটু একটু করে প্র্যাকটিস করো। ভুল হবে, সমস্যায় পড়বে — এটাই স্বাভাবিক। গুগল করো, Stack Overflow তে খোঁজো। সবাই এভাবেই শিখেছে।
তোমার গিট যাত্রা শুভ হোক! 🚀
“The best time to learn Git was yesterday. The next best time is today.”