سجل المراجع Git: فهم واستخدام سجلات المراجع في Git

لا يوجد شيء أكثر إزعاجًا لمطور أو مهندس بيانات من حذف فروع git أو إعادة تعيين المداخلات عن طريق الخطأ عندما لا تكون تريد ذلك. هذا هو السبب في سروري بمشاركة شيء تعلمته من خلال تجربتي الشخصية وأتمنى لو كنت قد تعلمته في وقت سابق، وهو كيفية استخدام git reflog. git reflog هي واحدة من تلك التقنيات التي تستحق بالتأكيد التعلم؛ إذا قمت بإيلاء بعض الوقت الآن، يمكنك تجنب الصداع الكبير فيما بعد.

سأريك كيفية استخدام git reflog، الذي أجده مفيدًا حقًا في التنقل والاسترجاع من الأخطاء، وأود أيضًا أن أوصي بدوراتنا أسس Git و مقدمة في مفاهيم GitHub لتعلم كل ما تحتاج إلى معرفته عن التحكم في النسخ.

ما هو git reflog؟

Git reflog، أو سجل المراجع، هو آلية تتبع محلية تسجل التحديثات على أطراف الفروع ومرجع HEAD في مستودع Git. (في سياق Git، يشير HEAD إلى المدخل الحالي الذي يستند إليه دليل العمل ومنطقة التجهيز.)

على عكس git log، الذي يعرض تاريخ المدخلات بناءً على النسب، ويظهر كيفية ربط المداخلات في فرع، يلتقط git reflog جميع حركات HEAD، بما في ذلك تبديلات الفرع، وإعادات القاعدة، وإعادات الضبط، والمداخلات. هذا يجعل reflog مفيدًا لاستعادة المداخلات المفقودة وتصحيح الإجراءات الأخيرة.

متى تتم إنشاء مداخل reflog؟

تُنشأ إدخالات Reflog كلما قمت بتنفيذ إجراءات تغيير حالة HEAD أو مراجع الفروع. من السيناريوهات الشائعة:

  • القيام بتأكيد التغييرات باستخدام git commit.

  • التبديل إلى فرع مختلف باستخدام git checkout branch_name.

  • إنشاء فرع جديد باستخدام git branch new_branch.

  • إعادة القاعدة git rebase

  • إعادة التعيين إلى عملية تأكيد سابقة git reset --hard.

  • دمج الفروع باستخدام git merge.

هنا هو الكود الذي تستخدمه لتتبع التحديثات في المستودع المحلي:

git reflog

استخدام git reflog لتتبع التحديثات في المستودع المحلي. الصورة من تأليف المؤلف.

كيف يمكنك تفسير إخراج git reflog؟

يمكنك تفسير الإخراج على النحو التالي:

  • HEAD@{0}: كانت آخر حركة هي التبديل إلى الفرع HEAD.

  • HEAD@{1}: قبل ذلك، قمت بتغيير نوع الملف من .xlxs إلى تنسيق .csv.

  • HEAD@{2}: قمت بعملية أولية عند دفع الملفات إلى المستودع.

كل إدخال يظهر:

  • تجزئة الكوميت (fa82776)

  • رقم فهرس الريفلوغ (HEAD@{0}, HEAD@{1}, الخ)

  • وصف للإجراء المتخذ (كوميت، تحقق، إعادة القاعدة)

كيفية استخدام git reflog

توفر Git reflog وسيلة لتتبع تحديثات المراجع واستعادة الحالات السابقة لمستودعك. من خلال فهم كيفية التنقل بين إدخالات reflog ، يمكنك استعادة الcommits المفقودة ، وتراجع التغييرات ، ومقارنة الإصدارات السابقة لعملك. 

أمر git reflog الأساسي

أدناه هو أمر reflog الأساسي:

git reflog

يعرض الأمر أعلاه قائمة بالإجراءات الأخيرة التي حدثت فيها تحديثات على HEAD أو مراجع الفروع ، بما في ذلك الcommits ، وتبديل الفروع ، وإعادة التعيين ، وإعادة القاعدة ، وغيرها. يتم ترقيم كل إدخال ، مثل HEAD@{0} ، و HEAD@{1} ، لتمثيل موضعه في تاريخ reflog.

