هناك طريقتان فقط لتبدأ العمل مع 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 يفعل أربعة أشياء دفعة واحدة:
- ينشئ مجلّدًا باسم المستودع (
repo)، أو باسم تختاره:git clone <url> my-folder. - ينزّل التاريخ كاملًا: كل commit وكل فرع، لا آخر نسخة فقط.
- يسجّل مصدر النسخ كمستودع بعيد باسم
origin. - يفتح الفرع الافتراضي (غالبًا
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.git | git@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.