البرمجة

التراجع عن التعديلات في Git

التراجع عن التعديلات في Git: دليل شامل ومفصل

تعد عملية التحكم في الإصدارات من أهم الركائز التي تعتمد عليها فرق التطوير في تنظيم العمل، ومتابعة التعديلات على الملفات، والعودة إلى نسخ سابقة في حال حدوث أخطاء أو تغييرات غير مرغوبة. يعتبر Git من أشهر أنظمة التحكم في الإصدارات المستخدمة على نطاق واسع في المشاريع البرمجية، لما يتميز به من سرعة وكفاءة ومرونة كبيرة. واحدة من أكثر العمليات التي يطلبها المطورون باستمرار هي التراجع عن التعديلات أو ما يعرف بـ Undo Changes في Git.

في هذا المقال، سنستعرض بشكل مفصل الطرق المختلفة للتراجع عن التعديلات في Git، مع شرح دقيق لكل أمر وظروف استخدامه، مع توضيح الفرق بين هذه الأوامر وكيفية استخدامها بشكل عملي وفعال. الهدف هو تقديم مرجع شامل يجيب على كل جوانب التراجع عن التعديلات في Git، سواء كانت التعديلات محلية غير ملتزمة أو حتى تلك التي تم رفعها إلى المستودع البعيد (Remote Repository).


مفهوم التراجع عن التعديلات في Git

قبل الخوض في تفاصيل الأوامر، من الضروري فهم المراحل المختلفة للتعديلات في Git. بشكل عام، تمر التعديلات بثلاث مراحل رئيسية:

  1. العمل في مساحة العمل (Working Directory): هي الملفات التي تقوم بالتعديل عليها مباشرة على جهازك.

  2. منطقة الاستعداد (Staging Area أو Index): هي المرحلة التي يتم فيها تجهيز الملفات للتسجيل في السجل التاريخي للمشروع (Commit).

  3. السجل التاريخي (Repository): هو المكان الذي يتم فيه حفظ النسخ الملتزمة (commits) بشكل دائم.

بناءً على المرحلة التي تم فيها التعديل، تختلف الطريقة المستخدمة للتراجع. التراجع قد يعني:

  • إلغاء التعديلات غير المضافة إلى منطقة الاستعداد.

  • إزالة الملفات من منطقة الاستعداد دون حذف التعديلات.

  • التراجع عن التعديلات التي تم تسجيلها (committed).

  • التراجع عن التعديلات التي تم رفعها إلى المستودع البعيد.


التراجع عن التعديلات في مساحة العمل (Working Directory)

عند تعديل ملف في مساحة العمل، لكنه لم يُضاف إلى منطقة الاستعداد، يكون بإمكانك إلغاء هذه التعديلات والعودة إلى آخر نسخة ملتزمة.

الأمر git checkout --

يستخدم هذا الأمر لإلغاء التعديلات على ملف معين والعودة إلى النسخة الموجودة في آخر Commit.

مثال:

bash
git checkout -- index.html

هذا يعيد ملف index.html إلى الحالة التي كان عليها في آخر Commit. مع ملاحظة أن هذا الأمر سيحذف جميع التعديلات غير المحفوظة.

تحذير: عند استخدام git checkout -- يتم حذف التعديلات غير المحفوظة على الملف بشكل دائم.


التراجع عن التعديلات في منطقة الاستعداد (Staging Area)

عندما تقوم بإضافة التعديلات إلى منطقة الاستعداد باستخدام الأمر git add، ربما ترغب أحياناً في إلغاء تلك الإضافة والعودة بالملفات إلى حالة “غير مُعدة” دون فقد التعديلات في مساحة العمل.

الأمر git reset

يستخدم هذا الأمر لإزالة الملف من منطقة الاستعداد، أي التراجع عن git add دون حذف التعديلات.

مثال:

bash
git reset index.html

سيتم إزالة الملف index.html من منطقة الاستعداد لكنه يبقى معدلاً في مساحة العمل.


التراجع عن التعديلات في السجل التاريخي (Commits)

