تخطَّ إلى المحتوى
GitTree

شروحات Git

التراجع عن git reset وrebase وcommit: كيف تسترجع أي شيء تقريبًا في Git

نادرًا ما يحذف Git عملك نهائيًا. إليك كيف تتراجع عن آخر commit أو amend أو git reset --hard أو rebase، وكيف تسترجع فرعًا محذوفًا أو تُصلح force-push باستخدام git reflog، وكيف ينجز زر Undo في GitTree معظم ذلك بنقرة واحدة.

بقلم Eslam Faisalآخر تحديث قراءة في 11 دقيقة
قائمة الإيداع في GitTree بخيارات cherry-pick وrevert وإنشاء فرع ووسم والمقارنة

للتراجع عن git reset أو rebase أو commit، شغّل git reflog وابحث عن السطر الذي يسبق الخطأ مباشرة، ثم أعد فرعك إليه، مثلًا بالأمر git reset --hard HEAD@{1}. يسجّل Git في الـ reflog كل حركة لـ HEAD ولكل فرع، ويحتفظ افتراضيًا حتى بسطر الـ commit المفقود مدة 30 يومًا (و90 يومًا للـ commits التي ما زالت على فرع)، لذا فاسترجاع commit محذوف ممكن في أغلب الحالات. الاستثناء الحقيقي الوحيد هو العمل الذي لم تحفظه في commit قط.

ستجد أدناه الوصفة الدقيقة لكل خطأ شائع. كل الأوامر من Git نفسه وتعمل بالطريقة ذاتها على أنظمة macOS وWindows وLinux (لينكس). وعلى ويندوز شغّلها في Git Bash الذي يأتي مع Git for Windows، لأن PowerShell يحتاج إلى وضع أسماء الـ reflog مثل HEAD@{1} بين علامتي اقتباس ولا يتضمن grep. وفي النهاية سترى كيف يحتفظ GitTree، وهو برنامج Git مجاني بواجهة رسومية لسطح المكتب، بلقطة استرداد لـ 19 نوعًا من العمليات، فتتراجع عن معظم الأخطاء بنقرة واحدة.

ورقة مرجعية للتراجع في Git: الأمر المناسب لكل خطأ

حدّد حالتك، ثم اقرأ قسمها أدناه قبل تشغيل أي شيء. يعني HEAD@{1} «المكان الذي كان فيه HEAD قبل حركة واحدة»؛ فإن نفّذت أوامر أخرى بعد الخطأ، فابحث عن الرقم الصحيح في git reflog أولًا.

أوامر التراجع عن أخطاء Git الشائعة
الخطأالأمرانتبه إلى
آخر commit مع الإبقاء على التغييراتgit reset --soft HEAD~1للـ commits التي لم تدفعها بعد فقط
آخر commit بعد دفعهgit revert HEADيضيف commit جديدًا يلغي القديم
git commit --amend خاطئgit reset --soft HEAD@{1}شغّله قبل أن يتحرك HEAD مرة أخرى
git reset --hardgit reset --hard HEAD@{1}التغييرات غير المحفوظة في commit ليست في الـ reflog
rebase مكتملgit reset --hard ORIG_HEADأي reset أو merge أو rebase تالٍ يستبدل ORIG_HEAD
merge محليgit reset --hard ORIG_HEADبعد الدفع استخدم git revert -m 1 <merge>
فرع محذوفgit branch <name> <hash>الـ hash في رسالة الحذف أو في الـ reflog
stash محذوفgit stash apply <hash>الـ hash في رسالة الحذف
force-pushgit push --force-with-lease origin <hash>:mainنبّه كل من سحب الفرع بين الدفعتين

شرح git reflog: شبكة الأمان تحت كل أمر

الـ reflog (سجل المراجع) مفكرة خاصة تسجّل أين أشار HEAD ورؤوس فروعك على مر الوقت. كل commit وcheckout وreset وmerge وrebase وamend وpull يضيف سطرًا، وللفروع البعيدة المتتبَّعة مثل origin/main سجلها أيضًا. يعيش الـ reflog في مجلد .git المحلي فقط: لا يُدفع إلى الخادم أبدًا، وأي نسخة جديدة تنشئها بـ git clone تبدأ بسجل فارغ.

git reflog
git reflog show main
git reflog --date=relative

هكذا يبدو git reflog نموذجي بعد rebase، والأحدث في الأعلى:

