اذهب إلى المحتوى

كيفية استعادة إصدارات الملفات القديمة في جيت Git


هدى جبور

ستتعلم في مقال اليوم كيفية معرفة موقعك الحالي ضمن السجل الزمني لمشروعك، وكيفية استعادة الإصدارات القديمة للملفات، وكيفية إنشاء فروع branch في جيت حتى تتمكن من تجربة أفكارك الجديدة والعبث بالملفات بأمان.

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

استعادة ملف في مستودع git

كثيرة هي السيناريوهات التي قد تؤول بنا إلى الحاجة إلى استعادة حالة حُفِظ فيها الملف في نقطة زمنية سابقة؛ على سبيل المثال أثناء عملنا على أحد الملفات وتحقيقنا تقدمًا جيدًا للغاية في العمل عليه، ثم إضافته ثم إيداعه، ثم بعد شرب فنجان شاي وأخذ قسط من الراحة نستنتج أننا بحاجة إلى تعديل آخر، وخلال إجراء هذا التعديل نلاحظ أن ما فعلناه كان عبثًا، فنندم وتؤول بنا الحاجة إلى استعادة الملف إلى حالته السابقة (قبل هذه الفوضى)، وهنا يأتي دور الأمرgit checkout، حيث يتجلى الحل بالعودة إلى آخر إيداع نفذته، وفي هذه الحالة فهو يمثل الرأس:

$ git checkout HEAD filename

في حال قمت بإيداع إصدار سيئ لملفٍ ما من دون قصد، ودعت بك الحاجة إلى العودة إلى إيداع سابق، فابحث في سجل جيت لمشروعك لمعرفة الإيداعات السابقة التي قمت بتنفيذها، ثم اختر الإيداع الذي تراه مناسبًا:

$ git log --oneline

سيكون الخرج:

79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.

إن أردت الانتقال إلى الإيداع الأول ذي المعرف 55df4c2 فنفذ ما يلي:

$ git checkout 55df4c2 filename

الآن، بفرض أنك استعدت الإصدار الأقدم من الملف إلى موقعك الحالي (بإمكانك الاطلاع على موقع الحالي من خلال الأمر git status)، فستحتاج إلى إضافة الملف، ثم إيداعه لأنه تغير.

$ git add filename
$ git commit -m 'restoring filename from first commit.'

يمكنك الآن أن تبحث في سجل جيت للتحقق مما فعلته:

$ git log --oneline
d512580 restoring filename from first commit
79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.

العودة في الخط الزمني

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

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

$ git log --oneline
d512580 restoring filename from first commit
79a4e5f bad take
f449007 The second commit
55df4c2 My great project, first commit.

$ git checkout 55df4c2

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

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

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

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

لإنشاء فرع جديد في جيت والانتقال إليه، يمكنك استخدام الأمر التالي:

$ git checkout -b remix
Switched to a new branch 'remix'

أو يمكنك استخدام الكود التالي لإنشاء فرع جديد، لكن دون الانتقال إليه:

git branch <branch-name>

بذلك تكون قد أنشأت الفرع الجديد، لكنك تبقى في الفرع الأساسي، وفي حال أردت الانتقال إلى الفرع الجديد، استخدم الأمر:

git checkout <branch-name>

يمكنك أيضًا إنشاء فرع جديد، من فرع آخر (أي ليس من الفرع الحالي)، من خلال الأمر:

git checkout -b <new-branch-name> <from-branch-name>

الآن في حال رأيت أن فكرتك الثانية أو أن النهج الجديد فاشل، يمكنك العودة ببساطة إلى الفرع الرئيس:

$ git checkout master

أما إذا رأيت أنها تعطي نتائج أفضل، فعد إلى فرعك الرئيس وادمجها ضمنه:

$ git checkout master
$ git merge remix

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

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

العمل على المستودعات البعيدة

أصبحت تعرف الآن كيفية الاحتفاظ بالمستودع على جهازك المحلي والتعامل معه، ولكن ماذا عن استخدامه عندما تعمل مع المساهمين الآخرين؟

لتتمكن من التعاون مع المساهمين الآخرين في أي مشروع من خلال جيت، تحتاج إلى معرفة كيفية إدارة مستودعاتك البعيدة.

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