الرجوع إلى الحالات السابقة

تعمل reflog Git كسجل لتحديثات الإشارات السابقة، مما يسمح لنا بتحديد مواقع واستعادة نقاط سابقة في تاريخ مستودعنا. بدونها، لن تكون هذه الإشارات موجودة، وسيكون علينا الحاجة إلى التعرف الدقيق على تجزئات التحقق للعودة إلى حالات سابقة محددة. الآن، دعنا نستكشف كيف يمكن لـ Git أن يمكننا التنقل بين هذه الحالات السابقة باستخدام git checkout.

HEAD@{n}: تشير إلى إدخال معين في reflog، حيث يكون n الفهرس. على سبيل المثال، HEAD@{2} تشير إلى ثالث حالة أخيرة لـ HEAD.

git checkout HEAD@{2}

استخدام git checkout لتتبع التغييرات السابقة. الصورة من قبل المؤلف.

branch@{time}: تشير إلى حالة فرع في وقت معين. على سبيل المثال، main@{1.week.ago} تشير إلى حالة الفرع الرئيسي قبل أسبوع بينما feature@{yesterday} تشير إلى حالة فرع الميزات البارحة.

git checkout main@{1.week.ago}

استخدام git checkout لتتبع التغييرات السابقة. الصورة بواسطة المؤلف.

مؤهلات زمنية

git reflog لا يساعدنا فقط في استعادة الحالات السابقة بل يتيح لنا أيضًا مقارنتها. نظرًا لأن reflog يتتبع تحديثات المراجع، يمكننا استخدامه لرؤية كيف تغير مستودعنا بمرور الوقت. الآن، دعونا نلقي نظرة على كيفية استخدام git diff لمدخلات reflog لمقارنة الحالات الماضية والحاضرة.

فيما يلي أمثلة لمؤهلات زمنية تجعل من السهل استعادة مستودعك إلى نقطة معينة في الزمن بدلاً من الاعتماد فقط على أرقام فهرس reflog.

git checkout HEAD@{1.minute.ago} # حالة من منذ دقيقة واحدة
git checkout HEAD@{1.hour.ago} # حالة من منذ ساعة واحدة
git checkout HEAD@{1.week.ago} # حالة من منذ أسبوع واحد
git checkout HEAD@{yesterday} # الحالة منذ البارحة
git checkout HEAD@{2024-01-01.12:00:00} # الحالة في الوقت المحدد

مقارنة الحالات السابقة مع git diff

يمكنك مقارنة الحالات السابقة باستخدام أوامر مثل git diff. يقوم الأمر التالي بمقارنة الحالة الحالية للفرع الرئيسي main@{0} مع حالته منذ يوم واحد، main@{1.day.ago}. سيظهر الإخراج أي اختلافات بين هاتين النسختين.

git diff main@{0} main@{1.day.ago}

مقارنة الحالات السابقة باستخدام git diff. صورة بواسطة المؤلف.

حالات الاستخدام الشائعة لـ Git Reflog

Git reflog هو أداة لا غنى عنها لاستعادة التغييرات المفقودة، وتراجع الأخطاء، وإصلاح الأخطاء الشائعة في Git. فيما يلي بعض السيناريوهات العملية التي يمكن أن يساعد فيها git reflog.

التراجع عن إعادة التعيين الخاطئة

إذا قمت بإعادة تعيين فرعك بشكل خاطئ باستخدام git reset --hard، يمكنك استخدام reflog لاستعادة الحالة السابقة.

git reset --hard HEAD@{3}

استعادة الcommits المفقودة

إذا حذفت الفرع عن طريق الخطأ أو فقدت commits بسبب إعادة تعيين أو إعادة قاعدة، يمكنك العثور على الcommit المفقود باستخدام git reflog.

git reflog

حدد هاش الcommit من مخرجات reflog وقم بالتحقق منه:

git checkout <commit-hash>

عند التحقق من الcommit المفقود، يمكنك إنشاء فرع جديد لحفظه:

git branch recovered-branch <commit-hash>

إصلاح rebase خاطئ

