الأخطاء الشائعة وحلولها¶
معظم أخطاء Git التي ستقابلها عند العمل مع ليڤانت غيت تعود إلى أربعة أسباب: SSH key لا يعرفه
الخادم، أو مصادقة HTTPS تحتاج access token، أو push مرفوض لأن الـ remote متقدّم على نسختك، أو
merge conflict. تجمع هذه الصفحة الرسائل كما تظهر في الطرفية، ولكل واحدة سببها وحلّها؛ ابحث عن
نص رسالتك في الصفحة (Ctrl+F) وابدأ منه.
نصيحة
قبل أي شيء، اقرأ رسالة Git كاملة. غالبًا يقترح الأمر الصحيح في السطر الأخير.
Permission denied (publickey)¶
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
السبب: تستخدم رابط SSH لكن الخادم لا يعرف الـ public key الخاص بك، أو الـ private key غير محمّل على جهازك.
الحل:
- تأكد أن لديك SSH key وأن الـ public key مضاف في Settings ← SSH / GPG Keys على ليڤانت غيت. الخطوات في مفاتيح SSH.
- اختبر الاتصال:
ssh -T [email protected]
- إن كان المفتاح في مسار غير افتراضي أو بعبارة سر، حمّله:
ssh-add ~/.ssh/id_ed25519.
Authentication failed عبر HTTPS¶
remote: Invalid username or password.
fatal: Authentication failed for 'https://levantgit.com/user/repo.git/'
السبب: كلمة السر خاطئة، أو الـ 2FA مفعّل في حسابك، وعندها لا تُقبل كلمة السر لتنفيذ push عبر HTTPS أصلًا.
الحل: أنشئ access token من Settings ← Applications، وامنحه صلاحية الكتابة على الـ repositories، ثم استخدمه مكان كلمة السر عند الطلب. إن كان نظامك حفظ كلمة سر قديمة، احذفها من مدير بيانات الاعتماد (على ويندوز: Credential Manager؛ على ماك: Keychain Access) أو:
أو انتقل إلى SSH وانسَ الموضوع نهائيًا.
! [rejected] ... (fetch first) أو non-fast-forward¶
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://levantgit.com/user/repo.git'
hint: Updates were rejected because the remote contains work that you do not have locally.
السبب: شخص آخر (أو أنت من جهاز آخر) نفّذ push لـ commits إلى الـ branch نفسه بعد آخر pull لك. Git يرفض أن يمسح عمل غيرك.
الحل: نفّذ pull أولًا، ثم push:
إن ظهر تعارض أثناء الـ pull فراجع فقرة «الـ merge conflict» أدناه.
خطر
لا تستخدم git push --force لتجاوز هذا الخطأ على branch مشترك؛ ستمحو commits زملائك من
الـ remote.
fatal: not a git repository¶
السبب: أنت تنفّذ الأمر خارج مجلد المشروع، أو المجلد ليس repository بعد.
الحل: انتقل إلى مجلد المشروع بـ cd. وإن كان مشروعًا جديدًا لم يُربط بـ Git بعد، نفّذ
git init داخله، أو نفّذ clone للـ repository من ليڤانت غيت بدل ذلك.
fatal: refusing to merge unrelated histories¶
السبب: أنشأت repository على ليڤانت غيت مع README أو رخصة، وفي الوقت نفسه بدأت repository
محليًا بـ git init وصنعت فيه commits. الآن للطرفين تاريخان لا يلتقيان.
الحل: مرة واحدة فقط:
ثم حلّ أي تعارض في README ونفّذ commit ثم push. لتجنّب ذلك مستقبلًا: إمّا أن تنشئ الـ repository على الموقع فارغًا، أو أن تنفّذ له clone أولًا ثم تنسخ ملفاتك إليه.
الـ merge conflict¶
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
السبب: تعديلان مختلفان على الأسطر نفسها، ولا يستطيع Git أن يختار بينهما.
الحل: افتح الملف، ابحث عن <<<<<<<، اترك النص الصحيح واحذف العلامات، ثم
git add index.html وgit commit. الشرح المفصّل مع مثال في
الـ branches والـ pull requests. وإن أردت إلغاء
المحاولة كلها والعودة إلى ما قبلها: git merge --abort.
You are in 'detached HEAD' state¶
السبب: انتقلت إلى commit محدّدة أو إلى tag بدل branch، مثل git checkout a1b2c3d.
الـ HEAD — وهو المؤشّر الذي يدلّ على موضعك في التاريخ — لا يشير الآن إلى branch، وأي commit
جديدة قد تضيع.
الحل: إن كنت تتصفّح فقط، عُد بـ git switch main. وإن صنعت commit تريد الاحتفاظ بها، أنشئ
branch في مكانك أولًا:
نفّذت push لسرّ بالخطأ (كلمة سر، مفتاح API)¶
خطر
عُدّ السرّ مكشوفًا فور تنفيذ الـ push، حتى لو كان الـ repository خاصًا وحذفته بعد دقيقة.
الحل:
- غيّر السرّ فورًا من مصدره (أعد توليد المفتاح، بدّل كلمة السر). هذه الخطوة الأهم ولا يغني عنها شيء.
- احذفه من الملفات، وأضف الملف إلى
.gitignore، ثم نفّذ commit و push. - حذفه من تاريخ الـ repository يحتاج إعادة كتابة التاريخ وهو موضوع متقدّم؛ ابدأ من
دليل Git الرسمي وأداة
git filter-repo. تذكّر أن النسخ التي نفّذ لها الآخرون clone تبقى تحمل السرّ القديم.
رفض ملف كبير¶
السبب: نفّذت push لملف ضخم (فيديو، قاعدة بيانات، أرشيف) تجاوز الحد المسموح، أو أصبح الـ repository بطيئًا جدًا بسبب الملفات الثنائية.
الحل: Git مصمَّم للنصوص لا للملفات الكبيرة. أخرج الملف من الـ commit (إن كان في آخر commit:
git rm --cached bigfile.zip ثم git commit --amend)، وأضفه إلى .gitignore. وللملفات
الكبيرة التي لا غنى عنها استخدم Git LFS إن كان مفعّلًا على الـ repository؛ راجع
الـ push وخياراته.
الاسم أو البريد الإلكتروني خاطئ في الـ commits¶
السبب: لم تضبط هويتك في Git، فظهرت الـ commits باسم الجهاز أو بهوية قديمة.
الحل: اضبطها مرة واحدة لكل الجهاز، وبالبريد نفسه المسجَّل في ليڤانت غيت حتى تُنسب الـ commits إلى حسابك:
git config --global user.name "اسمك"
git config --global user.email "[email protected]"
لتصحيح آخر commit فقط: git commit --amend --reset-author. الـ commits الأقدم تحتاج إعادة
كتابة التاريخ (متقدّم، انظر الفقرة السابقة).
remote origin already exists¶
السبب: تحاول git remote add origin ... في repository له origin أصلًا (نفّذت له clone من
مكان آخر غالبًا).
الحل: بدّل الرابط بدل الإضافة:
التفاصيل في تغيير الـ remote محليًا.
تحذير نهايات الأسطر على ويندوز (CRLF)¶
warning: in the working copy of 'index.html', LF will be replaced by CRLF the next time Git touches it
السبب: ويندوز ينهي الأسطر بـ CRLF بينما لينكس وماك بـ LF. Git يحوّل بينهما ويحذّرك.
التحذير غير ضار غالبًا.
الحل: على ويندوز اختر التحويل التلقائي:
وعلى ماك ولينكس core.autocrlf input. وللمشاريع المشتركة الأفضل ملف .gitattributes في
جذر المشروع يحوي السطر * text=auto حتى يتصرّف الجميع بالطريقة نفسها.
ما زال الخطأ قائمًا؟¶
git statusيشرح الحالة الحالية ويقترح الخطوة التالية.git <command> --helpيفتح الدليل الكامل للأمر.- كتاب Pro Git مجاني وفيه كل التفاصيل.
ليڤانت غيت خدمة مجانية تُقدَّم كما هي ضمن مبادرة مجتمعية من ليڤانت هوست، دون التزام دعم؛ لذا الاعتماد على هذه المصادر هو الطريق الأسرع.
أسئلة شائعة¶
لماذا يرفض git push التعديلات؟¶
غالبًا لأن أحدهم — أو أنت من جهاز آخر — نفّذ push إلى الـ branch نفسه بعد آخر pull لك، فيرفض Git
أن يمسح عمل غيرك برسالة rejected أو non-fast-forward. الحل أن تنفّذ git pull ثم git push.
ولا تستخدم git push --force على branch مشترك.
ماذا تعني رسالة not a git repository؟¶
تعني أنك تنفّذ أمر Git خارج مجلد يتتبّعه Git. انتقل إلى مجلد المشروع بأمر cd وأعد المحاولة. وإن
كان المجلد جديدًا ولم يُربط بـ Git بعد فنفّذ git init داخله، أو نفّذ clone للـ repository من
ليڤانت غيت بدل ذلك.
لماذا يطلب مني Git كلمة المرور في كل push؟¶
لأن الـ remote مضبوط على رابط HTTPS لا SSH. افحصه بأمر git remote -v، وإن بدأ بـ https فبدّله
برابط SSH عبر git remote set-url origin. وإن بقيت على HTTPS فاستخدم access token من Settings
← Applications بدل كلمة المرور، خاصةً مع الـ 2FA.
نفّذت push لكلمة سر بالخطأ، ماذا أفعل؟¶
عُدّ السرّ مكشوفًا فورًا، حتى لو كان الـ repository خاصًا وحذفته بعد دقيقة. غيّره من مصدره أولًا
وأعد توليد المفتاح، ثم احذفه من الملفات وأضف الملف إلى .gitignore ونفّذ commit ثم push. أما حذفه
من تاريخ الـ repository فيحتاج إعادة كتابة التاريخ، وهو موضوع متقدّم.
ماذا بعد؟¶
- دورة العمل اليومية — الحلقة الصحيحة تمنع معظم هذه الأخطاء.
- مفاتيح SSH — تخلّص من مشاكل كلمات السر والـ tokens.
- ورقة أوامر Git — الأوامر المذكورة هنا وغيرها.