يتضمن التعاون مع الآخرين إدارة هذه المستودعات البعيدة ودفع البيانات Push وسحبها pull منها وإليها عندما تحتاج إلى مشاركة العمل. تتضمن إدارة المستودعات البعيدة معرفة كيفية إضافة مستودعات بعيدة، وإدارة مختلف الفروع البعيدة وتعريفها على أنها متتبعة أم لا، وغيرها العديد من الأمور الأخرى.

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

الفرق الوحيد بين العمل في مستودع جيت الخاص بك والعمل على شيء تريد مشاركته مع الآخرين هو أنه في مرحلة ما، تحتاج إلى دفع تغييراتك إلى مستودع شخص آخر. نُطلق على المستودع الذي تعمل عليه اسم "المستودع المحلي" وأي مستودع آخر اسم "المستودع بعيد".

عندما تقوم بنسخ مستودع مع أذونات قراءة وكتابة من مصدر آخر، فإن نسختك ترث المستودع البعيد كما هو كاملًا، وسيكون الاسم الافتراضي للمستودع الذي تم تنزيله هو origin، وهو الاسم المختصر الافتراضي الذي يعطيه جيت للخادم الذي نسخت منه المستودع، ويستخدم الاسم المختصر كمرجع للدلالة على المستودع بدلًا من كتابة مساره كاملًا (عنوان URL لذاك المستودع).

يمكننا تغيير اسم المستودع من الأصل origin إلى اسم آخر أيضًا. عادة ما يحتفظ الناس باسم المستودع "الأصل" نفسه، لكن من الضروري تغيير اسم المستودع المحلي (المستودع الذي قمت بتنزيله على جهازك) إذا كان هناك العديد من المستودعات (المشاريع) التي تعمل عليها.

يمكن استخدام الأمر التالي الذي يُظهر مسارات URL التي خزنها جيت للاستخدام عند القراءة من المستودع أو الكتابة فيه، وإن كان لديك أكثر من مستودع بعيد فسيعرضها كلها.

$ git remote --verbose
origin  seth@example.com:~/myproject.Git (fetch)
origin  seth@example.com:~/myproject.Git (push)

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

يمكنك إضافة مستودع جديد باسم مختصر يعد مرجعا للمستودع، من خلال الأمر التالي:

git remote add [shortname] [url]

على سبيل المثال:

$ git remote add seth@example.com:~/myproject.Git

إذا قمت بإجراء تعديلات على الملفات وأردت إرسالها إلى المستودع البعيد ولديك أذونات القراءة والكتابة في المستودع، فاستخدم الأمر git push:

git push [remote-name] [branch-name]

حيث [remote-name] يمثل الفرع على الخادم البعيد و [branch-name] على الخادم المحلي، حيث أنه في المرة الأولى التي تدفع فيها التغييرات يجب عليك أيضًا إرسال معلومات الفرع الخاص بك، ومن الأفضل دومًا عدم العمل على الفرع الرئيسي master، ما لم يُطلب منك القيام بذلك:

$ git checkout -b seth-dev
$ git add exciting-new-file.txt
$ git commit -m 'first push to remote'
$ git push -u origin HEAD

يؤدي هذا إلى دفع موقعك الحالي HEAD والفرع الموجود عليه إلى المستودع البعيد، وبعد أن تقوم بدفع فرعك أول مرة يمكنك الاستغناء عن الخيار ‎-u:

$ git add another-file.txt
$ git commit -m 'another push to remote'
$ git push origin HEAD

دمج الفروع

عندما تعمل بمفردك في مستودع جيت، يمكنك دمج أي فرع ضمن فرعك الرئيسي وقتما تشاء، أما عند العمل جنبًا إلى جنب مع أحد الشُركاء، فمن المحتمل أن ترغب في مراجعة التغييرات قبل دمجها في الفرع الرئيسي الخاص بك:

$ git checkout contributor
$ git pull
$ less blah.txt  # review the changed files
$ git checkout master
$ git merge contributor

إذا كنت تستخدم جيت هاب GitHub أو جيت لاب GitLab أو أي خدمة ويب مشابهة، فالعملية تكون مختلفة، فهناك من المعتاد أن تنسخ المشروع وتعامله كما لو كان مستودعك الخاص، حيث يمكنك العمل في المستودع وإرسال التغييرات إلى حسابك على جيت هاب أو جيت لاب دون الحصول على إذن من أي شخص، لأنه المستودع الخاص بك.

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

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

خاتمة

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

ترجمة -وبتصرف- للمقال How to restore older file versions in Git لصاحبه Seth Kenlon.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...