إذا حدث خطأ في عملية إعادة القاعدة، يمكنك استخدام git reflog للعثور على التزام قبل عملية إعادة القاعدة وإعادة تعيين فرعك. حدد التزام قبل عملية إعادة القاعدة وقم بإعادة تعيينه.

git reset --hard HEAD@{3} # قم بضبط الرقم استنادًا إلى مخرجات reflog

استعادة فرع محذوف

إذا حذفت فرعًا عن طريق الخطأ، يمكنك استعادته باستخدام git reflog. ابحث عن آخر التزام معروف للفرع المحذوف وأعد إنشاؤه:

git branch restored-branch <commit-hash>

تتبع تاريخ الـ stash

يمكن استخدام git reflog أيضًا لعرض تاريخ الـ stash. يقوم الأمر أدناه بسرد عمليات الـ stash، مما يتيح لك استعادة الـ stash الأقدم إذا لزم الأمر.

git reflog stash

لتطبيق إدخال الاحتياطي السابق، استخدم الأمر التالي:

git stash apply stash@{2}

تحقق من برنامجنا التعليمي Git Pull Force: كيفية استبدال فرع محلي بفرع بعيد لتعلم أفضل الممارسات لاستبدال التغييرات المحلية.

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

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

الأوامر الفرعية لسجل المراجع في Git

أدناه تفصيل منظم للأوامر الفرعية الرئيسية لـ git reflog واستخدامها.

git reflog show: يعرض إدخالات سجل المراجع لـ HEAD افتراضيًا أو لمرجع محدد مثل فرع.

git reflog show

استخدام أمر git reflog show لعرض الإدخالات للمرجع المحدد. صورة بواسطة المؤلف.

git reflog list: يعرض هذا الأمر جميع المراجع مع سجل الإدخالات. وهو مفيد لتحديد الفروع ومراجع HEAD مع إدخالات سجل مرجعية مخزنة.

git reflog list

git reflog delete <ref>@{<specifier>}: ينظف إدخالات سجل المراجع القديمة التي تتجاوز الحد الزمني المحدد. على سبيل المثال، يزيل الأمر التالي الإدخالات الأقدم من 30 يومًا.

git reflog expire --expire=30.days.ago

git reflog delete <ref>@{<specifier>}: يحذف إدخال سجل مرجعي معين بناءً على مرجعه وموضعه. يزيل الأمر أدناه إدخال سجل المرجع عند المؤشر 2 لـ HEAD.

git reflog delete HEAD@{2}

git reflog exists <ref>: يتحقق مما إذا كانت هناك reflog موجودة لمرجع محدد. على سبيل المثال، تعيد الأمر أدناه نجاحًا إذا كان لدى الفرع الرئيسي reflog.

git reflog exists main

خيارات لأوامر فرعية git reflog

فيما يلي الخيارات المتاحة لأوامر فرعية git reflog واستخدامها.

--expire-unreachable=<time>: يقوم بتنظيف إدخالات reflog فقط التي لا يمكن الوصول إليها من أي مرجع. على سبيل المثال، يزيل الأمر أدناه إدخالات reflog غير قابلة للوصول والتي تعود إلى أكثر من 7 أيام.

git reflog expire --expire-unreachable=7.days.ago

--all: يعالج reflogs لجميع المراجع، وليس فقط HEAD. الأمر أدناه يقوم بتنظيف جميع reflogs التي تعود إلى أكثر من 60 يومًا عبر جميع الفروع.

git reflog expire --expire=60.days.ago --all

--dry-run: يحاكي تنفيذ الأمر، معرضًا لما سيتم تنظيفه من دون حذف أي شيء فعليًا. على سبيل المثال، يعرض الأمر أدناه الإدخالات التي سيتم إزالتها.

git reflog expire --expire=30.days.ago --dry-run

--verbose: يوفر مخرجات مفصلة حول الإجراءات التي تم تنفيذها بواسطة الأمر. الأمر أدناه يعرض تفاصيل مفصلة أثناء انتهاء صلاحية إدخالات reflog القديمة.

git reflog expire --expire=90.days.ago --verbose

Git Reflog vs. Git Log: الاختلافات الرئيسية

