التراجع عن التعديلات في Git: دليل شامل ومفصل
تعد عملية التحكم في الإصدارات من أهم الركائز التي تعتمد عليها فرق التطوير في تنظيم العمل، ومتابعة التعديلات على الملفات، والعودة إلى نسخ سابقة في حال حدوث أخطاء أو تغييرات غير مرغوبة. يعتبر Git من أشهر أنظمة التحكم في الإصدارات المستخدمة على نطاق واسع في المشاريع البرمجية، لما يتميز به من سرعة وكفاءة ومرونة كبيرة. واحدة من أكثر العمليات التي يطلبها المطورون باستمرار هي التراجع عن التعديلات أو ما يعرف بـ Undo Changes في Git.
في هذا المقال، سنستعرض بشكل مفصل الطرق المختلفة للتراجع عن التعديلات في Git، مع شرح دقيق لكل أمر وظروف استخدامه، مع توضيح الفرق بين هذه الأوامر وكيفية استخدامها بشكل عملي وفعال. الهدف هو تقديم مرجع شامل يجيب على كل جوانب التراجع عن التعديلات في Git، سواء كانت التعديلات محلية غير ملتزمة أو حتى تلك التي تم رفعها إلى المستودع البعيد (Remote Repository).
مفهوم التراجع عن التعديلات في Git
قبل الخوض في تفاصيل الأوامر، من الضروري فهم المراحل المختلفة للتعديلات في Git. بشكل عام، تمر التعديلات بثلاث مراحل رئيسية:
-
العمل في مساحة العمل (Working Directory): هي الملفات التي تقوم بالتعديل عليها مباشرة على جهازك.
-
منطقة الاستعداد (Staging Area أو Index): هي المرحلة التي يتم فيها تجهيز الملفات للتسجيل في السجل التاريخي للمشروع (Commit).
-
السجل التاريخي (Repository): هو المكان الذي يتم فيه حفظ النسخ الملتزمة (commits) بشكل دائم.
بناءً على المرحلة التي تم فيها التعديل، تختلف الطريقة المستخدمة للتراجع. التراجع قد يعني:
-
إلغاء التعديلات غير المضافة إلى منطقة الاستعداد.
-
إزالة الملفات من منطقة الاستعداد دون حذف التعديلات.
-
التراجع عن التعديلات التي تم تسجيلها (committed).
-
التراجع عن التعديلات التي تم رفعها إلى المستودع البعيد.
التراجع عن التعديلات في مساحة العمل (Working Directory)
عند تعديل ملف في مساحة العمل، لكنه لم يُضاف إلى منطقة الاستعداد، يكون بإمكانك إلغاء هذه التعديلات والعودة إلى آخر نسخة ملتزمة.
الأمر git checkout --
يستخدم هذا الأمر لإلغاء التعديلات على ملف معين والعودة إلى النسخة الموجودة في آخر Commit.
مثال:
bashgit checkout -- index.html
هذا يعيد ملف index.html إلى الحالة التي كان عليها في آخر Commit. مع ملاحظة أن هذا الأمر سيحذف جميع التعديلات غير المحفوظة.
تحذير: عند استخدام
git checkout --يتم حذف التعديلات غير المحفوظة على الملف بشكل دائم.
التراجع عن التعديلات في منطقة الاستعداد (Staging Area)
عندما تقوم بإضافة التعديلات إلى منطقة الاستعداد باستخدام الأمر git add، ربما ترغب أحياناً في إلغاء تلك الإضافة والعودة بالملفات إلى حالة “غير مُعدة” دون فقد التعديلات في مساحة العمل.
الأمر git reset
يستخدم هذا الأمر لإزالة الملف من منطقة الاستعداد، أي التراجع عن git add دون حذف التعديلات.
مثال:
bashgit reset index.html
سيتم إزالة الملف index.html من منطقة الاستعداد لكنه يبقى معدلاً في مساحة العمل.
التراجع عن التعديلات في السجل التاريخي (Commits)
التراجع عن التعديلات بعد تسجيلها في سجل التغييرات يمكن أن يكون أكثر تعقيداً، لأن التغييرات أصبحت محفوظة ضمن تاريخ المشروع.
هناك عدة طرق للتراجع عن Commits، وتختلف حسب الحاجة:
-
التراجع عن آخر Commit (دون تغييرات في الملفات).
-
التراجع مع إلغاء التغييرات في الملفات.
-
التراجع مع الاحتفاظ بالتعديلات في مساحة العمل.
-
التراجع إلى Commit سابق بشكل كامل.
الأمر git revert
يُستخدم git revert لإنشاء Commit جديد يعكس تغييرات Commit سابق دون حذف سجل التغييرات. هذا مفيد عندما تريد التراجع عن تغييرات تم رفعها بالفعل (pushed) إلى المستودع البعيد، مع الحفاظ على تاريخ المشروع.
مثال:
bashgit 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 خطورة لأنه يحذف التعديلات بشكل كامل.
-
يستخدم بحذر شديد.
مثال:
bashgit 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 لإعادة السجل التاريخي إلى حالة سابقة ثم فرض رفع التغييرات إلى المستودع البعيد باستخدام:
bashgit push --force
لكن هذه الطريقة خطيرة للغاية لأنها تقوم بإعادة كتابة التاريخ، مما قد يؤدي إلى تعارضات مع من يعملون على نفس الفرع.
التراجع عن التعديلات في الملفات الجديدة أو غير المضافة إلى Git
في حال قمت بإنشاء ملفات جديدة (غير مُضافة إلى Git)، وتريد التراجع عن إنشائها، عليك حذفها يدوياً لأن Git لا يتتبع الملفات غير المُضافة.
يمكن استخدام الأمر التالي لحذف الملفات غير المُضافة:
bashgit clean -f
ولحذف المجلدات أيضاً:
bashgit clean -fd
ويمكن تجربة محاكاة التنفيذ قبل الحذف بأمر:
bashgit clean -n
التراجع عن التعديلات باستخدام git stash
يستخدم git stash لحفظ التعديلات مؤقتًا من مساحة العمل ومنطقة الاستعداد، بهدف إزالتها مؤقتًا دون الالتزام بها أو فقدها، ومن ثم إعادتها لاحقًا.
يعد هذا مفيداً عند الحاجة للتبديل إلى فرع آخر مؤقتًا دون فقد التعديلات.
أوامر هامة:
-
حفظ التعديلات:
bashgit stash -
عرض التعديلات المخزنة:
bashgit stash list -
استرجاع التعديلات:
bashgit stash apply -
حذف التعديلات بعد استرجاعها:
bashgit 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 عملية متعددة الأوجه وتعتمد على مكان التعديل (مساحة العمل، منطقة الاستعداد، سجل التغييرات) وحالة التعديل (محلي أو مرفوع). استخدام الأوامر المناسبة في الوقت المناسب يضمن الحفاظ على تاريخ المشروع وسير العمل بدون مشاكل.
هذا المقال قدم شرحًا مفصلاً للخيارات المختلفة المتاحة للمطورين، مع توضيح الاختلافات بين كل أمر، وكيفية تطبيقها على أرض الواقع بشكل آمن وفعال.
المصادر
-
Pro Git Book, Scott Chacon and Ben Straub, https://git-scm.com/book/en/v2
-
Git Documentation, https://git-scm.com/docs
هذا المقال يعد مرجعًا شاملاً لكل ما يتعلق بالتراجع عن التعديلات في Git، مع توضيح مفصل لكل الحالات الممكنة وأوامر التعامل معها.

