অধ্যায় 2 · Git ও GitHub
ভার্সন কন্ট্রোল ও আপনার প্রথম রিপোজিটরি
- পৃষ্ঠা 4 / 22
- 14 মিনিট পড়া
প্রতিটা AI প্রজেক্টে একসময় এমন একটা ফোল্ডার তৈরি হয়: train.py, train_v2.py, train_v2_fixed.py, train_FINAL.py, আর একটা নোটবুক, যার ভালো সংস্করণটা গত মঙ্গলবার ওভাররাইট হয়ে গেছে। প্রোডাকশনে যে মডেল চলছে সেটা কোন ফাইল থেকে এসেছে, বা যে সংস্করণ 0.91 স্কোর করেছিল আর যেটা 0.84 করছে তাদের মধ্যে কী বদলেছে — কেউ জানে না। ভার্সন কন্ট্রোল (version control) এই সমস্যার সমাধান: এটা আপনার প্রজেক্টের প্রতিটা সেভ করা অবস্থা লিখে রাখে — কে করেছে, কেন করেছে — আর যেকোনোটার সাথে তুলনা করতে বা সেখানে ফিরে যেতে দেয়।
Git হলো সেই ভার্সন কন্ট্রোল সিস্টেম, যা প্রায় সবাই ব্যবহার করে — একা শেখা শিক্ষার্থী থেকে শুরু করে সবচেয়ে বড় AI মডেল বানানো দলগুলো পর্যন্ত। এই পাতা ব্যাখ্যা করে Git কী করে, সেটা সেট আপ করে, আর আপনাকে নিয়ে যায় আপনার প্রথম রিপোজিটরি আর প্রথম কমিটগুলোর মধ্য দিয়ে — একটা ছোট প্রজেক্টে, যা পরে একটা সেন্টিমেন্ট-অ্যানালাইসিস API হয়ে উঠবে।
যা শিখবেন
- ভার্সন কন্ট্রোল কী, আর AI-এর কাজে কেন এটা লাগে
- Git আর GitHub-এর পার্থক্য
- একবারে Git কনফিগার করা: আপনার নাম, ইমেইল আর ডিফল্ট ব্রাঞ্চ
git initদিয়ে একটা ফোল্ডারকে রিপোজিটরিতে পরিণত করা- তিনটা জায়গা — ওয়ার্কিং ট্রি, স্টেজিং এরিয়া, রিপোজিটরি — আর
status→add→commitচক্র
ভার্সন কন্ট্রোল আপনাকে কী দেয়
| ভার্সন কন্ট্রোল ছাড়া | Git দিয়ে |
|---|---|
_v2, _final, _final2 নামের কপি | ফাইল একটাই সেট; প্রতিটা সেভ করা অবস্থা (একটা কমিট) থাকে হিস্ট্রিতে |
| "গতকালের পর কী বদলেছে?" — কেউ জানে না | git diff প্রতিটা বদলানো লাইন দেখায় |
| একটা ভুল বদল মানে স্মৃতি থেকে আবার লেখা | যেকোনো ফাইল, বা পুরো প্রজেক্ট, আগের যেকোনো কমিটে ফিরিয়ে নেওয়া যায় |
| সহকর্মীরা zip ফাইল ইমেইল করে, একে অপরের কাজ ওভাররাইট করে | প্রত্যেকে নিজের কপিতে কাজ করে, আর Git বদলগুলো মিলিয়ে দেয় |
| "কোন কোড থেকে এই মডেল এসেছে?" | প্রতিটা ফলাফলের সাথে যে কমিট সেটা তৈরি করেছে, তার চিহ্ন রাখা যায় |
Git ডিস্ট্রিবিউটেড (distributed): রিপোজিটরির প্রতিটা কপিতে পুরো হিস্ট্রি থাকে, তাই কোনো নেটওয়ার্ক ছাড়াই কমিট করা, হিস্ট্রি দেখা আর ভুল শোধরানো যায়। অন্যদের সাথে শেয়ার করা আলাদা একটা ধাপ (একটা সার্ভারে পুশ করা), যা শিখবেন GitHub: রিমোট, push, pull ও clone পাতায়।
Git আর GitHub এক জিনিস নয়
| Git | GitHub | |
|---|---|---|
| এটা কী | আপনার কম্পিউটারের একটা প্রোগ্রাম | একটা ওয়েবসাইট ও সার্ভিস, যা Git রিপোজিটরি হোস্ট করে |
| কে বানিয়েছে | Linus Torvalds (২০০৫), এখন একটা ওপেন-সোর্স কমিউনিটি প্রজেক্ট | GitHub, Inc., যার মালিক Microsoft |
| অফলাইনে চলে | হ্যাঁ, পুরোপুরি | না |
| যা দেয় | হিস্ট্রি, কমিট, ব্রাঞ্চ, মার্জ | অনলাইনে একটা শেয়ার করা কপি, পুল রিকোয়েস্ট আর কোড রিভিউ, ইস্যু, GitHub Actions (CI/CD), প্রজেক্ট পেজ |
| বিকল্প | (Mercurial, SVN — নতুন প্রজেক্টে কদাচিৎ) | GitLab, Bitbucket, Codeberg, Azure DevOps |
GitHub ছাড়াও সারাজীবন Git ব্যবহার করা যায়। কিন্তু Git ছাড়া GitHub অর্থহীন: এটা Git রিপোজিটরি রাখার জায়গা। এই পাতার সবটাই Git; GitHub আসবে অধ্যায় ২-এর পরের পাতাগুলোতে।
একবার Git সেট আপ করুন
এনভায়রনমেন্ট ভেরিয়েবল, .env ফাইল ও ভার্চুয়াল এনভায়রনমেন্ট পাতায় যেভাবে দেখানো হয়েছে, সেভাবে Git ইনস্টল করুন (Windows-এ Git for Windows সাথে Git Bash-ও দেয়)। প্রতিটা কমিটে লেখকের নাম আর ইমেইল থাকে, তাই Git-কে বলে দিন আপনি কে। --global মানে "এই ইউজারের সব রিপোজিটরির জন্য"; এটা থাকে ~/.gitconfig ফাইলে:
git config --global user.name "Nadia Rahman"
git config --global user.email "nadia@example.com"
git config --global init.defaultBranch mainতৃতীয় লাইনটা একটু ব্যাখ্যা দাবি করে। রিপোজিটরি তৈরির সময় তার প্রথম ব্রাঞ্চের (হিস্ট্রির একটা ধারা — ব্রাঞ্চ, মার্জ ও মার্জ কনফ্লিক্ট পাতায় ঠিকমতো পরিচয় হবে) একটা নাম দেওয়া হয়। আপনি অন্য কিছু না বললে Git নিজে এখনো এর নাম দেয় master, আর এ নিয়ে একটা লম্বা পরামর্শ (hint) প্রিন্ট করে; GitHub, GitLab আর বেশিরভাগ দল বহু বছর ধরে main ব্যবহার করছে। init.defaultBranch সেট করলে আপনার রিপোজিটরিগুলোও তাদের সাথে মিলে যায়। যাচাই করতে সেটিংগুলো আবার পড়ুন:
git config --global user.name
git config --global user.email
git config --global init.defaultBranchNadia Rahman
nadia@example.com
mainআরও কয়েকটা সেটিং জেনে রাখা ভালো:
- ইমেইল আর GitHub: আপনার GitHub অ্যাকাউন্টের ইমেইল ঠিকানাটাই ব্যবহার করুন, যাতে কমিটগুলো আপনার প্রোফাইলের সাথে যুক্ত হয়। ঠিকানা পাবলিক করতে না চাইলে GitHub Settings → Emails-এ একটা ব্যক্তিগত "noreply" ঠিকানা দেয়; এখানে সেটা ব্যবহার করুন।
- এডিটর: লম্বা মেসেজ লাগলে Git একটা এডিটর খোলে। ডিফল্ট প্রায়ই Vim, যা নতুনদের বিভ্রান্ত করে (বের হতে:
Escচাপুন,:q!লিখুন, Enter চাপুন)। এর বদলে VS Code চাইলে:git config --global core.editor "code --wait"; টার্মিনালের সহজ একটা এডিটর চাইলেnano। - Windows-এ লাইনের শেষ: Windows লাইন শেষ করে CRLF দিয়ে, Linux আর macOS করে LF দিয়ে। Git for Windows-এর ইনস্টলার
core.autocrlf=trueসেট করে, যা নিজে থেকেই রূপান্তর করে; ডিফল্টটাই রাখুন।
Git 3.0 আসছে। Git প্রজেক্ট তার পরের বড় সংস্করণের ঘোষণা দিয়েছে। এতে ডিফল্ট ব্রাঞ্চের নাম হবে
main, নতুন রিপোজিটরিতে SHA-1-এর বদলে আরও শক্তিশালী SHA-256 হ্যাশ ব্যবহার হবে, আর ব্রাঞ্চের তথ্য রাখা হবে আরও দ্রুত একটা ফরম্যাটে। এখনো কোনো রিলিজের তারিখ নেই, আর আপনার রোজকার কমান্ড বদলাবে না; এখনইinit.defaultBranch mainকনফিগার করলে আপনি শুধু আগেভাগে সেখানে পৌঁছে গেলেন। এই কোর্সের জন্য 2.51 বা তার পরের যেকোনো Git (বর্তমানে 2.56) চলবে।
আপনার প্রথম রিপোজিটরি
রিপোজিটরি (repository, সংক্ষেপে repo) হলো এমন একটা প্রজেক্ট ফোল্ডার, যার হিস্ট্রি Git ট্র্যাক করে। প্রজেক্ট ফোল্ডারটা বানান আর git init দিয়ে সেটাকে রিপোজিটরিতে পরিণত করুন:
mkdir -p ~/projects/sentiment-api
cd ~/projects/sentiment-api
git init
ls -aInitialized empty Git repository in /home/nadia/projects/sentiment-api/.git/
.
..
.gitচোখে পড়ার মতো বদল একটাই: একটা লুকানো ফোল্ডার, .git। এই ফোল্ডারটাই আসলে রিপোজিটরি: প্রতিটা কমিট, ব্রাঞ্চ আর সেটিং এর ভেতরে থাকে। আপনার ফাইলগুলো এর চারপাশের প্রজেক্ট ফোল্ডারে সাধারণ ফাইল হিসেবেই থাকে, যেকোনো এডিটরে সেগুলো এডিট করেন। এখান থেকে দুটো নিয়ম আসে: .git-এর ভেতরের ফাইল কখনো হাতে এডিট করবেন না, আর এটা কখনো মুছবেন না — .git মুছলে পুরো হিস্ট্রি মুছে যায়, থাকে শুধু বর্তমান ফাইলগুলো।
git status হবে আপনার সবচেয়ে বেশি টাইপ করা কমান্ড। এটা বলে আপনি কোন ব্রাঞ্চে আছেন আর Git কী দেখছে:
git statusOn branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)ওয়ার্কিং ট্রি, স্টেজিং এরিয়া, রিপোজিটরি
Git আপনার বদলগুলোকে তিনটা জায়গার মধ্য দিয়ে নিয়ে যায়। প্রায় প্রতিটা Git কমান্ড বোঝার চাবি এই ছবিটা:
working tree staging area repository (.git)
the files you edit what goes into the the saved history:
next commit (the "index") commits
+------------------+ +------------------+ +------------------+
| README.md | ---> | README.md | ----> | commit 2 |
| sentiment.py | git | | git | commit 1 |
| (edited) | add | | commit| |
+------------------+ +------------------+ +------------------+
^ |
+----------------- git restore / git switch ----------+
(get earlier versions back)- ওয়ার্কিং ট্রি (working tree) হলো এই মুহূর্তে আপনার প্রজেক্ট ফোল্ডার যেমন আছে, সেভ না করা পরীক্ষা-নিরীক্ষাসহ।
- স্টেজিং এরিয়া (staging area, যাকে ইনডেক্স-ও বলে) হলো যেখানে পরের কমিটটা জোড়া লাগান।
git addএকটা ফাইলের বর্তমান অবস্থা সেখানে কপি করে। - রিপোজিটরি রাখে কমিটগুলো।
git commitযা স্টেজ করা আছে, তাকে নতুন, স্থায়ী একটা স্ন্যাপশটে পরিণত করে।
মাঝের ধাপটা কেন? কারণ প্রায়ই একসাথে কয়েকটা জিনিস বদলান — একটা বাগ ঠিক করলেন, একটা প্রম্পট একটু বদলালেন, নতুন একটা থ্রেশহোল্ড চেষ্টা করলেন — আর এগুলোকে আলাদা আলাদা অর্থবহ কমিট হিসেবে সেভ করতে চান। প্রতিটা কমিটে ঠিক কী যাবে, স্টেজিং এরিয়া সেটা বেছে নিতে দেয়।
status → add → commit চক্র
দুটো ফাইল বানান: একটা README, আর নিয়মভিত্তিক ছোট্ট একটা সেন্টিমেন্ট ক্লাসিফায়ার — আসল মডেলের জায়গায় আমাদের বিকল্প:
cat > README.md <<'EOF'
# Sentiment API
A tiny sentiment classifier for course reviews, growing into a web API.
EOF# file: sentiment.py
"""A tiny rule-based sentiment classifier: our stand-in for a real model."""
POSITIVE = {"good", "great", "clear", "love", "loved"}
NEGATIVE = {"bad", "hard", "slow", "confusing"}
def classify(text: str) -> str:
words = set(text.lower().replace(",", " ").split())
score = len(words & POSITIVE) - len(words & NEGATIVE)
if score > 0:
return "positive"
if score < 0:
return "negative"
return "neutral"
if __name__ == "__main__":
for review in ["Great course, loved it", "Setup was hard", "It was okay"]:
print(f"{review!r}: {classify(review)}")python3 sentiment.py
git status'Great course, loved it': positive
'Setup was hard': negative
'It was okay': neutral
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
sentiment.py
nothing added to commit but untracked files present (use "git add" to track)প্রোগ্রামটা কাজ করছে। কিন্তু Git দুটো ফাইলকেই বলছে আনট্র্যাকড (untracked): ফোল্ডারে আছে, কিন্তু Git এখনো সেগুলো লিখে রাখছে না। শুধু README স্টেজ করে আবার দেখুন:
git add README.md
git statusOn branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
sentiment.pyএখন README আছে "Changes to be committed"-এর নিচে — এটা স্টেজ করা — আর sentiment.py এখনো আনট্র্যাকড। কোনো ফাইল স্টেজিং এরিয়া থেকে বের করে আনার কমান্ডও Git প্রিন্ট করে দিয়েছে। যা স্টেজ করা আছে সেটা কমিট করুন, এমন একটা মেসেজ দিয়ে যা বলে কমিটটা কী করে:
git commit -m "Add README"[main (root-commit) faa9787] Add README
1 file changed, 3 insertions(+)
create mode 100644 README.mdআউটপুটটা লাইন ধরে পড়ুন: কমিটটা main ব্রাঞ্চে; root-commit মানে এটা প্রথম কমিট, এর কোনো প্যারেন্ট নেই; এর পরের সাতটা অক্ষর হলো কমিটের অনন্য আইডির শুরুটা (এর হ্যাশ — এটা কী থেকে হিসাব হয়, দেখবেন কমিট, হিস্ট্রি ও ডিফ পাতায়); তারপর মেসেজ আর বদলের একটা সারাংশ। create mode 100644 মানে একটা নতুন, সাধারণ (চালানো যায় না এমন) ফাইল।
এবার ক্লাসিফায়ার, তারপর অবস্থা আর হিস্ট্রি দেখুন:
git add sentiment.py
git commit -m "Add rule-based sentiment classifier"
git status
git log --oneline[main 7563c84] Add rule-based sentiment classifier
1 file changed, 20 insertions(+)
create mode 100644 sentiment.py
On branch main
nothing to commit, working tree clean
7563c84 Add rule-based sentiment classifier
faa9787 Add README"nothing to commit, working tree clean" — দিনের কাজ থামানোর বা অন্য কাজে যাওয়ার আগে এই অবস্থাই লক্ষ্য: আপনার দরকারি সবকিছু কোনো না কোনো কমিটে সেভ করা। git log --oneline কমিটগুলোর তালিকা দেয়, নতুনটা আগে।
ট্র্যাক করা ফাইল বদলানো
একটা ফাইল ট্র্যাক হওয়া শুরু হলে Git তার প্রতিটা বদল খেয়াল করে। README-তে ব্যবহারের নিয়ম নিয়ে একটা অংশ যোগ করুন:
cat >> README.md <<'EOF'
## Usage
python3 sentiment.py
EOF
git status
git status -sOn branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
M README.mdফাইলটা মডিফায়েড (modified), কিন্তু স্টেজ করা নয়। git status -s হলো সংক্ষিপ্ত রূপ: দুটো কলাম, প্রথমটা স্টেজিং এরিয়ার, দ্বিতীয়টা ওয়ার্কিং ট্রির; তাই M মানে "বদলেছে, এখনো স্টেজ হয়নি", M মানে "বদলেছে আর স্টেজ হয়েছে", A মানে "নতুন ফাইল, স্টেজ করা" আর ?? মানে "আনট্র্যাকড"। স্টেজ করে কমিট করুন:
git add README.md
git status -s
git commit -m "Document how to run the classifier"
git log --onelineM README.md
[main 3b80ca4] Document how to run the classifier
1 file changed, 4 insertions(+)
3b80ca4 Document how to run the classifier
7563c84 Add rule-based sentiment classifier
faa9787 Add READMEএকসাথে একাধিক ফাইল স্টেজ করার উপায়:
| কমান্ড | যা স্টেজ করে |
|---|---|
git add file1 file2 | শুধু ওই ফাইলগুলো |
git add . | কারেন্ট ফোল্ডার আর তার নিচের প্রতিটা বদল, নতুন ফাইলসহ |
git add -A | পুরো রিপোজিটরির প্রতিটা বদল, মুছে ফেলাসহ |
git commit -a -m "…" | Git আগে থেকে ট্র্যাক করছে এমন ফাইলের জন্য স্টেজিং ধাপটা বাদ দেয় (নতুন ফাইল বাদ পড়ে) |
git add . সুবিধাজনক, আবার অনিচ্ছায় কিছু কমিট করে ফেলার সবচেয়ে সহজ উপায়ও: আপনার API কি-সহ একটা .env, ২ GB-র একটা ডেটাসেট, একটা .venv ফোল্ডার। কমিটের আগে সবসময় git status চালান, আর প্রথম আসল প্রজেক্টের আগেই .gitignore: সিক্রেট আর অপ্রয়োজনীয় ফাইল বাইরে রাখা পাতাটা শিখে নিন।
AI আর ব্যাকএন্ডের কাজে এগুলো কোথায় লাগে
- পুনরায় করা যায় এমন এক্সপেরিমেন্ট: MLflow আর Weights & Biases-এর মতো এক্সপেরিমেন্ট ট্র্যাকার প্রতিটা মডেল যে কোড দিয়ে ট্রেন হয়েছে তার Git কমিট লিখে রাখে, তাই "কোন কোড থেকে এটা এসেছে?"-এর উত্তর সবসময় থাকে।
- প্রম্পটও কোড: LLM অ্যাপ্লিকেশনে সিস্টেম প্রম্পট, few-shot উদাহরণ আর মডেলের সেটিং থাকে রিপোজিটরির ফাইলে, তাই প্রম্পটের বদলও যেকোনো কোডের বদলের মতো রিভিউ হয় আর ফিরিয়ে নেওয়া যায়।
- ডিপ্লয়মেন্ট: প্রতিটা CI/CD সিস্টেম (অ্যাডভান্সড টিউটোরিয়ালে GitHub Actions) একটা নির্দিষ্ট কমিট বিল্ড আর ডিপ্লয় করে; খারাপ একটা রিলিজ ফেরানো মানে আগের একটা কমিট ডিপ্লয় করা।
- AI কোডিং অ্যাসিস্ট্যান্টের সাথে কাজ: কোনো অ্যাসিস্ট্যান্টকে একসাথে অনেক ফাইল বদলাতে দেওয়ার আগে কমিট করুন; ফল ভুল হলে Git এক কমান্ডে আপনাকে আগের অবস্থায় ফিরিয়ে আনে।
সাধারণ ভুল
- ভুল ফোল্ডারে
git initচালানো। হোম ফোল্ডারে চালালে আপনার সবকিছু মিলে একটা বিশাল রিপোজিটরি হয়ে যায়। সবসময় আগেcdদিয়ে প্রজেক্টে ঢুকুন আরpwdচালান। এমনটা ঘটে গেলে ওই.gitফোল্ডারটা (আর শুধু ওটাই) মুছে দিন। - স্টেজ না করে কমিট।
git commitশুধু স্টেজ করা জিনিসই সেভ করে, তাই একটা ফাইল এডিট করেgit addভুলে গেলে পাবেন:echo "Reviews come from the BitByte courses." >> README.md git commit -m "Describe the data"ফাইলটা স্টেজ করুন, তারপর কমিট:On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a")git add README.md git commit -m "Describe the data"[main 542bc11] Describe the data 1 file changed, 1 insertion(+) - রিপোজিটরির বাইরে Git চালানো।
fatal: not a git repository (or any of the parent directories): .gitমানে আপনার কারেন্ট ফোল্ডার কোনো রিপোজিটরির ভেতরে নেই — সাধারণত আপনি ভুল ফোল্ডারে আছেন। - Git-কে নিজের পরিচয় না দিয়েই কমিট।
user.nameআরuser.emailছাড়া Git হয় কমিট করতে অস্বীকার করে ("Author identity unknown"), নয়তো আপনার কম্পিউটারের নাম থেকে একটা ঠিকানা আন্দাজ করে নেয়। ওপরে যেমন দেখানো হয়েছে, দুটোই একবার সেট করে নিন। - দুটো কমিটের মাঝে অনেক দেরি করা। সপ্তাহের শেষে একটা বিশাল কমিট আংশিকভাবে ফেরানো যায় না, আর তা কোনো গল্পও বলে না। কাজ করে এমন প্রতিটা ছোট ধাপ কমিট করুন।
নিজে চেষ্টা করুন
- সহজ:
~/projects/prompt-libraryনামে একটা নতুন রিপোজিটরি বানান, যাতেsummarise.txtফাইলে থাকবেSummarise the text below in three bullet points.লাইনটা;Add summarise promptমেসেজ দিয়ে কমিট করুন, আর এক লাইনের ফরম্যাটে লগ দেখান। - মাঝারি: একই রিপোজিটরিতে দুটো নতুন ফাইল বানান,
translate.txtআরclassify.txt(প্রতিটায় যেকোনো এক লাইনের প্রম্পট)। শুধুtranslate.txtকমিট করুন, তারপর সংক্ষিপ্ত স্ট্যাটাস দেখান। - কঠিন:
sentiment-api-এর একটা সাবফোল্ডার থেকেgit rev-parse --show-toplevelদিয়ে রিপোজিটরির সবচেয়ে ওপরের ফোল্ডার বের করুন। তারপর একই কমান্ড আপনার হোম ফোল্ডার থেকে চালান, আরecho $?দিয়ে এক্সিট কোড দেখুন।
উত্তর
১. নতুন একটা রিপোজিটরি, একটা ফাইল, একটা কমিট:
mkdir -p ~/projects/prompt-library
cd ~/projects/prompt-library
git init -q
echo "Summarise the text below in three bullet points." > summarise.txt
git add summarise.txt
git commit -q -m "Add summarise prompt"
git log --oneline77befcd Add summarise prompt(-q, মানে quiet, সাধারণ মেসেজগুলো লুকিয়ে রাখে; দেখতে চাইলে বাদ দিন।)
২. কমিটে কী যাবে বেছে নিতে নাম ধরে স্টেজ করুন; অন্য ফাইলটা আনট্র্যাকডই থাকে:
echo "Translate the text below into Bangla." > translate.txt
echo "Label the review below as positive, negative or neutral." > classify.txt
git add translate.txt
git commit -q -m "Add translate prompt"
git status -s?? classify.txt৩. Git প্রথমে কারেন্ট ফোল্ডারে, তারপর একে একে প্রতিটা প্যারেন্ট ফোল্ডারে .git খোঁজে, তাই রিপোজিটরির ভেতরে যেকোনো জায়গা থেকে Git কমান্ড চলে। রিপোজিটরির বাইরে এটা এক্সিট কোড 128 দিয়ে ফেল করে:
mkdir -p ~/projects/sentiment-api/data
cd ~/projects/sentiment-api/data
git rev-parse --show-toplevel
cd ~
git rev-parse --show-toplevel
echo "exit code: $?"/home/nadia/projects/sentiment-api
fatal: not a git repository (or any of the parent directories): .git
exit code: 128সারসংক্ষেপ
- ভার্সন কন্ট্রোল একটা প্রজেক্টের প্রতিটা সেভ করা অবস্থা লিখে রাখে — কে, কখন, কেন; Git হলো প্রচলিত টুল, আর এর প্রতিটা কপিতে পুরো হিস্ট্রি থাকে।
- Git হলো প্রোগ্রাম; GitHub হলো Git রিপোজিটরির হোস্টিং সার্ভিস, যার ওপর আছে একসাথে কাজ করার সুবিধা।
- একবার কনফিগার করুন:
user.name,user.emailআরinit.defaultBranch main(Git 3.0 যেটাকে ডিফল্ট করবে)। git initবানায়.gitফোল্ডার, যেটাই রিপোজিটরি। বদলগুলো যায় ওয়ার্কিং ট্রি থেকে স্টেজিং এরিয়ায় (git add), সেখান থেকে হিস্ট্রিতে (git commit)।- প্রতিটা কমিটের আগে
git status; কাজ করে এমন ছোট ছোট ধাপ কমিট করুন।
এরপর: কমিট, হিস্ট্রি ও ডিফ পাতায় দেখবেন কাজের কমিট মেসেজ কীভাবে লিখতে হয়, git log আর git show দিয়ে হিস্ট্রি কীভাবে পড়বেন, git diff দিয়ে ঠিক কী বদলেছে কীভাবে দেখবেন, আর ভেতরে একটা কমিট আসলে কী।