كل من git log و git reflog يوفران رؤى حول تاريخ المستودع، لكنهما يخدمان أغراضًا مختلفة. دعونا نلقي نظرة على هذه الاختلافات لفهم كيف يمكن استخدام كل منهما في مراقبة الإصدارات واستراتيجيات الاستعادة.

  • git log يعرض تاريخ الاستدعاءات من خلال متابعة نسب الاستدعاءات في فرع معين. يوفر رؤية زمنية لكيفية تطور محتوى المستودع.

  • أمر git reflog يسجل التحديثات على المراجع مثل HEAD والفروع والـstashes، بما في ذلك الإجراءات مثل تبديل الفرع، وإعادة التعيين، وإعادة القاعدة، وغير ذلك. يتتبع التغييرات التي قد لا تكون جزءًا من نسب الcommit.

  • أمر git reflog محلي تمامًا على جهازك ولا يتم مشاركته مع مستودعات البعيد.

  • بينما لا يمكن لأمر git log استعادة التعهدات التي لم تعد جزءًا من نسب الفرع، يمكن لأمر git reflog المساعدة في استرداد التعهدات “المفقودة” عن طريق تتبع تحديثات المراجع، حتى إذا كانت تلك التعهدات لم تعد قابلة للوصول من أي فرع.

الجدول أدناه يلخص هذه الفروقات الرئيسية.

Feature git log git reflog
تتبع التعهدات نعم لا
تتبع تحديثات المراجع لا نعم
مشاركة عن بعد نعم
يمكن استرداد الالتزامات المفقودة لا نعم

أفضل الممارسات لاستخدام Git Reflog

جيت رفلوج هي أداة قوية لاسترداد الالتزامات المفقودة وإصلاح مشاكل التاريخ، ولكن استخدامها بشكل فعال يتطلب الحذر. فيما يلي بعض أفضل الممارسات لمتابعتها عند العمل مع رفلوج.

  • استخدم رفلوج للاسترداد والتصحيح: إذا قمت بإعادة تعيين أو إعادة قاعدة فرع بشكل غير صحيح عن طريق الخطأ، قم بالتحقق من git reflog للعثور على مرجع سابق واستعادته.

  • كن حذرًا مع git reset --hard: يمكن لأمر git reset --hard إزالة التغييرات غير المؤكدة بشكل دائم. تحقق دائمًا من reflog أولاً لضمان القدرة على الاسترداد في حال حدوث خطأ.

  • قم بعمل نسخ احتياطية قبل تشغيل الأوامر الخرابة: لحماية ضد فقدان البيانات، قم بتنفيذ نسخ احتياطية تلقائية لمستودعات Git الخاصة بك. قم دائمًا بتخزين النسخ الاحتياطية في موقع آمن، خارجي لضمان القدرة على الاسترداد في حالة فشل الأجهزة أو حدوث كوارث أخرى.

  • لا تعتمد فقط على Reflog للاسترداد على المدى الطويل: بشكل افتراضي، تُحتفظ بإدخالات reflog لمدة 90 يومًا. بعد هذه الفترة، قد تتم عملية تجميع القمامة عليها وتصبح غير قابلة للاسترداد. قم بدفع تعهداتك بانتظام إلى مستودع بعيد لضمان الاحتفاظ بها بما يتجاوز reflog المحلي الخاص بك.

  • استخدم git reflog expire لإدارة الإدخالات القديمة: إذا أصبح reflog الخاص بمستودعك مزدحمًا، فيمكنك تنظيف الإدخالات القديمة أو غير القابلة للوصول باستخدام git reflog expire.

الاستنتاج

إدارة تاريخ المشروع بفعالية في جيت تتطلب أكثر من مجرد الأوامر الأساسية. استكشاف الأدوات المتقدمة التي تتبع تحديثات الإشارات يمكن أن يوفر شبكة أمان قيمة لاستعادة الالتزامات المفقودة، واستعادة الفروع المحذوفة، وتصحيح الأخطاء. اكتساب الخبرة العملية مع هذه الأدوات، جنبًا إلى جنب مع الأوامر مثل git reset، git checkout، و git revert، يمكن أن يعزز بشكل كبير كفاءتك في التحكم بالإصدارات.

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

Source:
https://www.datacamp.com/tutorial/git-reflog