Git Reset
آخر تحديث
git reset ينقل الفرع الحالي إلى commit مختلف، وحسب الوضع، يحدّث منطقة التجهيز (الفهرس) وشجرة العمل لتتطابق. تختلف الأوضاع الثلاثة فقط في مدى وصول هذا التحديث: --soft ينقل الفرع ويتوقف، و--mixed (الوضع الافتراضي) يعيد أيضًا ضبط منطقة التجهيز، و--hard يكتب فوق ملفات عملك كذلك.
بما أن --hard يتجاهل العمل غير المثبَّت (uncommitted)، فاعرف أي وضع تريده قبل تشغيله. جرّب هذه الأوامر بأمان في ساحة الطرفية Git playground - وهي صدفة حقيقية داخل متصفحك.
الأوضاع الثلاثة
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | نعم | لا | لا |
--mixed (default) | نعم | نعم | لا |
--hard | نعم | نعم | نعم |
الصيغة
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | التراجع عن آخر commit مع إبقاء التغييرات مجهَّزة |
git reset HEAD~1 | التراجع عن آخر commit مع إبقاء التغييرات غير مجهَّزة |
git reset --hard HEAD~1 | التراجع عن آخر commit مع تجاهل التغييرات |
git reset <file> | إخراج ملف من التجهيز (مع الاحتفاظ بتغييراته) |
git reset --hard origin/main | إجبار الفرع المحلي على مطابقة الفرع البعيد |
حالات شائعة
| Goal | Command |
|---|---|
| إخراج كل شيء من التجهيز | git reset |
| إخراج ملف واحد من التجهيز | git reset README.md |
| الرجوع 3 commits مع الاحتفاظ بالعمل | git reset --soft HEAD~3 |
| تجاهل جميع التغييرات المحلية منذ commit معيّن | git reset --hard <hash> |
الأسئلة الشائعة حول git reset
ما الفرق بين --soft و--mixed و--hard؟
الثلاثة جميعها تنقل مؤشر فرعك إلى الـ commit المستهدف؛ لكنها تختلف في ما تمسّه إضافة إلى ذلك.
--soft لا يغيّر أي شيء آخر، لذا تبقى تغييراتك مجهَّزة. --mixed (الوضع الافتراضي) يمسح أيضًا منطقة التجهيز، فتصبح التغييرات غير مجهَّزة لكنها تبقى في ملفاتك. --hard يكتب أيضًا فوق شجرة عملك لتتطابق مع الـ commit المستهدف، متجاهلًا التغييرات غير المثبَّتة.كيف أُخرج ملفًا من التجهيز باستخدام git reset؟
شغّل
git reset <file> (مثلًا git reset README.md)، أو git reset بدون مسار لإخراج كل شيء من التجهيز. هذا يزيل الملف من منطقة التجهيز لكنه يبقي تعديلاتك في شجرة العمل. في إصدارات Git الأحدث يمكنك أيضًا استخدام git restore --staged <file>، الذي يؤدي الشيء نفسه بصورة أوضح.هل git reset --hard قابل للتراجع؟
ليس من شجرة العمل - فـ
--hard يتجاهل التغييرات غير المثبَّتة نهائيًا. لكن العمل المثبَّت (committed) الذي أزلته بالـ reset يمكن عادةً استرجاعه: شغّل git reflog للعثور على hash الـ commit، ثم git reset --hard <hash> (أو أنشئ فرعًا عنده). أما التغييرات غير المثبَّتة التي لم تُجهَّز أو تُثبَّت أبدًا فلا يمكن استرجاعها، لذا استخدم --hard بحذر.ما الفرق بين git reset و git revert؟
git reset يعيد كتابة التاريخ بنقل الفرع إلى الوراء - وهو مقبول للـ commits المحلية، لكنه خطير على الـ commits التي سبق أن دفعتها (push). أما git revert فيُبقي التاريخ سليمًا ويضيف commit جديدًا يلغي أثر commit سابق، وهو الخيار الآمن للفروع المشتركة.هل يمكنني التدرّب على هذا عبر الإنترنت؟
نعم. افتح ساحة الطرفية Git playground لتشغيل
git reset في صدفة حقيقية داخل متصفحك - دون الحاجة إلى تثبيت أي شيء. كما يغطي كورس Git التفاعلي المجاني من Coddy إعادة الضبط والتراجع عن التغييرات خطوة بخطوة.