كيفية التراجع عن آخر Commit في Git باستخدام revert و reset
كيفية التراجع عن آخر Commit في Git
أثناء العمل على مشروع برمجي باستخدام Git، قد يحدث أحياناً أن تُجري Commit أخيراً ثم تكتشف لاحقاً أنه تضمّن خطأً، أو أنه لم يكن من المفترض حفظه بهذه الصورة. في هذه الحالة، ستحتاج إلى التراجع عن آخر Commit بطريقة صحيحة تحافظ على سير العمل وتمنع حدوث مشاكل في سجل المشروع.
لحسن الحظ، يوفّر Git أكثر من طريقة للتعامل مع هذا السيناريو. والطريقتان الأكثر شيوعاً هما git revert و git reset. ورغم أن كلاهما يُستخدم للتراجع عن Commit، فإن الفرق بينهما جوهري ويؤثر بشكل مباشر في تاريخ المشروع وطريقة تعاون الفريق.

الطريقة الأولى: استخدام git revert
يُعد الأمر git revert الخيار الأكثر أماناً في كثير من الحالات، خصوصاً إذا كان الـ Commit قد تم رفعه بالفعل إلى مستودع مشترك. هذا الأمر لا يحذف الـ Commit من السجل، بل ينشئ Commit جديداً يعكس التغييرات التي أُدخلت سابقاً.
بمعنى آخر، بدلاً من تعديل تاريخ المشروع، يقوم Git بإضافة سجل جديد يلغي أثر السجل السابق، وهذا يجعل العملية واضحة وآمنة عند العمل الجماعي.
صيغة استخدام git revert
git revert <commit-to-revert>
ستحتاج هنا إلى تحديد المعرّف الخاص بالـ Commit الذي تريد التراجع عنه. ويمكنك الحصول عليه بسهولة باستخدام أمر git log الذي يعرض سجل الـ Commits في المشروع.
git log
عند تنفيذ هذا الأمر، سيظهر لك سجل زمني للـ Commits، وعادةً يكون أول Commit ظاهر في الأعلى هو الأحدث. انسخ المعرّف النصي القصير أو الكامل لذلك الـ Commit، ثم استخدمه مع أمر git revert.

في الصورة السابقة، تمثل كل دائرة Commit ضمن سجل المشروع.
متى يكون git revert هو الخيار الأفضل؟
- عندما يكون الـ Commit قد تم رفعه إلى Remote Repository.
- عندما تعمل ضمن فريق ولا تريد تعديل تاريخ المشروع.
- عندما تحتاج إلى طريقة آمنة وواضحة يمكن تتبعها لاحقاً.
الطريقة الثانية: استخدام git reset
يمكنك أيضاً التراجع عن آخر Commit باستخدام الأمر git reset، لكنه يتطلب حذراً أكبر. السبب هو أن هذا الأمر يغيّر تاريخ الـ Commits عبر تحريك المؤشر HEAD إلى Commit سابق، وبالتالي يتم تجاهل ما بعده بحسب نوع reset المستخدم.
لهذا السبب، لا يُنصح باستخدام git reset إلا في الحالات التي يكون فيها الـ Commit موجوداً محلياً فقط، ولم تتم مشاركته بعد مع الآخرين.
التراجع مع الاحتفاظ بالتعديلات باستخدام –soft
إذا كنت تريد إزالة آخر Commit مع الإبقاء على التعديلات داخل بيئة العمل حتى تتمكن من تعديلها أو إعادة Commit بشكل أفضل، فاستخدم الخيار --soft:
git reset --soft HEAD~1
يقوم هذا الأمر بإرجاع الفرع الحالي إلى Commit سابق بمقدار خطوة واحدة، لكنه لا يحذف التعديلات التي كانت ضمن Commit الأخير. لذلك فهو مفيد إذا كنت تريد فقط إعادة تنظيم Commit أو تعديل رسالته أو تقسيمه إلى أكثر من Commit.

في الصورة السابقة، تمثل كل دائرة Commit في شجرة المشروع.
التراجع الكامل مع حذف التعديلات باستخدام –hard
إذا كنت تريد التراجع عن آخر Commit وحذف جميع التغييرات غير المحفوظة أيضاً، فيمكنك استخدام الخيار --hard:
git reset --hard HEAD~1
هذا الأمر يعيد المشروع إلى الحالة السابقة مباشرة، ويحذف آخر Commit بالإضافة إلى أي تغييرات غير committed موجودة في بيئة العمل. لذلك يجب استخدامه بحذر شديد، لأنه قد يؤدي إلى فقدان عمل لا يمكن استعادته بسهولة.

في هذه الصورة أيضاً، تمثل كل دائرة Commit ضمن التسلسل الزمني للمشروع.
ما الفرق بين git reset و git revert؟
| الأمر | طريقة العمل | هل يغيّر التاريخ؟ | أفضل استخدام |
|---|---|---|---|
git revert |
ينشئ Commit جديداً يعكس التغييرات السابقة | لا | عند العمل على مستودع مشترك أو بعد Push |
git reset |
يعيد HEAD إلى Commit سابق |
نعم | عند العمل المحلي قبل مشاركة التغييرات |
متى تستخدم كل أمر؟
- استخدم
git revertإذا كان الـ Commit قد وصل إلى المستودع المشترك. - استخدم
git resetإذا كنت تعمل محلياً فقط وتفهم أثر تعديل السجل. - اختر
--softعندما تريد الاحتفاظ بالتعديلات. - اختر
--hardفقط إذا كنت متأكداً من رغبتك في حذف التعديلات نهائياً.
نصائح مهمة قبل التراجع عن آخر Commit
- تحقق أولاً مما إذا كان الـ Commit قد تم عمل Push له أم لا.
- استخدم
git logأوgit statusلفهم الحالة الحالية للمستودع. - تجنب
git reset --hardإذا كانت لديك تغييرات لم تحفظ نسخة منها. - في بيئات العمل التعاونية، اجعل
git revertخيارك الأول غالباً.
الخلاصة التقنية
إذا كان هدفك التراجع عن آخر Commit بأمان ودون العبث بتاريخ المشروع، فإن git revert هو الخيار الأنسب، خاصة في المشاريع المشتركة. أما git reset فهو أداة قوية وسريعة للاستخدام المحلي، لكنه يتطلب فهماً واضحاً لتأثيره على سجل الـ Commits. الاختيار الصحيح بين الأمرين لا يعتمد فقط على الرغبة في التراجع، بل على مكان وجود الـ Commit وطبيعة سير العمل داخل الفريق.