دليل

مستودع Git: كيف تنشئه بـ git init وتربطه بـ remote

آخر تحديث: · Skillaria.Top

مستودع Git هو مجلد المشروع مع المجلد المخفي .git الذي يحفظ فيه Git كل التاريخ والفروع والإعدادات. ينشأ بالأمر git init داخل مجلد المشروع، أو يُنزَّل جاهزاً بـ git clone. ويُربط المستودع البعيد بالأمر git remote add origin العنوان.

مستودع Git هو المشروع الذي يتابع Git تغييراته. فعملياً هو مجلد عادي فيه ملفاتك، إضافة إلى مجلد مخفي باسم .git يحفظ فيه Git التاريخ كله: الـ commits والفروع والوسوم والإعدادات. احذف .git وستبقى الملفات وحدها دون أي نسخة سابقة.

مكونات المستودع

عند العمل مع Git من المفيد أن تتذكر ثلاث مناطق تنتقل بينها التغييرات:

  • مجلد العمل (working tree) — الملفات التي تراها وتحررها؛
  • الفهرس (staging area) — مسودة الـ commit التالي، وتصل إليها التغييرات عبر git add؛
  • التاريخ — قاعدة الـ commits داخل .git، وتصل إليها التغييرات عبر git commit.

بمعنى دقيق، المستودع نفسه هو محتوى .git. ومجلد العمل ليس إلا نسخة «مفرودة» واحدة للمشروع يستخرجها Git من التاريخ.

كيف تنشئ مستودع Git بالأمر git init

انتقل إلى مجلد المشروع ونفّذ أمراً واحداً:

cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/

يمكن إنشاء المستودع في مجلد فارغ، ويمكن أيضاً في مجلد توجد فيه ملفات. وفي الحالة الثانية لا يضيع شيء: تصبح الملفات الموجودة غير متعقَّبة (untracked) إلى أن تضيفها بـ git add.

خيارات مفيدة للأمر:

# إنشاء المجلد والمستودع داخله دفعة واحدة
git init my-app

# تسمية الفرع الأول (وإلا فسيكون master أو حسب الإعدادات)
git init -b main

# جعل main الفرع الافتراضي لكل المستودعات الجديدة
git config --global init.defaultBranch main

أول commit

المستودع الفارغ من الـ commits قليل الفائدة. وعادةً بعد git init تفعل التالي:

git config --global user.name "إيفان بتروف"
git config --global user.email "ivan@example.com"

git status
git add .
git commit -m "البنية الأولية للمشروع"

يُضبط الاسم والبريد مرة واحدة على الجهاز، ويُكتبان في كل commit. وبدونهما يرفض Git الـ commit ويطلب منك التعريف بنفسك.

أضف .gitignore فوراً

قبل أول git add . أنشئ ملف .gitignore يسرد ما لا يجوز أن يدخل المستودع: التبعيات والبناءات والأسرار ومخلفات الـ IDE.

node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/

إذا دخل الملف إلى الـ commit من قبل، فلن يزيله .gitignore. يجب إيقاف تعقبه مع إبقائه على القرص: git rm --cached .env، ثم commit.

ما الذي يوجد داخل مجلد .git

لا حاجة للنظر فيه في العمل اليومي، لكن فهم بنيته يجيب عن كثير من الأسئلة:

العنصرماذا يحفظ
objects/الكائنات المضغوطة: محتوى الملفات (blob)، وبنية المجلدات (tree)، والـ commits
refs/heads/الفروع — ملفات فيها hash آخر commit
refs/tags/الوسوم
HEADمؤشر إلى الفرع الحالي، مثل ref: refs/heads/main
configإعدادات هذا المستودع، بما فيها قائمة الـ remotes
indexحالة منطقة التجهيز (staging area)
hooks/سكربتات تُشغَّل عند أحداث مثل pre-commit وpre-push

والنتيجة المهمة: الفرع في Git ملف صغير فيه hash واحد. ولهذا يكون إنشاء الفروع فورياً ومجانياً.

كيف تتحقق أن المجلد مستودع

git status
# أو بدقة أكبر
git rev-parse --is-inside-work-tree

خارج المستودع ستحصل على fatal: not a git repository (or any of the parent directories): .git. لاحظ عبارة «parent directories»: يبحث Git عن .git في المجلدات الأعلى أيضاً. وإذا نفذت git init بالخطأ في مجلدك الشخصي، فسيصبح كله مستودعاً — وعليك حذف هذا المجلد .git.

المستودع المحلي والبعيد

