Git و GitHub

التراجع عن التغييرات

13 دقيقة الدرس 8 من 35

التراجع عن التغييرات

الأخطاء تحدث، وتوفر Git أدوات قوية للتراجع عن التغييرات بأمان. في هذا الدرس، ستتعلم متى وكيفية استخدام أوامر التراجع المختلفة، من استعادة الملفات البسيطة إلى إعادة كتابة التاريخ المعقدة.

فهم عمليات التراجع

تقدم Git أوامر تراجع مختلفة لسيناريوهات مختلفة:

Git Restore: التراجع عن التغييرات في دليل العمل ومنطقة التنظيم Git Reset: نقل مؤشر الفرع واختيارياً تغيير التنظيم/العمل Git Revert: إنشاء التزام جديد يتراجع عن التزام سابق Git Clean: إزالة الملفات والأدلة غير المتتبعة
المبدأ الأساسي: استخدم git restore و git revert للعمليات الآمنة. استخدم git reset بحذر، خاصة مع --hard. لا تعيد أبداً كتابة التاريخ الذي تم دفعه إلى مستودع مشترك.

Git Restore - الطريقة الحديثة للتراجع

Git restore (مقدم في Git 2.23) هو الطريقة الأكثر أماناً للتراجع عن التغييرات:

# تجاهل التغييرات في دليل العمل (الاستعادة من التنظيم) git restore filename.txt # استعادة ملفات متعددة git restore file1.txt file2.txt # استعادة جميع الملفات في الدليل git restore . # إلغاء تنظيم ملف (إزالة من منطقة التنظيم) git restore --staged filename.txt # الاستعادة من التزام محدد git restore --source=HEAD~2 filename.txt # الاستعادة وإلغاء التنظيم في وقت واحد git restore --staged --worktree filename.txt
تحذير: git restore بدون --staged يتجاهل بشكل دائم التغييرات غير الملتزمة في دليل عملك. تأكد من أنك تريد حقاً فقدان تلك التغييرات!

إلغاء تنظيم الملفات

إزالة الملفات من منطقة التنظيم دون فقدان التغييرات:

# إلغاء تنظيم ملف محدد (Git 2.23+) git restore --staged filename.txt # إلغاء تنظيم جميع الملفات git restore --staged . # الطريقة القديمة (لا تزال تعمل) git reset HEAD filename.txt # إلغاء التنظيم والاحتفاظ بتغييرات دليل العمل git reset HEAD

Git Reset - نقل مؤشر الفرع

Git reset له ثلاثة أوضاع بمستويات مختلفة من التدمير:

--soft: نقل HEAD، الاحتفاظ بالتنظيم ودليل العمل --mixed (الافتراضي): نقل HEAD، إعادة تعيين التنظيم، الاحتفاظ بدليل العمل --hard: نقل HEAD، إعادة تعيين التنظيم ودليل العمل # إعادة تعيين إلى الالتزام السابق (الاحتفاظ بالتغييرات منظمة) git reset --soft HEAD~1 # إعادة تعيين إلى الالتزام السابق (إلغاء التنظيم، الاحتفاظ في دليل العمل) git reset --mixed HEAD~1 git reset HEAD~1 # نفس ما سبق (--mixed هو الافتراضي) # إعادة تعيين إلى الالتزام السابق (تجاهل جميع التغييرات) git reset --hard HEAD~1 # إعادة تعيين إلى التزام محدد git reset --hard abc123 # إعادة تعيين إلى حالة الفرع البعيد git reset --hard origin/main
مساعد الذاكرة: فكر في أوضاع إعادة التعيين على أنها مستويات من "التراجع": --soft = التراجع عن الالتزام فقط، --mixed = التراجع عن الالتزام + إلغاء التنظيم، --hard = التراجع عن كل شيء (الخيار النووي).

أمثلة عملية على Reset

سيناريوهات شائعة لاستخدام git reset:

# السيناريو 1: التراجع عن آخر التزام ولكن الاحتفاظ بالتغييرات git reset --soft HEAD~1 # تحرير الملفات، ثم إعادة الالتزام برسالة أفضل # السيناريو 2: إزالة آخر 3 التزامات تماماً git reset --hard HEAD~3 # السيناريو 3: إلغاء تنظيم جميع الملفات git reset # السيناريو 4: تجاهل جميع التغييرات المحلية ومطابقة البعيد git fetch origin git reset --hard origin/main # السيناريو 5: التراجع إلى التزام محدد بواسطة hash git reset --hard 2f8a7e9
تحذير حاسم: git reset --hard يحذف بشكل دائم التغييرات غير الملتزمة. لا يوجد تراجع! استخدمه فقط عندما تكون متأكداً تماماً من أنك تريد تجاهل كل العمل.

Git Revert - التراجع العام الآمن

Revert ينشئ التزاماً جديداً يتراجع عن التزام سابق - آمن للتاريخ المشترك:

# التراجع عن آخر التزام git revert HEAD # التراجع عن التزام محدد git revert abc123 # التراجع دون إنشاء التزام فوراً (تنظيم التغييرات) git revert --no-commit abc123 # التراجع عن نطاق من الالتزامات git revert HEAD~3..HEAD # التراجع عن التزامات محددة متعددة git revert abc123 def456 ghi789 # إلغاء التراجع قيد التقدم git revert --abort # المتابعة بعد حل التعارضات git revert --continue

Reset مقابل Revert - متى تستخدم أيهما

استخدم git reset عندما: ✓ العمل على فروع خاصة/محلية ✓ لم يتم دفع الالتزامات بعد ✓ تريد إعادة كتابة التاريخ ✓ التنظيف قبل الدفع استخدم git revert عندما: ✓ العمل على فروع مشتركة/عامة ✓ تم دفع الالتزامات ✓ تريد الحفاظ على التاريخ ✓ التراجع عن التزامات محددة في منتصف التاريخ ✓ العمل على فرع main/master مثال على القرار: - فرع ميزة محلي مع التزام سيء → استخدم reset - فرع إنتاج مع خطأ → استخدم revert
أفضل ممارسة: إذا لم تكن متأكداً، استخدم git revert. إنه دائماً آمن لأنه لا يعيد كتابة التاريخ. يمكنك دائماً التنظيف لاحقاً باستخدام rebase تفاعلي إذا لزم الأمر.

Git Clean - إزالة الملفات غير المتتبعة

إزالة الملفات التي لا تتبعها Git:

# معاينة ما سيتم حذفه (تشغيل تجريبي) git clean -n # إزالة الملفات غير المتتبعة git clean -f # إزالة الملفات والأدلة غير المتتبعة git clean -fd # إزالة الملفات المتجاهلة أيضاً (أنماط .gitignore) git clean -fx # الوضع التفاعلي (اختر ما تريد حذفه) git clean -i # تنظيف كل شيء (الملفات، الأدلة، المتجاهلة) git clean -fdx
تحذير: git clean يحذف بشكل دائم الملفات غير المتتبعة. استخدم دائماً -n (تشغيل تجريبي) أولاً لمعاينة ما سيتم حذفه!

التعافي من الأخطاء

Git تحتفظ بـ reflog لجميع حركات HEAD - شبكة الأمان الخاصة بك:

# عرض reflog (تاريخ تغييرات HEAD) git reflog # مخرجات reflog النموذجية: # abc123 HEAD@{0}: reset: moving to HEAD~1 # def456 HEAD@{1}: commit: Add feature # ghi789 HEAD@{2}: commit: Fix bug # التعافي بعد إعادة تعيين عرضية git reset --hard HEAD@{1} # التعافي بعد حذف فرع عرضي git checkout -b recovered-branch HEAD@{1} # عرض reflog لفرع محدد git reflog show feature-branch # إدخالات reflog تنتهي بعد 90 يوماً افتراضياً git reflog expire --expire=now --all # مسح reflog

سيناريوهات التعافي العملية