6c55495 HEAD@{0}: rebase (finish): returning to refs/heads/feature-login
6c55495 HEAD@{1}: rebase (pick): Validate the email field
cb6e15e HEAD@{2}: rebase (pick): Add the login form
2c44bc3 HEAD@{3}: rebase (start): checkout main
595b83d HEAD@{4}: commit: Validate the email field

انزل في القائمة حتى أحدث سطر يسبق الخطأ: هنا هو HEAD@{4}، أي الـ commit الذي سبق rebase (start). استخدم الـ hash الخاص به أو هذا الاسم في أي مكان يتوقع فيه Git اسم commit، كما تعمل صيغة مثل main@{2.hours.ago} أيضًا. تنتهي صلاحية السجلات بعد 90 يومًا، أو 30 يومًا للـ commits التي لا يصل إليها أي فرع، وما دام السطر موجودًا فإن git gc يُبقي الـ commit الذي يشير إليه.

استرجاع commit محذوف باستخدام git reflog في أربع خطوات

  1. اعرض الـ reflog

    شغّل git reflog، أو git reflog show <branch> لفرع واحد، ودوّن أحدث سطر يسبق الخطأ.

  2. افحص الـ commit

    شغّل git log --oneline -5 HEAD@{4} لتتأكد أن هذه هي الحالة التي تريد استعادتها. لا يتغير شيء بعد.

  3. احفظه في فرع إنقاذ

    شغّل git branch rescue HEAD@{4}. تبقى ملفاتك كما هي، ولن تنتهي صلاحية الـ commit بعد الآن.

  4. أعد فرعك إلى الوراء

    احفظ في commit أو stash ما زلت تحتاجه، ثم شغّل git reset --hard rescue وأنت على الفرع المتضرر، واحذف الفرع المساعد بالأمر git branch -d rescue.

التراجع عن آخر commit في Git: reset بأوضاعه soft وmixed وhard

إذا كان الـ commit ما زال على جهازك فقط، فإن git reset يعيد الفرع commit واحدًا إلى الوراء، ويحدد الوضع المختار مصير تغييراته:

git reset --soft HEAD~1
git reset HEAD~1
git reset --hard HEAD~1
  • --soft يُبقي التغييرات مجهّزة (staged) وجاهزة لـ commit جديد: مثالي لتصحيح الرسالة أو إضافة ملف نسيته.
  • --mixed، وهو الوضع الافتراضي، يُبقي التغييرات في مجلد العمل دون تجهيز، فتستطيع تقسيم الـ commit.
  • --hard يتخلص من التغييرات مع الـ commit، ومعها أي تعديلات لم تحفظها في commit بعد. يحتفظ الـ reflog بالـ commit لفترة، لكن فكّر مرتين.

إذا كنت قد دفعته إلى الخادم فلا تُعِد كتابة السجل: الأمر git revert HEAD يسجّل commit جديدًا يلغي أثره.

التراجع عن git commit --amend

الـ amend لا يعدّل الـ commit بل يضع مكانه commit جديدًا، ويبقى الأصلي في الـ reflog. بعد الـ amend مباشرة، يعيد git reset --soft HEAD@{1} الفرع إلى الأصل ويترك ما أضافه الـ amend مجهّزًا. وإن تأخرت، فابحث عن سطر commit (amend) في git reflog واستخدم السطر الذي تحته.

git reset --soft HEAD@{1}

كيف تتراجع عن git reset --hard

يحرّك الأمر git reset --hard الفرع ويكتب فوق ملفاتك، لكن الـ commits التي أسقطها تبقى في قاعدة كائنات Git. يُظهر الـ reflog هذه الحركة على شكل reset: moving to HEAD~2، والسطر الذي تحته هو المكان الذي كنت فيه. وإن كان الـ reset آخر أمر نفّذته، فهذا يعيد كل شيء:

git reflog
git reset --hard HEAD@{1}
git fsck --lost-found

كيف تتراجع عن git rebase

إذا توقف الـ rebase عند تعارض، فإن git rebase --abort يعيد الفرع ومنطقة التجهيز وملفاتك إلى ما كانت عليه. وإن اكتمل، فلديك طريقان للعودة. يوجّه Git المرجع ORIG_HEAD إلى الرأس القديم عند بدء الـ rebase، لذا فإن git reset --hard ORIG_HEAD بعده مباشرة يلغيه. والأضمن منه سجل الفرع نفسه: فالـ rebase يحرّك الفرع مرة واحدة فقط عند rebase (finish)، لذا فإن feature-login@{1} هو الفرع كما كان تمامًا.