المستودع الذي أنشأته بـ git init موجود على حاسوبك فقط. ولكي تشارك الكود وتملك نسخة احتياطية، تربطه بمستودع بعيد (remote) — نسخة على خادم: GitHub أو GitLab أو Bitbucket أو خادم Git خاص بك.

المستودع البعيد ليس «الرئيسي» من ناحية Git: فكل نسخة كاملة وتحوي التاريخ كله. ويصبح مركزياً فقط باتفاق الفريق.

git remote: ربط المستودع البعيد

الـ remote اسم قصير لعنوان الخادم. والاسم الأساسي بالاتفاق هو origin.

# إضافة remote
git remote add origin git@github.com:username/my-app.git

# عرض القائمة مع العناوين
git remote -v
origin  git@github.com:username/my-app.git (fetch)
origin  git@github.com:username/my-app.git (push)

ثم أرسل الفرع واربطه بالفرع البعيد:

git push -u origin main

أوامر git remote الأساسية

الأمرماذا يفعل
git remote -vعرض الـ remotes مع العناوين
git remote add <الاسم> <url>ربط مستودع بعيد جديد
git remote set-url origin <url>تغيير العنوان، مثلاً من HTTPS إلى SSH
git remote rename origin oldإعادة تسمية الـ remote
git remote remove oldحذف الـ remote (الخادم نفسه لا يتأثر)
git remote show originتفاصيل: الفروع، والتتبع، وما الذي يتأخر

صيغ العناوين

  • https://github.com/user/repo.git — HTTPS، يعمل في كل مكان، وللكتابة يلزم رمز وصول (token)؛
  • git@github.com:user/repo.git — SSH، يلزم مفتاح، وبعد الضبط لا تُطلب كلمات مرور؛
  • /srv/git/repo.git أو file:///srv/git/repo.git — مسار محلي، مناسب للتجارب.

أخطاء شائعة

«error: remote origin already exists». يوجد remote بهذا الاسم. إذا أردت تغيير العنوان فاستخدم git remote set-url origin <url>، لا تكرر add.

«failed to push some refs» / «Updates were rejected». يوجد على الخادم commits ليست لديك — غالباً README أُنشئ مع إنشاء المستودع على الموقع. نفّذ git pull --rebase origin main وأعد push. وإذا كانت التواريخ غير مرتبطة إطلاقاً سيرد Git «refusing to merge unrelated histories» — عندها يحتاج git pull إلى الخيار --allow-unrelated-histories. والأسهل أن تُنشئ المستودع على الموقع فارغاً.

«src refspec main does not match any». تحاول إرسال فرع غير موجود: إما لم يكن هناك أي commit بعد، أو أن الفرع اسمه master. تحقق بـ git branch.

خادم Git خاص بك: المستودع bare

GitHub ليس إلزامياً. يمكن أن يكون الـ remote أي جهاز تملك فيه وصول SSH. ولذلك تُنشأ على الخادم مستودع «عارٍ» (bare) — بلا مجلد عمل، وفيه محتوى .git فقط:

# على الخادم
ssh user@server
git init --bare /srv/git/my-app.git

# على حاسوبك
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main

للعمل مع هذا الخادم بين ثلاثة أشخاص يكفي منح الزملاء وصول SSH إلى مجلد المستودع، ومجموعة مشتركة لها صلاحية الكتابة. أما تحديد الصلاحيات حسب الفروع والمشاريع فلا يكفي هذا لأجله، وهنا تحتاج إلى استضافة Git متكاملة.

لا يمكن «الدخول إلى» المستودع bare وتعديل ملف فيه — إنه مخصص للتبادل عبر push وfetch فقط. وهكذا تعمل المستودعات على أي منصة Git. وإن أردت واجهة ويب ومراجعة ومهاماً، فاستخدم حلولاً تستضيفها بنفسك مثل GitLab أو Gitea أو Forgejo.

الفروع البعيدة المتتبَّعة: كيف يرى المستودع المحلي الخادم

بعد ربط remote وأول git fetch أو git push تظهر في المستودع فروع بعيدة مثل origin/main. وهذه ليست فروعاً على الخادم، بل لقطات محلية لما رأيته على الخادم في آخر مزامنة. وتُحدَّث فقط عند fetch وpull وpush.

ومن هنا الفرق بين أوامر التبادل الثلاثة:

الأمرماذا يغيّر
git fetchيحدّث origin/*، ولا يمس فروعك وملفاتك
git pullfetch + دمج origin/main في الفرع الحالي
git pushيرسل commits الخاصة بك ويحدّث الفرع على الخادم

لتعرف مدى تأخر فرعك أو تقدمه:

git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]

هنا لديك commitان غير موجودين على الخادم، وcommit واحد على الخادم غير موجود لديك. يجب قبل push أن تسحب هذا الـ commit أولاً.

يُحدَّد ربط الفرع المحلي بالبعيد (upstream) بالعلامة -u عند أول push. وإذا نسيتها فيمكن ضبطه لاحقاً: git branch --set-upstream-to=origin/main. ولعرض كل الروابط: git branch -vv.

عدة مستودعات: مستودع واحد أم مستودع لكل مشروع

سؤال شائع عند المبتدئين: كم مستودعاً ينبغي أن أنشئ؟ القاعدة البسيطة: مستودع واحد لكل وحدة تُطوَّر وتُصدر بشكل مستقل. فالمشاريع التعليمية والمشاريع الشخصية الصغيرة والخدمات المنفصلة كل منها مستودع. ولا تنشئ مستودعاً واحداً لمجلد «مشاريعي» كله: فيختلط التاريخ، ويصبح نشر مشروع واحد في ملف الأعمال أمراً صعباً.

الشركات الكبيرة تحتفظ أحياناً بكل الكود في مستودع واحد ضخم (monorepo) من أجل التغييرات المشتركة والبناء الموحد، لكن هذا قرار معماري واعٍ بأدوات خاصة به. والمبتدئ يبدأ بقاعدة «مشروع واحد — مستودع واحد»، ولا يُدخل مستودعاً داخل آخر دون وحدات فرعية (submodules).

git init أم git clone

الموقفالأمر
تبدأ مشروعاً جديداً من الصفرgit init
يوجد مجلد كود بلا تحكم في الإصداراتgit init داخل هذا المجلد
المشروع موجود على GitHub أو خادمgit clone <url>
تحتاج إلى مستودع مركزي على خادمكgit init --bare

بعد git clone يكون الـ remote باسم origin مضبوطاً مسبقاً، فلا داعي لإضافته يدوياً.

سيناريو خطوة بخطوة: من مجلد إلى مستودع على GitHub

  1. أنشئ مجلد المشروع ونفّذ git init -b main.
  2. أضف .gitignore وREADME.
  3. نفّذ أول commit: git add . ثم git commit -m "Initial commit".
  4. أنشئ على GitHub مستودعاً فارغاً — بلا README ولا ترخيص ولا .gitignore.
  5. اربطه: git remote add origin <العنوان>.
  6. أرسل الكود: git push -u origin main.
  7. بعد ذلك اعمل بدورة: تعديلات ← git add ← git commit ← git push.

الخلاصة

مستودع Git هو مشروعك مع مجلد .git الذي يحوي التاريخ كاملاً. ينشأ بالأمر git init، ويُربط بالخادم عبر git remote add origin وأول git push -u. والمستودع البعيد قد يكون GitHub أو GitLab أو خادم Git خاصاً بك يعمل بمستودع bare. والعمل على الفهرس والمستودع الأول وربط remote مشروح عملياً في دورة Git.

الأسئلة الشائعة

كيف أحذف مستودع Git وأبقي الملفات؟

احذف المجلد المخفي .git في جذر المشروع: rm -rf .git في Linux وmacOS. تبقى الملفات، لكن يضيع كل تاريخ الإصدارات.

هل يمكن تنفيذ git init في مجلد فيه مستودع بالفعل؟

نعم، وهذا آمن: يرد Git بعبارة Reinitialized existing Git repository ولا يمس التاريخ، ويكمل فقط الملفات الخدمية الناقصة.

كم remote يمكن ربطه بمستودع واحد؟

عدد غير محدود. مثلاً origin لفرعك الخاص من المشروع، وupstream للمشروع الأصلي — وهكذا يعمل معظم المطورين في المشاريع مفتوحة المصدر.

أين تُحفظ إعدادات مستودع معين؟

في الملف .git/config. أما إعدادات المستخدم العامة فتقع في ~/.gitconfig وتُضبط بـ git config --global.

ما الفرق بين المستودع bare والعادي؟

المستودع bare لا يحوي مجلد عمل بالملفات، بل بيانات Git الخدمية فقط. ويُستخدم مستودعاً مركزياً على الخادم يُرسَل إليه بـ push.

تعلّم هذا الموضوع بالفيديو

يُشرح هذا الموضوع بالتفصيل مع التطبيق العملي في دورة «Git من الصفر إلى مطور واثق».

الانتقال إلى الدورة