# السيناريو 1: حذف فرع عن طريق الخطأ git reflog # ابحث عن hash الالتزام git checkout -b recovered-branch abc123 # السيناريو 2: إعادة التعيين بعيداً جداً git reflog # ابحث عن مكان وجودك git reset --hard HEAD@{2} # السيناريو 3: فقدان الالتزامات بعد إعادة تعيين صعبة git reflog git cherry-pick abc123 # استعادة التزام محدد # السيناريو 4: التراجع عن التراجع git reflog git reset --hard HEAD@{1}
نصيحة احترافية: قبل القيام بأي عملية مدمرة محتملة، أنشئ فرع احتياطي: git branch backup. إذا حدث خطأ ما، يمكنك دائماً git reset --hard backup للعودة.

التراجع عن تغييرات ملفات محددة

التراجع عن التغييرات على ملفات محددة في مراحل مختلفة:

# تجاهل تغييرات دليل العمل لملف واحد git restore filename.txt # استعادة ملف من التزام محدد git restore --source=HEAD~3 filename.txt # استعادة ملف من فرع آخر git restore --source=feature-branch filename.txt # استعادة ملف وتنظيمه git restore --source=HEAD~1 --staged --worktree filename.txt # التراجع عن التغييرات على ملف في آخر التزام git show HEAD:filename.txt > filename.txt git add filename.txt git commit -m "Revert filename.txt to previous state"

تعديل آخر التزام

إصلاح الأخطاء في أحدث التزام:

# تغيير رسالة الالتزام فقط git commit --amend -m "رسالة التزام أفضل" # إضافة ملفات منسية إلى آخر التزام git add forgotten-file.txt git commit --amend --no-edit # تغيير آخر التزام بالكامل git add modified-file.txt git commit --amend # تعديل معلومات المؤلف git commit --amend --author="Name <email@example.com>"

تمرين تطبيقي:

السيناريو: لقد ارتكبت عدة أخطاء وتحتاج إلى إصلاحها:

  1. عدّلت config.txt ولكن تريد تجاهل التغييرات
  2. نظمت temp.txt بالخطأ وتحتاج إلى إلغاء تنظيمه
  3. آخر التزام به خطأ إملائي في الرسالة
  4. قبل التزامين، التزمت بشيء خاطئ (تم دفعه بالفعل)

الحلول:

# 1. تجاهل التغييرات على config.txt git restore config.txt # 2. إلغاء تنظيم temp.txt git restore --staged temp.txt # 3. إصلاح رسالة الالتزام (إذا لم يتم الدفع بعد) git commit --amend -m "رسالة التزام مصححة" # 4. التراجع عن التزام قديم (آمن للالتزامات المدفوعة) git log --oneline # ابحث عن hash الالتزام git revert abc123 # التراجع عن الالتزام السيء

أفضل الممارسات للتراجع عن التغييرات

✓ افعل: - استخدم git restore لتغييرات دليل العمل - استخدم git revert للفروع المشتركة/العامة - معاينة دائماً مع -n قبل git clean - تحقق من git reflog عندما يحدث خطأ - أنشئ فروع احتياطية قبل العمليات المحفوفة بالمخاطر - فضّل revert على reset للالتزامات المدفوعة ✗ لا تفعل: - استخدم git reset --hard على الالتزامات المدفوعة - استخدم git clean بدون -n أولاً - أعد كتابة التاريخ العام/المشترك - ذعر - reflog يمكن أن ينقذك - الدفع القسري دون فهم العواقب - مزج استراتيجيات reset و revert

الملخص

في هذا الدرس، تعلمت:

  • استخدام git restore لتجاهل التغييرات وإلغاء تنظيم الملفات
  • ثلاثة أوضاع لـ git reset: soft و mixed و hard
  • استخدام git revert للتراجع الآمن عن التاريخ العام
  • متى تستخدم reset مقابل revert
  • إزالة الملفات غير المتتبعة باستخدام git clean
  • التعافي من الأخطاء باستخدام reflog
  • تعديل آخر التزام
  • أفضل الممارسات لعمليات التراجع الآمنة
التالي: في الدرس التالي، سنستكشف التفرع في Git - إحدى ميزاتها الأكثر قوة للتطوير الموازي!

ES
Edrees Salih
منذ 16 ساعة

We are still cooking the magic in the way!