git rebase --abort
git reset --hard ORIG_HEAD
git reset --hard feature-login@{1}

إذا كنت قد دفعت الفرع بعد الـ rebase، فاستعادته تحتاج إلى force-push (انظر أدناه). ولإعادة كتابة السجل عن قصد، اقرأ دليلنا عن الـ rebase التفاعلي في واجهة Git رسومية.

التراجع عن git merge

يترك الـ merge أيضًا الرأس القديم في ORIG_HEAD، فيلغي git reset --hard ORIG_HEAD أي merge لم تدفعه. وفي منتصف التعارض يخرجك git merge --abort، أو اتبع دليلنا عن حل تعارضات الدمج في Git. أما الـ merge المدفوع فيُلغى بالأمر git revert -m 1 <merge-commit>، ودمج الفرع نفسه لاحقًا لن يعيد تلك التغييرات ما لم تُلغِ ذلك الـ revert.

git merge --abort
git reset --hard ORIG_HEAD
git revert -m 1 <merge-commit>

استرجاع فرع محذوف في Git (وstash محذوف)

حذف الفرع يحذف اسمًا لا commits. يطبع git branch -D الرأس الذي كان الفرع يشير إليه، وإعادة إنشاء الفرع من ذلك الـ hash تستعيده:

git branch feature-login 1a2b3c4
git reflog | grep "moving from feature-login"

ضاعت تلك المخرجات؟ سجل HEAD ما زال يتذكر. يجد الأمر الثاني السطر checkout: moving from feature-login to main، والسطر الذي رقمه أكبر بواحد (HEAD@{6} إن كانت النتيجة HEAD@{5}) هو آخر commit على الفرع. وإن كان الفرع ما زال على الخادم، فالأمر git branch feature-login origin/feature-login أسرع.

استرجاع stash محذوف

يطبع git stash drop وgit stash pop الـ hash الخاص بالـ stash الذي أزالاه، وgit stash apply <hash> يعيده. ومن دون الـ hash، يقترح توثيق Git هذا البحث عن commits الـ stash التي لم يعد الوصول إليها ممكنًا، وهو يجد الـ stash المحفوظ برسالته الافتراضية «WIP on …»:

git stash apply 9d668e5
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP --oneline

كيف تتراجع عن force-push

يستبدل الدفع القسري (force-push) الفرع البعيد بفرعك، فتخرج منه الـ commits التي كانت على الخادم وحده. ولفرعك البعيد المتتبَّع سجل reflog أيضًا: origin/main@{1} هو موضع الفرع البعيد قبل دفعك كما رأيته آخر مرة، وقد طبعت مخرجات الدفع الـ hash نفسه في النصف الأول من old...new.

git reflog show origin/main
git push --force-with-lease origin 1a2b3c4:main

يرفض --force-with-lease الدفع إن تحرك الفرع البعيد منذ آخر fetch، فلا تكتب فوق إصلاح زميلك بالخطأ. والـ commits التي لم تجلبها قط لم تصل إلى جهازك أصلًا، لكن من دفعها يستطيع دفعها من جديد. ثم أخبر كل من سحب الفرع بين الدفعتين.

زر Undo في GitTree: لقطة استرداد لـ 19 نوعًا من العمليات

كل ما سبق يعمل في GitTree أيضًا: فهو يشغّل Git المثبّت لديك (الإصدار 2.39 أو أحدث)، وطرفيته المدمجة تفتح الـ shell الخاص بك أسفل مخطط الـ commits. وما يضيفه: يحتفظ GitTree بلقطة استرداد تحت refs/ogt/trash لـ 19 نوعًا من العمليات، فيحفظ ما ستزيله أي خطوة مدمّرة قبل تنفيذها، ثم يتراجع زر Undo في شريط الأدوات عن آخر خطوة.

يشمل Undo الـ commits والـ amend، والـ checkout، والـ reset، والـ rebase (والتفاعلي منه أيضًا)، والملفات والأجزاء والأسطر التي تخلصت منها، والفروع والوسوم المحذوفة، والملفات غير المتتبَّعة التي نظّفتها، وغير ذلك. وفي الـ hard reset الذي تنفّذه من GitTree تحفظ اللقطة تغييراتك غير المحفوظة في commit أيضًا، وهي ما يعجز git reset --hard العادي عن إعادته.

