Git 2026

فصل ۴ · اولین مخزن

اولین مخزن — init تا log

در این فصل یک پوشه را به مخزن Git تبدیل می‌کنی، دو کامیت با پیام روشن می‌نویسی، و با log می‌بینی تاریخچه دقیقاً چه شکلی شده.

🎯 اهداف یادگیری

  • مخزن را از صفر با git init یا از VS Code بسازی
  • پیام کامیت خوب بنویسی
  • log را با گراف بخوانی
  • تفاوت --allow-empty و کامیت واقعی را بدانی

🚀 ساخت مخزن

روش ۱ — ترمینال (پایه)

init تمیز
mkdir git-lab && cd git-lab
git init -b main
# Initialized empty Git repository in .../.git/

echo "# Git Lab" > README.md
git add README.md
git status
git commit -m "chore: bootstrap repository"

پرچم -b main شاخهٔ پیش‌فرض را master نمی‌گذارد. اگر فراموش کردی: git config --global init.defaultBranch main.

روش ۲ — VS Code (توصیهٔ این کتاب)

  1. پوشه را با File → Open Folder باز کن
  2. نوار کناری آیکون Git را بزن (Ctrl+Shift+G)
  3. دکمهٔ Initialize Repository
  4. فایل بساز، در Changes ظاهر می‌شود
  5. پیام را بنویس و Ctrl+Enter

اگر پنل خالی دیدی و دکمهٔ Initialize نبود، یا پوشه Git ندارد یا Git در PATH نیست.

✍️ پیام کامیت — قرارداد این کتاب

از Conventional Commits استفاده می‌کنیم (فصل ۲۲ عمیق می‌شود):

قالب
type(scope): summary

بدنهٔ اختیاری — چرا، نه چه.

انواع رایج: feat، fix، docs، chore، refactor، test، ci.

خوب

feat(auth): add refresh-token rotation

چرا: نوع + محدوده + فعل امری + نتیجه.

بد

update یا fix bug یا asdf

تاریخچهٔ بی‌معنی، git log را به زباله‌دان تبدیل می‌کند.

در VS Code پیام را در جعبهٔ بالا می‌نویسی. Ctrl+Enter کامیت می‌کند. اگر Smart Commit روشن باشد و چیزی stage نشده باشد، همه چیز را قورت می‌دهد — در فصل ۲ آن را خاموش کردیم.

📜 خواندن تاریخچه

log به سبک Senior
git log --oneline --decorate --graph --all
git log -1 -p                 # آخرین کامیت + diff
git show HEAD                 # معادل بالا
git log --author="rezaian" --since="2 weeks ago"
git shortlog -sn              # چه کسی چقدر کامیت کرده

در VS Code:

  • Timeline زیر فایل → تاریخچهٔ همان فایل
  • Git Graph / GitLens → کل DAG
  • کلیک روی کامیت در Source Control → جزئیات

🔬 داخل .git چه خبر است؟

تور سریع
ls .git
# HEAD  config  description  hooks  info  objects  refs

cat .git/HEAD          # ref: refs/heads/main
cat .git/refs/heads/main
# 9f3a1c...  ← هش کامیت فعلی

هنوز لازم نیست packfile را بفهمی (فصل ۳۰). فقط بدان: هر چیز ماندگار اینجاست؛ پاک کردن .git یعنی قتل تاریخچه.

amend برای ۵ دقیقهٔ اول

اگر همین الان پیام را غلط نوشتی و هنوز push نکرده‌ای:

git commit --amend -m "docs: fix readme title"

در VS Code: تیک Amend کنار دکمهٔ Commit (منوی کشویی ✓).

هرگز amend بعد از push

--amend هش را عوض می‌کند. اگر دیگران آن کامیت را گرفته‌اند، تاریخچه دوپاره می‌شود. قانون: فقط کامیت محلیِ pushنشده.

سؤالات مصاحبه (با پاسخ)

Junior — git init چه می‌سازد؟ پوشهٔ .git با HEAD، objects، refs و config.

Mid — چرا پیام امری می‌نویسیم؟ کامیت را مثل وصله بخوان: «این وصله refresh-token را اضافه می‌کند.» نه «اضافه کردم.»

Senior — تفاوت git log -p و git show؟ show یک شیء را نمایش می‌دهد؛ log -p پیمایش تاریخچه با diff هر کامیت است.

✅ چک‌لیست فهم

  • مخزن با شاخهٔ main ساخته‌ای
  • حداقل دو کامیت Conventional داری
  • git lg (یا alias) گراف را نشان می‌دهد
  • می‌دانی .git قلب مخزن است

فصل بعد: اشیای Git — blob، tree، commit و جادوی hash.

فصل ۴ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0