التراجع عن التعديلات بعد تسجيلها في سجل التغييرات يمكن أن يكون أكثر تعقيداً، لأن التغييرات أصبحت محفوظة ضمن تاريخ المشروع.

هناك عدة طرق للتراجع عن Commits، وتختلف حسب الحاجة:

  • التراجع عن آخر Commit (دون تغييرات في الملفات).

  • التراجع مع إلغاء التغييرات في الملفات.

  • التراجع مع الاحتفاظ بالتعديلات في مساحة العمل.

  • التراجع إلى Commit سابق بشكل كامل.


الأمر git revert

يُستخدم git revert لإنشاء Commit جديد يعكس تغييرات Commit سابق دون حذف سجل التغييرات. هذا مفيد عندما تريد التراجع عن تغييرات تم رفعها بالفعل (pushed) إلى المستودع البعيد، مع الحفاظ على تاريخ المشروع.

مثال:

bash
git revert abc1234

حيث abc1234 هو معرف Commit الذي تريد التراجع عنه.

مميزات git revert:

  • لا يحذف Commit من السجل.

  • آمن للاستخدام في الفروع المشتركة.

  • ينشئ Commit جديد يعكس التغييرات.


الأمر git reset

يعتبر git reset من الأوامر القوية جداً للتراجع عن Commit أو مجموعة Commits في السجل التاريخي، ويأتي بثلاثة أشكال رئيسية تختلف بحسب الاستخدام:

1. git reset --soft

يعيد مؤشر الفرع إلى Commit معين ويترك التعديلات في منطقة الاستعداد.

  • يحتفظ بجميع التعديلات التي تم تسجيلها بعد هذا Commit في منطقة الاستعداد.

  • يستخدم عادة لتعديل آخر Commit أو دمج Commits قبل تسجيل Commit جديد.

2. git reset --mixed (الإعداد الافتراضي)

يعيد مؤشر الفرع إلى Commit معين، ويزيل التعديلات من منطقة الاستعداد، لكنها تبقى في مساحة العمل.

  • تستخدم إذا أردت إلغاء Commit وإلغاء إضافة الملفات إلى منطقة الاستعداد، لكن التعديلات تبقى محفوظة في ملفات المشروع.

3. git reset --hard

يعيد مؤشر الفرع إلى Commit معين، ويزيل كل التعديلات من منطقة الاستعداد ومساحة العمل.

  • يعتبر أكثر أشكال Reset خطورة لأنه يحذف التعديلات بشكل كامل.

  • يستخدم بحذر شديد.

مثال:

bash
git reset --hard abc1234

الفرق بين git revert و git reset

الأمر ماذا يفعل يؤثر على المستودع البعيد؟ آمن للاستخدام في الفروع المشتركة؟
git revert ينشئ Commit جديد يعكس التغييرات نعم، يمكن رفعه (push) نعم، لأنه لا يحذف التاريخ بل يضيف عليه
git reset يعيد مؤشر الفرع إلى Commit معين ويغير السجل لا يجب رفعه إذا تم إعادة تاريخ مشترك لا، لأنه يغير التاريخ ويؤدي إلى تعارضات

التراجع عن التعديلات التي تم رفعها إلى المستودع البعيد (Remote)

عند رفع Commits إلى المستودع البعيد، يصبح التراجع أكثر حساسية بسبب احتمالية تأثيره على زملاء الفريق.

استخدام git revert

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

استخدام git reset مع Force Push

في بعض الحالات الخاصة، يمكن استخدام git reset لإعادة السجل التاريخي إلى حالة سابقة ثم فرض رفع التغييرات إلى المستودع البعيد باستخدام:

bash
git push --force

لكن هذه الطريقة خطيرة للغاية لأنها تقوم بإعادة كتابة التاريخ، مما قد يؤدي إلى تعارضات مع من يعملون على نفس الفرع.


التراجع عن التعديلات في الملفات الجديدة أو غير المضافة إلى Git

في حال قمت بإنشاء ملفات جديدة (غير مُضافة إلى Git)، وتريد التراجع عن إنشائها، عليك حذفها يدوياً لأن Git لا يتتبع الملفات غير المُضافة.

يمكن استخدام الأمر التالي لحذف الملفات غير المُضافة:

bash
git clean -f

ولحذف المجلدات أيضاً:

bash
git clean -fd

ويمكن تجربة محاكاة التنفيذ قبل الحذف بأمر:

bash
git clean -n

التراجع عن التعديلات باستخدام git stash

يستخدم git stash لحفظ التعديلات مؤقتًا من مساحة العمل ومنطقة الاستعداد، بهدف إزالتها مؤقتًا دون الالتزام بها أو فقدها، ومن ثم إعادتها لاحقًا.

يعد هذا مفيداً عند الحاجة للتبديل إلى فرع آخر مؤقتًا دون فقد التعديلات.

أوامر هامة:

  • حفظ التعديلات:

    bash
    git stash
  • عرض التعديلات المخزنة:

    bash
    git stash list
  • استرجاع التعديلات:

    bash
    git stash apply
  • حذف التعديلات بعد استرجاعها:

    bash
    git stash drop

استخدام جدول يوضح الأوامر المختلفة للتراجع في Git

نوع التعديل الأمر الوصف ملاحظات
التراجع عن تعديل في مساحة العمل git checkout -- إعادة الملف إلى آخر Commit يحذف التعديلات غير المحفوظة
إزالة ملف من منطقة الاستعداد git reset إزالة الملف من Staging لكنه يبقى معدلاً لا يحذف التعديلات في مساحة العمل
التراجع عن آخر Commit (آمن) git revert إنشاء Commit يعكس تغييرات Commit معين آمن في الفروع المشتركة
إعادة المؤشر مع حفظ التعديلات في Staging git reset --soft إعادة المؤشر مع الحفاظ على التعديلات في Staging مفيد لتعديل Commits
إعادة المؤشر مع حفظ التعديلات في مساحة العمل git reset --mixed إعادة المؤشر مع إزالة التعديلات من Staging الإعداد الافتراضي لـ git reset
إعادة المؤشر مع حذف التعديلات git reset --hard إعادة المؤشر وحذف التعديلات بالكامل خطر جدًا، يحذف التعديلات بشكل دائم
حذف الملفات غير المُضافة git clean -f حذف الملفات غير المُضافة إلى Git يحذف فقط الملفات
حذف الملفات والمجلدات غير المُضافة git clean -fd حذف الملفات والمجلدات غير المُضافة يحذف الملفات والمجلدات
تخزين التعديلات مؤقتًا git stash حفظ التعديلات مؤقتًا وإزالتها من مساحة العمل يمكن استرجاعها لاحقًا

نصائح مهمة عند التراجع عن التعديلات في Git

  • دائمًا قبل استخدام الأوامر التي تحذف تعديلات (مثل git reset --hard أو git clean) تأكد من أنك لا تفقد بيانات هامة.

  • يمكن استخدام git status لمراقبة حالة الملفات ومساحة العمل.

  • استخدام git log أو git reflog لفحص تاريخ التعديلات والعودة إلى نسخ سابقة بسهولة.

  • التراجع باستخدام git revert هو الأكثر أمانًا عند العمل ضمن فريق مشترك.

  • عند استخدام git reset على فرع تم مشاركته مسبقًا مع آخرين، قد يؤدي إلى تعارضات مع الزملاء، لذلك يجب توخي الحذر.


ملخص شامل

التراجع عن التعديلات في Git عملية متعددة الأوجه وتعتمد على مكان التعديل (مساحة العمل، منطقة الاستعداد، سجل التغييرات) وحالة التعديل (محلي أو مرفوع). استخدام الأوامر المناسبة في الوقت المناسب يضمن الحفاظ على تاريخ المشروع وسير العمل بدون مشاكل.

هذا المقال قدم شرحًا مفصلاً للخيارات المختلفة المتاحة للمطورين، مع توضيح الاختلافات بين كل أمر، وكيفية تطبيقها على أرض الواقع بشكل آمن وفعال.


المصادر


هذا المقال يعد مرجعًا شاملاً لكل ما يتعلق بالتراجع عن التعديلات في Git، مع توضيح مفصل لكل الحالات الممكنة وأوامر التعامل معها.