زرا Undo وRedo في شريط أدوات GitTree، وقائمة الـ commit في المخطط تقدّم Reset وRevert وInteractive Rebase لأي commit.
زرا Undo وRedo في شريط أدوات GitTree، وقائمة الـ commit في المخطط تقدّم Reset وRevert وInteractive Rebase لأي commit.

اثنتان من العمليات الـ 19 تُحفظان ولا تُعكسان. فالـ force-push يغيّر الخادم، ولا يعيده إلا دفع جديد، لذا يحتفظ GitTree بالرأس الذي استُبدل ويترك ذلك الدفع لك (وهو يدفع قسريًا دائمًا بـ --force-with-lease). والـ stash المحذوف يُحفظ في لقطة، لكن Undo لا يستعيده بعد. كما يرفض GitTree أي تراجع قد يكتب فوق عمل لاحق، ويوضح السبب. أما الدفع العادي فلا يُتراجع عنه من التطبيق؛ استخدم revert بدلًا منه.

تسمّي قائمة Reset أوضاعها الثلاثة: Soft يُبقي كل التغييرات مجهّزة، وMixed يُبقيها في مجلد العمل، وHard يتخلص منها بعد لقطة يستطيع Undo استعادتها.
تسمّي قائمة Reset أوضاعها الثلاثة: Soft يُبقي كل التغييرات مجهّزة، وMixed يُبقيها في مجلد العمل، وHard يتخلص منها بعد لقطة يستطيع Undo استعادتها.

كيف تتراجع عن reset أو rebase أو حذف فرع في GitTree

  1. اعمل كالمعتاد

    نفّذ reset أو rebase أو تخلّص من تغييرات أو احذف فرعًا كما تفعل عادة. يلتقط GitTree اللقطة أولًا، وتذكر نافذة تأكيد الـ hard reset ذلك صراحة.

  2. انقر Undo

    انقر Undo في شريط الأدوات أو شغّله من لوحة الأوامر (Ctrl/⌘+Shift+P). يذكر التلميح الخطوة التي سيتراجع عنها، مثل «Undo: delete branch feature-login»، والخطوة التي لا يمكن التراجع عنها يظهر سبب ذلك.

  3. ارجع أبعد عبر الـ reflog

    يشمل Undo ما نفّذه GitTree بنفسه. ولأمر كتبته في طرفية، شغّل View Reflog… من لوحة الأوامر، واختر سطرًا، ثم Restore as Branch.

  4. تحقق من المخطط قبل الدفع

    يُظهر مخطط الـ commits الفرع وقد عاد إلى مكانه، فتتأكد من النتيجة قبل أن يغادر أي شيء جهازك.

عادات تُبقي كل خطأ في Git قابلًا للتراجع

  • احفظ في commit مبكرًا ولو بفوضى. وحده العمل المحفوظ في commit يصل إلى الـ reflog، ويمكنك ترتيبه لاحقًا بـ rebase تفاعلي.
  • أنشئ فرعًا قبل التعديلات الخطرة. الأمر git branch backup/before-rebase لا يكلّف شيئًا ولا تنتهي صلاحيته.
  • لا تستخدم `--force` المجرد أبدًا. الخيار --force-with-lease لا يكتب فوق commits لم ترها.
  • استخدم revert للسجل المشترك وreset للسجل الخاص. بعد أن يسحب غيرك commit ما، ألغه بـ revert.
  • حدّث Git باستمرار. يحتاج GitTree إلى Git 2.39 أو أحدث، وUbuntu 22.04 يأتي بالإصدار 2.34؛ راجع كيف تحدّث Git على Ubuntu.

ما زلت تفاضل بين كتابة الأوامر والنقر عليها؟ اقرأ واجهة Git الرسومية أم سطر الأوامر، أو ابدأ بدليل Git للمبتدئين بواجهة رسومية.

GitTree مجاني اليوم، والمستودعات الخاصة مشمولة، على ماك (Mac) بنظام macOS 13 أو أحدث، وويندوز (Windows) 10 و11 (x64)، ولينكس (Linux) 64 بت بمعالجات x86_64 (Ubuntu 22.04 أو أحدث وDebian 12 أو أحدث). يحتاج إلى حساب مجاني وإلى Git 2.39 أو أحدث. حمّله من صفحة التحميل، أو اقرأ كيف يعمل على لينكس.

الأسئلة الشائعة

كيف أتراجع عن git reset --hard؟

