تخطَّ إلى المحتوى

🔀 شرح Git

التهيئة والاستنساخ

الدرس 3 من 28· ⏱ 4 دقائق قراءة· 🗓 آخر تحديث: ١٨ أكتوبر ٢٠٢٦

هناك طريقتان فقط لتبدأ العمل مع Git على مشروع: تحويل مجلّد عندك إلى مستودع بـ git init، أو نسخ مستودع موجود بتاريخه كاملًا بـ git clone.

مشروع جديد أو قائم: git init

cd my-project
git init -b main
Initialized empty Git repository in ~/my-project/.git/

هذا الأمر لا يلمس ملفاتك. كل ما يفعله إنشاء مجلّد مخفي اسمه .git داخل المشروع، وهو "المستودع" الحقيقي: قاعدة بيانات Git التي ستحفظ كل نسخة وكل commit. المجلّد الذي تعمل فيه وتعدّل ملفاته يُسمّى مجلّد العمل (Working Directory).

-b main تسمّي الفرع الأول main (منذ Git 2.28). إن ضبطت init.defaultBranch في درس الإعداد فلا تحتاجها.

وتستطيع إنشاء المجلّد والمستودع معًا: git init new-project.

أول ما تراه

git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

git status أكثر أمر ستكتبه في حياتك مع Git. اكتبه قبل أي خطوة وبعدها: يخبرك أين أنت (أي فرع)، وما الذي تغيّر، وما الخطوة المقترحة التالية بين قوسين.

تحويل مشروع قائم إلى مستودع

لديك مشروع يعمل منذ شهور بلا Git؟ الترتيب مهم:

cd existing-project
git init -b main
# أنشئ .gitignore أولًا، قبل أي add
echo "node_modules/" >> .gitignore
echo ".env" >> .gitignore
git add .
git commit -m "Initial commit"

إنشاء .gitignore قبل أول git add . يمنع آلاف ملفات المكتبات، والأخطر ملف الأسرار .env، من دخول التاريخ. إخراجها لاحقًا ممكن، لكن ما دخل التاريخ يبقى فيه.

مستودع موجود: git clone

git clone https://github.com/user/repo.git
cd repo

clone يفعل أربعة أشياء دفعة واحدة:

  1. ينشئ مجلّدًا باسم المستودع (repo)، أو باسم تختاره: git clone <url> my-folder.
  2. ينزّل التاريخ كاملًا: كل commit وكل فرع، لا آخر نسخة فقط.
  3. يسجّل مصدر النسخ كمستودع بعيد باسم origin.
  4. يفتح الفرع الافتراضي (غالبًا main) ويربطه بـ origin/main.
git remote -v
git branch -vv
origin	https://github.com/user/repo.git (fetch)
origin	https://github.com/user/repo.git (push)
* main a8b6e0e [origin/main] Add login page

[origin/main] تعني أن main عندك يتتبّع main على origin، فيعرف git pull وgit push إلى أين يذهبان دون أن تقول لهما. التفاصيل في درس المستودعات البعيدة.

HTTPS أم SSH؟

https://github.com/user/repo.gitgit@github.com:user/repo.git
الإعدادلا شيء للمستودعات العامةمفتاح SSH مرة واحدة
الرفع (push)يحتاج رمز وصول (Token)، لا كلمة مرور الحسابيعمل تلقائيًّا بالمفتاح

كلاهما ينسخ نفس المستودع. للمستودعات التي ستعمل عليها يوميًّا، SSH أريح.

مستودع ضخم؟ النسخ السطحي

git clone --depth 1 https://github.com/user/huge-repo.git

ينزّل آخر commit فقط بلا التاريخ. مفيد لتجربة مشروع ضخم أو في خوادم البناء (CI). الثمن: git log لا يرى إلا commitًا واحدًا، وبعض العمليات على التاريخ لا تعمل.

داخل مجلّد .git

.git/
├── HEAD        ← أي فرع تقف عليه الآن: ref: refs/heads/main
├── config      ← إعدادات المستودع (--local) والمستودعات البعيدة
├── objects/    ← كل محتوى الملفات والـ commits، مضغوطًا
├── refs/       ← الفروع والوسوم: كل منها ملف صغير يحمل رقم commit
└── hooks/      ← سكربتات تعمل تلقائيًّا عند أحداث معيّنة

لن تعدّل هذه الملفات يدويًّا، لكن معرفة أنها موجودة تزيل الغموض: الفرع ليس نسخة من المشروع، بل ملف نصّي فيه رقم. تتعمّق في هذا في درس آلية Git الداخلية، وفي hooks/ في درس الخطافات.

حذف .git يحذف التاريخ كله: الملفات الحالية تبقى، لكن كل commit وكل فرع لم يُرفع يختفي نهائيًّا.

أخطاء شائعة

  • git init في المجلّد الخطأ (مجلّد المستخدم كله مثلًا): فجأة يظهر كل جهازك في git status. احذف .git الذي أنشأته في ذلك المجلّد فقط.
  • مستودع داخل مستودع: git init في مجلّد فرعي لمشروع هو مستودع أصلًا. المستودع الخارجي يرفض إضافته (does not have a commit checked out) أو يعامله كمرجع لا كملفات. للحالات المقصودة هناك المستودعات الفرعية Submodules.
  • git add . قبل .gitignore: مكتبات وأسرار تدخل التاريخ.
  • clone داخل مستودع آخر: نفس مشكلة المستودع المتداخل. اخرج أولًا بـ cd ...
  • كلمة مرور حساب GitHub عند الرفع بـ HTTPS: GitHub يرفضها. تحتاج رمز وصول أو SSH.

🎯 التالي: منطقة التجهيز والـ commit.

شرح التهيئة والاستنساخ — Git بالعربي
التهيئة والاستنساخ — Git بالعربي · The Code Fix

📚 لمزيد من التعمّق في Git، راجِع التوثيق الرسمي لـ Git.

هل كان هذا الدرس مفيدًا؟