অধ্যায় 2 · Git ও GitHub
GitHub: রিমোট, push, pull ও clone
- পৃষ্ঠা 9 / 22
- 16 মিনিট পড়া
এখন পর্যন্ত Git নিয়ে আপনি যা করেছেন, সবই একটা ল্যাপটপের একটা ফোল্ডারে। ল্যাপটপ নষ্ট হলে প্রজেক্টও শেষ; আর কেউ সেটা দেখতে, রিভিউ করতে বা চালাতে পারে না; দ্বিতীয় কোনো মেশিন থেকে কাজ করাও যায় না। রিমোট (remote) এই সবকটা সমস্যার সমাধান: রিপোজিটরির আরেকটা কপি, সাধারণত GitHub-এ, যেখানে আপনি নিজের কমিট পুশ (push) করেন আর অন্যদের কমিট পুল (pull) করে আনেন।
AI-এর কাজে GitHub আপনার পাবলিক পোর্টফোলিও, যেখানে নিয়োগকর্তারা সবার আগে তাকান; আবার আপনার CI টেস্ট চলে আর ডিপ্লয়মেন্ট শুরু হয় সেখান থেকেই। এই পাতায় আপনার রিপোজিটরিকে একটা রিমোটের সাথে জুড়বেন এবং প্রতিদিনের কমান্ডগুলো শিখবেন: remote, push, clone, fetch ও pull; সাথে শিখবেন GitHub-এ নিরাপদে লগ ইন করার উপায়।
যা শিখবেন
- GitHub-এ রিপোজিটরি তৈরি করা, আর পাবলিক ও প্রাইভেট ভিজিবিলিটির পার্থক্য।
- রিমোট কী:
git remote add,git remote -v,origin, আরorigin/main-এর মতো রিমোট-ট্র্যাকিং ব্রাঞ্চ। - কমিট পাঠানো ও আনা:
git push -u,git clone,git fetchওgit pull, আর পুশ রিজেক্ট হলে কী করবেন। - GitHub-এ অথেনটিকেশন: ফাইন-গ্রেইনড পার্সোনাল অ্যাক্সেস টোকেনসহ HTTPS, অথবা ed25519 কি-সহ SSH।
উদাহরণ প্রজেক্ট সাজানো
আগের পাতাগুলোর মতোই একটা ছোট রিভিউ অ্যানালাইজার, একটা .gitignore আর দুটো কমিটসহ:
mkdir -p ~/projects/review-analyser
cd ~/projects/review-analyser
git init -q
cat > analyse.py <<'EOF'
"""Label product reviews as positive, negative or neutral."""
POSITIVE = {"good", "great", "fast", "love"}
NEGATIVE = {"bad", "slow", "broken", "late"}
def label(text):
words = text.lower().split()
score = sum(w in POSITIVE for w in words) - sum(w in NEGATIVE for w in words)
return "positive" if score > 0 else "negative" if score < 0 else "neutral"
if __name__ == "__main__":
for review in ["great phone and fast delivery", "the box was broken"]:
print(label(review), "|", review)
EOF
printf '.env\n.venv/\n__pycache__/\n' > .gitignore
git add .
git commit -q -m "Add keyword review analyser"
echo "# Review analyser" > README.md
git add README.md
git commit -q -m "Add README"
git log --oneline3c7a863 Add README
8d9d5fc Add keyword review analyserGit, GitHub আর রিমোট
Git হলো আপনার মেশিনের টুল; GitHub একটা ওয়েবসাইট, যা Git রিপোজিটরি হোস্ট করে এবং তার চারপাশে সহযোগিতার সুবিধা যোগ করে: পুল রিকোয়েস্ট, ইস্যু, কোড রিভিউ, Actions (CI/CD) আর অ্যাক্সেস কন্ট্রোল। GitLab, Bitbucket ও Codeberg একই কাজ করে। Git-এর দৃষ্টিতে GitHub-এর একটা রিপোজিটরি শুধু আরেকটা রিপোজিটরি, যার সাথে সে কমিট আদান-প্রদান করতে পারে: একটা রিমোট।
your laptop GitHub teammate's laptop
+----------------+ git push +----------------+ git clone +----------------+
| review-analyser| --------------> | review-analyser| -----------> | review-analyser|
| (working tree | <-------------- | (bare repo: | <----------- | (working tree |
| + .git) | git fetch/pull | history only) | git push | + .git) |
+----------------+ +----------------+ +----------------+"GitHub-এর কপি"-তে কেউ সরাসরি Git দিয়ে ফাইল এডিট করে না; সবাই নিজের ক্লোনে কাজ করে এবং শেয়ার করা কপির মাধ্যমে কমিট আদান-প্রদান করে।
GitHub-এ রিপোজিটরি তৈরি করুন
github.com-এ যান (দরকার হলে আগে সাইন আপ করুন; কোড কন্ট্রিবিউটরদের GitHub টু-ফ্যাক্টর অথেনটিকেশন চালু করতে বলে, তাই একটা অথেনটিকেটর অ্যাপ হাতের কাছে রাখুন):
- + (ওপরে ডানে) → New repository চাপুন।
- Repository name:
review-analyser। এক লাইনের বিবরণ দিন: "Keyword-based sentiment labels for product reviews"। - Visibility: Public (যে কেউ কোড দেখতে পারে; পোর্টফোলিও ও কোর্স প্রজেক্টের জন্য ভালো) অথবা Private (শুধু আপনি আর যাদের ইনভাইট করবেন)। পরে Settings → General → Danger Zone-এ গিয়ে বদলানো যায়।
- আপনার লোকাল রিপোজিটরি আগে থেকেই আছে, তাই "Add a README", .gitignore বা লাইসেন্স টিক দেবেন না। এগুলো GitHub-এ একটা প্রথম কমিট তৈরি করে, যা আপনার লোকাল হিস্ট্রিতে নেই, আর তখন আপনার প্রথম পুশ রিজেক্ট হয়।
- Create repository চাপুন। GitHub "…or push an existing repository from the command line" নামে একটা পাতা দেখাবে, যেখানে নতুন রিপোজিটরির URL থাকে, যেমন
https://github.com/nadia-rahman/review-analyser.git।
ফ্রি প্ল্যানে পাবলিক ও প্রাইভেট রিপোজিটরি যত খুশি বানানো যায়। GitHub Actions-এর মিনিট পাবলিক রিপোজিটরিতে ফ্রি, আর প্রাইভেটে মাসে ২,০০০ মিনিট; পাবলিক রিপোজিটরিতে সিক্রেট স্ক্যানিং ও পুশ প্রোটেকশনও ডিফল্টভাবে চালু থাকে (.gitignore: সিক্রেট আর অপ্রয়োজনীয় ফাইল বাইরে রাখা পাতায় বলা হয়েছে এটা কেন জরুরি)।
নিজের মেশিনেই GitHub-এর বদলি
অ্যাকাউন্ট বা নেটওয়ার্ক ছাড়াই এখানকার সব কমান্ড অনুশীলন করতে একটা ফোল্ডারে বেয়ার রিপোজিটরি (bare repository) বানান। বেয়ার রিপোজিটরিতে ওয়ার্কিং ট্রি থাকে না, শুধু হিস্ট্রি থাকে (যা সাধারণত .git-এর ভেতরে থাকে)। GitHub প্রতিটা রিপোজিটরির জন্য ঠিক এটাই রাখে, তাই Git দুটোকে একইভাবে দেখে; তফাত শুধু URL-এ।
git init --bare ~/remotes/review-analyser.gitInitialized empty Git repository in /home/nadia/remotes/review-analyser.git/এই পাতার বাকি অংশে ~/remotes/review-analyser.git-কে "GitHub-এর রিপোজিটরি" ধরে নিন। আসল GitHub যেখানে আলাদা আচরণ করে, লেখায় সেটা বলা আছে।
রিমোট জুড়ুন ও পুশ করুন
git remote add NAME URL একটা রিমোটের জন্য ছোট নাম জমা রাখে। নিয়ম অনুযায়ী মূল রিমোটের নাম origin। git remote -v সব রিমোট তাদের URL-সহ দেখায়:
git remote add origin ~/remotes/review-analyser.git
git remote -vorigin /home/nadia/remotes/review-analyser.git (fetch)
origin /home/nadia/remotes/review-analyser.git (push)আসল GitHub-এ রিপোজিটরি পাতার URL ব্যবহার করবেন, HTTPS বা SSH যেকোনো রূপে; নিচের সবকিছু একইভাবে কাজ করে:
git remote add origin https://github.com/nadia-rahman/review-analyser.git # HTTPS
git remote add origin git@github.com:nadia-rahman/review-analyser.git # অথবা SSHএবার কমিট পাঠান। git push -u origin main লোকাল main ব্রাঞ্চকে origin-এ পুশ করে, আর -u (--set-upstream) এই জোড়াটা মনে রাখে, ফলে পরে শুধু git push ও git pull লিখলেই চলে:
git push -u origin mainTo /home/nadia/remotes/review-analyser.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.[new branch] main -> main মানে রিমোটে আগে main ছিল না, এখন আপনার কমিটগুলো সেখানে আছে। টার্মিনালে Git প্রগ্রেসের লাইনও (Enumerating objects…, Writing objects…) দেখায়, আর GitHub remote: দিয়ে শুরু হওয়া কয়েক লাইন যোগ করে; এটা স্বাভাবিক। পুশের পর GitHub-এর পাতা রিফ্রেশ করলে আপনার ফাইল, কমিট আর README সেখানে দেখা যাবে।
রিমোট-ট্র্যাকিং ব্রাঞ্চ
আপনার রিপোজিটরি এখন origin/main-ও রাখে: রিমোটের সাথে শেষবার যোগাযোগের সময় সেখানে main কোথায় ছিল, তার একটা শুধু-পড়া বুকমার্ক। Git আপনার ব্রাঞ্চকে এর সাথে তুলনা করে:
git status
git branch -vv
git log --oneline --decorateOn branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
* main 3c7a863 [origin/main] Add README
3c7a863 (HEAD -> main, origin/main) Add README
8d9d5fc Add keyword review analysergit branch -vv-এ [origin/main] হলো সেই আপস্ট্রিম, যা -u ঠিক করে দিয়েছে। গুরুত্বপূর্ণ কথা: origin/main শুধু তখনই হালনাগাদ হয়, যখন আপনি পুশ, ফেচ বা পুল করেন। "Up to date with 'origin/main'" মানে "আমি শেষবার যা দেখেছি, তার সাথে হালনাগাদ", এই মুহূর্তের GitHub-এর সাথে নয়।
ক্লোন: দ্বিতীয় একটা কপি
git clone URL একটা পুরো রিপোজিটরি, প্রতিটা কমিট ও ব্রাঞ্চসহ, ডাউনলোড করে, ওই URL-কে নির্দেশ করা origin বসিয়ে দেয় এবং ডিফল্ট ব্রাঞ্চ চেক আউট করে। যেকোনো বিদ্যমান প্রজেক্টে কাজ শুরু করার এবং কোনো সহকর্মীর আপনার প্রজেক্টে যোগ দেওয়ার এটাই উপায়। আসুন একই মেশিনে নাদিয়ার সহকর্মী রাফির ভূমিকা নিই:
mkdir -p ~/rafi
cd ~/rafi
git clone ~/remotes/review-analyser.git
cd review-analyser
git config user.name "Rafi Ahmed"
git config user.email "rafi@example.com"
git remote -v
git log --onelineCloning into 'review-analyser'...
done.
origin /home/nadia/remotes/review-analyser.git (fetch)
origin /home/nadia/remotes/review-analyser.git (push)
3c7a863 Add README
8d9d5fc Add keyword review analyserরাফির কাছে পুরো হিস্ট্রি আছে, আর ক্লোনই origin বসিয়ে দিয়েছে। --global ছাড়া git config শুধু এই রিপোজিটরির জন্য তার নাম ঠিক করে, ফলে তার কমিটে নাদিয়ার নাম বসে না। (GitHub-এ সবুজ Code বোতাম ক্লোন করার URL দেয়, আর git clone https://github.com/OWNER/REPO.git রিপোজিটরির নামে একটা ফোল্ডার বানায়।)
রাফি README-তে ব্যবহারের একটা অংশ যোগ করে পুশ করে। তার ক্লোন আগে থেকেই আপস্ট্রিম জানে, তাই শুধু git push-ই যথেষ্ট:
printf '\nRun: python analyse.py\n' >> README.md
git commit -q -am "Explain how to run the analyser"
git pushTo /home/nadia/remotes/review-analyser.git
3c7a863..10178b3 main -> main3c7a863..10178b3 main -> main মানে রিমোটের main নাদিয়ার README কমিট থেকে সরে রাফির নতুন কমিটে এসেছে।
fetch ও pull: অন্যের কমিট আনা
নাদিয়ার রিপোজিটরিতে ফিরে আসুন। Git এখনো রাফির পুশের কথা জানে না, কারণ সে রিমোটকে জিজ্ঞেস করেনি:
cd ~/projects/review-analyser
git statusOn branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleangit fetch রিমোট থেকে নতুন কমিট নামিয়ে আনে এবং origin/main হালনাগাদ করে, কিন্তু আপনার ব্রাঞ্চ বা ফাইলে হাত দেয় না। এটা সবসময় নিরাপদ:
git fetch
git status
git log --oneline --decorate --allFrom /home/nadia/remotes/review-analyser
3c7a863..10178b3 main -> origin/main
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
3c7a863 (HEAD -> main) Add README
10178b3 (origin/main) Explain how to run the analyser
8d9d5fc Add keyword review analyserএখন Git জানে main একটা কমিট পিছিয়ে আছে। নেওয়ার আগে কী এসেছে দেখে নিতে পারেন, যেমন git diff main origin/main বা git log main..origin/main দিয়ে। git pull হলো git fetch, তারপর আপস্ট্রিমকে আপনার বর্তমান ব্রাঞ্চে মার্জ করা:
git pull
cat README.mdUpdating 3c7a863..10178b3
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
# Review analyser
Run: python analyse.pygit fetch | git pull | |
|---|---|---|
| নতুন কমিট নামায় | হ্যাঁ | হ্যাঁ |
origin/main হালনাগাদ করে | হ্যাঁ | হ্যাঁ |
| আপনার ব্রাঞ্চ ও ফাইল বদলায় | না | হ্যাঁ: আপস্ট্রিমকে মার্জ (বা রিবেস) করে |
| মার্জ কনফ্লিক্ট হতে পারে | কখনো না | হ্যাঁ, যেকোনো মার্জের মতো |
| কখন ব্যবহার করবেন | নেওয়ার আগে দেখতে; স্ক্রিপ্টে | দিনের শুরুতে, ব্রাঞ্চ শুরুর আগে, পুশের আগে |
পুশ রিজেক্ট হলে
রিমোটে সবচেয়ে সাধারণ চমক: দুজনেই কমিট করেছেন, রাফি আগে পুশ করল, তারপর নাদিয়া পুশ করল।
cd ~/rafi/review-analyser
printf 'fast\nslow\n' > keywords.txt
git add keywords.txt
git commit -q -m "List keywords in a text file"
git push -q
cd ~/projects/review-analyser
echo "MIT licence" > LICENSE
git add LICENSE
git commit -q -m "Add licence"
git pushTo /home/nadia/remotes/review-analyser.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '/home/nadia/remotes/review-analyser.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.Git রাজি হয়নি, কারণ রিমোটে এমন একটা কমিট আছে যা নাদিয়ার কাছে নেই; তার পুশ মেনে নিলে রাফির কমিট মুছে যেত। (নতুন Git সংস্করণে hint: লাইনগুলোর শব্দ একটু আলাদা, মানে একই।) সমাধান সবসময় একই: আগে পুল, তারপর পুশ।
দুই পক্ষেরই নতুন কমিট থাকায় এই পুলে সত্যিকারের মার্জ লাগবে। git pull যখন আলাদা হয়ে যাওয়া ব্রাঞ্চের মুখোমুখি হয়, তখন তাকে জানতে হয় মার্জ করবে না রিবেস; Git 2.33 থেকে একবার ডিফল্ট না বেছে দেওয়া পর্যন্ত সে এরর দিয়ে থেমে যায়। এখনই ঠিক করে দিন (নতুনদের জন্য মার্জই সবচেয়ে সহজ; রিবেস অ্যাডভান্সড টিউটোরিয়ালে ব্যাখ্যা করা হয়েছে):
git config --global pull.rebase falseএখন থেকে git pull মানে "ফেচ, তারপর মার্জ"। দুই ধাপ পরিষ্কারভাবে দেখতে এবার একটা একটা করে করুন: ফেচ, রিমোট-ট্র্যাকিং ব্রাঞ্চকে main-এ মার্জ, তারপর পুশ:
git fetch
git merge --no-edit origin/main
git push
git log --oneline --graph --decorate -4From /home/nadia/remotes/review-analyser
10178b3..bc13a4d main -> origin/main
Merge made by the 'ort' strategy.
keywords.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 keywords.txt
To /home/nadia/remotes/review-analyser.git
bc13a4d..415a422 main -> main
* 415a422 (HEAD -> main, origin/main) Merge remote-tracking branch 'origin/main'
|\
| * bc13a4d List keywords in a text file
* | cbdb7ef Add licence
|/
* 10178b3 Explain how to run the analyserমার্জ রাফির কমিটকে নাদিয়ার কমিটের সাথে মিলিয়ে দিল (আগের পাতার মতো থ্রি-ওয়ে মার্জ; --no-edit এডিটর না খুলে ডিফল্ট মেসেজ মেনে নেয়), তারপর পুশ সফল হলো। সাধারণ git pull-ও একই কাজ করে, শুধু মার্জ মেসেজটা হয় Merge branch 'main' of github.com:…। তারা একই লাইন বদলালে মার্জ কনফ্লিক্টে থেমে যেত, আর সেটা আপনি যেভাবে শিখেছেন সেভাবেই মেটাতে হতো। রিজেক্ট হওয়া পুশ কখনো শেয়ার করা ব্রাঞ্চে git push --force দিয়ে "মেটাবেন" না: এটা রিমোটকে আপনার হিস্ট্রি দিয়ে ওভাররাইট করে এবং সহকর্মীর কমিট সেখান থেকে মুছে দেয়।
ব্রাঞ্চ পুশ করা
ব্রাঞ্চও একইভাবে পুশ হয়। নতুন ব্রাঞ্চের প্রথম পুশে -u লাগে; এরপর শুধু git push-ই যথেষ্ট। git branch -a লোকাল ও রিমোট-ট্র্যাকিং ব্রাঞ্চ একসাথে দেখায়:
git switch -q -c feature/negation
echo "# TODO: handle 'not good'" >> analyse.py
git commit -q -am "Note the negation problem"
git push -u origin feature/negation
git branch -aTo /home/nadia/remotes/review-analyser.git
* [new branch] feature/negation -> feature/negation
branch 'feature/negation' set up to track 'origin/feature/negation'.
* feature/negation
main
remotes/origin/feature/negation
remotes/origin/mainপুশ করা ব্রাঞ্চ অসমাপ্ত কাজের ব্যাকআপও, আবার পুল রিকোয়েস্টের শুরুর বিন্দুও; সেটা পরের পাতায়।
GitHub-এ লগ ইন: HTTPS না SSH
বেয়ার রিপোজিটরিতে লগ ইন লাগেনি। GitHub-এ প্রথম পুশের সময় (এবং প্রাইভেট রিপোজিটরি ক্লোন করতে) লাগে। GitHub এখন Git-এর জন্য আপনার অ্যাকাউন্টের পাসওয়ার্ড নেয় না, তাই দুটো পদ্ধতির একটা বেছে নিতে হয়।
ক্রেডেনশিয়াল ম্যানেজার বা ফাইন-গ্রেইনড টোকেনসহ HTTPS
সবচেয়ে সহজ পথ: একটা ক্রেডেনশিয়াল ম্যানেজার ব্রাউজারের মাধ্যমে আপনাকে লগ ইন করাক এবং ক্রেডেনশিয়াল নিরাপদে জমা রাখুক। Git for Windows Git Credential Manager ইনস্টল করে, আর প্রথম পুশে GitHub সাইন-ইন উইন্ডো আসে। যেকোনো সিস্টেমে GitHub CLI আপনার জন্য এটা সেট আপ করে দিতে পারে gh auth login দিয়ে (GitHub.com → HTTPS → ব্রাউজারে লগ ইন বেছে নিন)।
ক্রেডেনশিয়াল ম্যানেজার না থাকলে Git ইউজারনেম আর পাসওয়ার্ড চায়; পাসওয়ার্ডের জায়গায় বসাতে হয় একটা পার্সোনাল অ্যাক্সেস টোকেন (PAT)। সম্ভব হলে GitHub ফাইন-গ্রেইনড টোকেন ব্যবহারের পরামর্শ দেয়:
- GitHub → আপনার ছবি → Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token।
- একটা নাম আর মেয়াদ (expiration) দিন (ডিফল্ট ৩০ দিন; ছোট মেয়াদ বেশি নিরাপদ)।
- Repository access: "Only select repositories" →
review-analyser। - Permissions → Repository permissions → Contents: Read and write (পুশ ও পুলের জন্য যথেষ্ট)।
- জেনারেট করুন, একবারই কপি করুন, আর পাসওয়ার্ড ম্যানেজারে রাখুন। এটাকে ঠিক API কি-এর মতো সামলান।
টোকেন কখনো রিমোট URL-এ বসাবেন না (https://TOKEN@github.com/…): তাহলে সেটা .git/config-এ সাদা টেক্সটে জমা থাকে এবং git remote -v-এর আউটপুটে ও স্ক্রিনশটে ধরা পড়ে।
ed25519 কি-সহ SSH
SSH-এ একবার একটা কি পেয়ার বানাতে হয়: প্রাইভেট কি আপনার মেশিনে থাকে, পাবলিক কি যায় GitHub-এ। এই ধাপগুলোর জন্য আপনার আসল মেশিন ও অ্যাকাউন্ট দরকার, তাই এখানে শুধু দেখানো হলো, চালানো হয়নি:
ssh-keygen -t ed25519 -C "nadia@example.com" # Enter = ডিফল্ট ফাইল; একটা পাসফ্রেজ দিন
eval "$(ssh-agent -s)" # এই টার্মিনালের জন্য এজেন্ট চালু করুন
ssh-add ~/.ssh/id_ed25519 # কী লোড করুন (একবার পাসফ্রেজ চাইবে)
cat ~/.ssh/id_ed25519.pub # এই এক লাইন কপি করুন: PUBLIC কীGitHub-এ: Settings → SSH and GPG keys → New SSH key, .pub লাইনটা পেস্ট করে সেভ করুন। তারপর কানেকশন পরীক্ষা করুন এবং রিমোটকে SSH URL-এ ঘুরিয়ে দিন:
ssh -T git@github.com
git remote set-url origin git@github.com:nadia-rahman/review-analyser.gitHi nadia-rahman! You've successfully authenticated, but GitHub does not provide shell access.প্রথমবার SSH জানতে চাইবে GitHub-এর হোস্ট কি-টা আপনি বিশ্বাস করেন কি না; ফিঙ্গারপ্রিন্টটা GitHub-এর ডকুমেন্টেশনের সাথে মিলিয়ে দেখুন, তারপর yes লিখুন। ed25519 ব্যবহার করুন: এটা ছোট, দ্রুত, এবং GitHub-এর সুপারিশ; RSA কি শুধু পুরোনো সিস্টেমের জন্য, যারা এটা ব্যবহার করতে পারে না।
| HTTPS | SSH | |
|---|---|---|
| URL | https://github.com/OWNER/REPO.git | git@github.com:OWNER/REPO.git |
| ক্রেডেনশিয়াল | ক্রেডেনশিয়াল ম্যানেজারের মাধ্যমে ব্রাউজার লগ ইন, অথবা ফাইন-গ্রেইনড PAT | কি পেয়ার; পাবলিক কি GitHub-এ যোগ করা |
| সেটআপের ঝামেলা | Git Credential Manager বা gh auth login থাকলে সবচেয়ে কম | প্রতি মেশিনে একবার কয়েকটা কমান্ড |
| কড়া ফায়ারওয়ালে চলে | হ্যাঁ (পোর্ট ৪৪৩) | সাধারণত (পোর্ট ২২; GitHub ৪৪৩ পোর্টেও SSH দেয়) |
| কার জন্য ভালো | নতুনদের, Windows-এ, CI টোকেনে | নিজের মেশিনে প্রতিদিনের কাজে |
প্রাইভেট কি (.pub ছাড়া id_ed25519) বা টোকেন কখনো শেয়ার বা কমিট করবেন না। কোনোটা ফাঁস হলে সাথে সাথে GitHub-এ সেটা মুছে দিন এবং নতুন একটা বানান।
আসল AI কাজে এটা কোথায় দেখা যায়
- প্রতিটা সহযোগিতা শুরু হয়
git cloneদিয়ে: ওপেন-সোর্স মডেল লাইব্রেরি, আপনার দলের ব্যাকএন্ড, কোর্স প্রজেক্টের টেমপ্লেট। রিপোজিটরি বানানোর চেয়ে ক্লোন করবেন অনেক বেশিবার। - ট্রেনিং সার্ভার ও ক্লাউড GPU GitHub থেকে কোড পুল করে: ল্যাপটপ থেকে পুশ করুন, তারপর GPU মেশিনে
git pullকরে সেখানে এক্সপেরিমেন্ট চালান। সেই মেশিনকে অ্যাক্সেস দেওয়ার নিরাপদ উপায় একটা ডিপ্লয় কি বা শুধু-পড়ার ফাইন-গ্রেইনড টোকেন। - পোর্টফোলিও: পরিষ্কার README আর হিস্ট্রিসহ একটা পাবলিক রিপোজিটরি দেখায় আপনি কীভাবে কাজ করেন। পাবলিক করার আগে নিশ্চিত হয়ে নিন যে এতে কোনো কি, প্রাইভেট ডেটা বা বড় ডেটাসেট নেই।
- CI ও ডিপ্লয়মেন্ট (অ্যাডভান্সড টিউটোরিয়াল) চালু হয় পুশ থেকে: ব্রাঞ্চ পুশ করলে টেস্ট চলে,
main-এ মার্জ করলে মডেল API ডিপ্লয় হয়।
সাধারণ ভুল
- README সহ GitHub রিপোজিটরি বানিয়ে তারপর বিদ্যমান প্রজেক্ট পুশ করা। হিস্ট্রি দুটো সম্পর্কহীন হওয়ায় পুশ রিজেক্ট হয়। সমাধান: খালি রিপোজিটরি বানান; দেরি হয়ে গেলে একবার
git pull --allow-unrelated-histories origin mainকরে কনফ্লিক্ট মিটিয়ে পুশ করুন। - রিজেক্ট হওয়া পুশ জোর করে দেওয়া।
git push --forceরিমোটে সহকর্মীদের কমিট মুছে দেয়। সমাধান:git pull(কনফ্লিক্ট থাকলে মেটান), তারপরgit push। - রিমোট নিয়ে
git status-কে বিশ্বাস করা। "Up to date with 'origin/main'" শুধু শেষ ফেচের অবস্থা দেখায়। সমাধান: আগেgit fetch(বাgit pull) করুন। - URL বা স্ক্রিপ্টে টোকেন বসিয়ে দেওয়া। এটা
.git/config, শেল হিস্ট্রি আর স্ক্রিনশটে চলে যায়। সমাধান: ক্রেডেনশিয়াল ম্যানেজার বাgh auth login, মেয়াদসহ ফাইন-গ্রেইনড টোকেন, পাসফ্রেজসহ SSH কি। - হিস্ট্রিতে সিক্রেট রেখে রিপোজিটরি পাবলিক করা। পুরোনো প্রতিটা কমিটও পাবলিক হয়ে যায়। সমাধান: আগে
git log -p -S "sk-"(এবং একটা স্ক্যানার) দিয়ে দেখুন; যা পাওয়া যায় সেটা রোটেট করুন।
নিজে চেষ্টা করুন
এই পাতার নাদিয়া ও রাফির রিপোজিটরি ব্যবহার করুন।
- সহজ: রাফির রিপোজিটরিতে রিমোটগুলো দেখান, আর প্রতিটা লোকাল ব্রাঞ্চ কোন আপস্ট্রিম ট্র্যাক করছে সেটাও। তারপর ফেচ করে দেখান তার
mainপিছিয়ে আছে কি না। - মাঝারি: রাফি নাদিয়ার
feature/negationব্রাঞ্চে কাজ করতে চায়। ব্রাঞ্চটা তার রিপোজিটরিতে আনুন, সেখানে সুইচ করুন, আর তার শেষ কমিট দেখান। - কঠিন: একটা রিপোজিটরিতে একাধিক রিমোট থাকতে পারে। দ্বিতীয় একটা বেয়ার রিপোজিটরি
~/remotes/backup.gitবানান, নাদিয়ার রিপোজিটরিতে সেটাbackupনামে যোগ করুন, এক কমান্ডে তার সব ব্রাঞ্চ সেখানে পুশ করুন, আর ব্যাকআপটা~/restore-test-এ ক্লোন করে তার ব্রাঞ্চগুলো দেখিয়ে প্রমাণ করুন কাজটা হয়েছে।
উত্তর
# সহজ
cd ~/rafi/review-analyser
git remote -v
git branch -vv
git fetch -q
git statusorigin /home/nadia/remotes/review-analyser.git (fetch)
origin /home/nadia/remotes/review-analyser.git (push)
* main bc13a4d [origin/main] List keywords in a text file
On branch main
Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree cleanরাফির main দুটো কমিট পিছিয়ে আছে: নাদিয়ার লাইসেন্স কমিট আর তার মার্জ কমিট।
# মাঝারি
git switch feature/negation
git log --oneline -1Switched to a new branch 'feature/negation'
branch 'feature/negation' set up to track 'origin/feature/negation'.
30660f8 Note the negation problemফেচই origin/feature/negation এনে দিয়েছিল। যে ব্রাঞ্চ শুধু রিমোটে আছে, তার নাম দিয়ে git switch করলে সেটাকে ট্র্যাক করা একটা লোকাল ব্রাঞ্চ তৈরি হয়।
# কঠিন
cd ~/projects/review-analyser
git init -q --bare ~/remotes/backup.git
git remote add backup ~/remotes/backup.git
git push -q backup --all
git remote
git clone -q ~/remotes/backup.git ~/restore-test
git -C ~/restore-test branch -abackup
origin
* main
remotes/origin/HEAD -> origin/main
remotes/origin/feature/negation
remotes/origin/main--all প্রতিটা লোকাল ব্রাঞ্চ পুশ করে। git -C FOLDER cd ছাড়াই অন্য ফোল্ডারে Git কমান্ড চালায়। ক্লোন main চেক আউট করেছে এবং feature/negation-কে রিমোট ব্রাঞ্চ হিসেবে চেনে: ব্যাকআপ সম্পূর্ণ।
সারসংক্ষেপ
- রিমোট হলো রিপোজিটরির আরেকটা কপি; GitHub একটা বেয়ার রিপোজিটরি (শুধু হিস্ট্রি) রাখে, আর
originমূল রিমোটের প্রচলিত নাম। git remote add origin URLজোড়া লাগায়;git push -u origin mainপুশ করে এবং আপস্ট্রিম ঠিক করে; এরপরgit pushওgit pull-ই যথেষ্ট।git clone URLপুরো রিপোজিটরি কপি করে এবংoriginবসায়।git fetchনিরাপদেorigin/mainহালনাগাদ করে;git pull= ফেচ + মার্জ।- পুশ রিজেক্ট মানে রিমোটে এমন কমিট আছে যা আপনার কাছে নেই: পুল করুন, দরকার হলে কনফ্লিক্ট মেটান, তারপর পুশ। শেয়ার করা ব্রাঞ্চে কখনো ফোর্স-পুশ নয়।
pull.rebase falseএকবার সেট করুন। - ক্রেডেনশিয়াল ম্যানেজার /
gh auth login, মেয়াদসহ ফাইন-গ্রেইনড টোকেন, বা ed25519 SSH কি দিয়ে লগ ইন করুন। টোকেন ও প্রাইভেট কি URL ও রিপোজিটরির বাইরে রাখুন।
এরপর: পুল রিকোয়েস্ট, README ও আপনার প্রথম প্রকাশিত প্রজেক্ট। রিমোট তৈরি হয়ে গেছে; এবার আপনি কাজের মতো একটা README লিখবেন, ফিচার ব্রাঞ্চে কাজ করবেন, পুল রিকোয়েস্ট খুলবেন, রিভিউ করিয়ে মার্জ করবেন এবং আপনার প্রথম প্রজেক্ট প্রকাশ করবেন।