شغّل git reflog وابحث عن السطر الذي يلي reset: moving to … مباشرة؛ فهو المكان الذي كان فيه فرعك. وإن كان الـ reset آخر أمر نفّذته، فإن git reset --hard HEAD@{1} يعيد الـ commits التي أسقطها. أما التغييرات التي لم تحفظها في commit فليست في الـ reflog ولا يستطيع Git استعادتها؛ وإن نفّذت الـ hard reset من GitTree، فإن زر Undo يعيدها من اللقطة التي حُفظت قبله.

كيف أتراجع عن آخر commit مع الإبقاء على التغييرات؟

شغّل git reset --soft HEAD~1 لتبقى التغييرات مجهّزة، أو git reset HEAD~1 لتبقى في مجلد العمل دون تجهيز. كلاهما يعيد كتابة فرعك المحلي فقط، فاستخدمهما مع الـ commits التي لم تدفعها. أما الـ commit المدفوع فشغّل له git revert HEAD، وهو يضيف commit جديدًا يلغيه دون المساس بالسجل.

كيف أتراجع عن git rebase بعد اكتماله؟

بعد الـ rebase مباشرة، يعيد git reset --hard ORIG_HEAD الفرع إلى رأسه القديم. وإن نفّذت أوامر أخرى بعده، فاستخدم git reset --hard <branch>@{1}، لأن الـ rebase يحرّك الفرع مرة واحدة فقط عند انتهائه. وإن كنت قد دفعت الفرع بعد الـ rebase، فادفع النسخة المستعادة باستخدام --force-with-lease.

كم يحتفظ git reflog بالـ commits المحذوفة؟

يحتفظ Git افتراضيًا بسطر الـ commit المفقود، أي الذي لم يعد يصل إليه أي فرع، في الـ reflog مدة 30 يومًا، أما سطور الـ commits التي ما زالت على فرع فتبقى 90 يومًا. وما دام السطر موجودًا فإن جمع المهملات يُبقي الـ commit الذي يشير إليه. ولتحتفظ بـ commit إلى أجل غير مسمى، ضع عليه فرعًا أو وسمًا، مثل git branch rescue <hash>، فـ Git لا يحذف أبدًا commit يشير إليه فرع.

هل يمكن استرجاع التغييرات غير المحفوظة بعد git reset --hard؟

غالبًا لا، إن اعتمدت على Git وحده. فالـ reflog يسجّل الـ commits لا التعديلات في مجلد العمل، لذا راجع السجل المحلي في محرر الأكواد. أما الملفات المجهّزة فقد تنجو ككائنات معلّقة يكتبها git fsck --lost-found في .git/lost-found/other/ دون أسماء ملفاتها. ويحفظ GitTree التغييرات غير المحفوظة في لقطة قبل أي hard reset ينفّذه بنفسه.

كيف أتراجع عن force-push؟

ابحث عن رأس الفرع البعيد الذي استبدلته: يعرضه git reflog show origin/main باسم origin/main@{1}، وقد ظهر في مخرجات الدفع كأول hash في old...new. ثم شغّل git push --force-with-lease origin <hash>:main. وإن كتب دفعك فوق commits لم تجلبها قط، فاطلب ممن دفعها أن يدفعها من جديد من نسخته.

هل يستطيع GitTree التراجع عن git push؟

لا. الدفع العادي لا يُتراجع عنه من GitTree؛ ألغِ الـ commit بـ revert بدلًا من ذلك. أما في الـ force-push فيحتفظ GitTree برأس الفرع البعيد الذي استُبدل في لقطة استرداد، فلا يضيع شيء، لكن إعادة الخادم تحتاج إلى دفع جديد. ويشمل Undo العمليات المحلية مثل الـ commits والـ reset والـ rebase والـ checkout وحذف الفروع.

هل يُشارَك git reflog مع فريقي؟

لا. يعيش الـ reflog في مجلد .git المحلي فقط. لا يُدفع إلى الخادم أبدًا، ولا يجلب الـ fetch سجلات غيرك، وأي نسخة جديدة تبدأ بسجل فارغ. لذا لا يمكن استرجاع commit ضاع من زميلك إلا على جهازه، ويحتفظ سجلك بالـ commits الخاصة بك حتى لو كتب أحدهم فوق الفرع البعيد.

المصادر

تحققنا من المعلومات عن المنتجات الأخرى من صفحاتها الرسمية بتاريخ 6 أكتوبر 2026. الأسعار والميزات تتغير، وصفحات الشركات هي المرجع.