تراجع عن دمج التعديل في Git: دليل شامل مع أمثلة

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

في هذا المقال، سأرشدك من خلال عملية استخدام أمر git revert لتراجع دمج آمن، مما يضمن أن يظل تاريخ الأ commit سليماً وتمتين سلامة المشروع.

كيف يعمل git revert

يمكننا أن نعتبر git revert كنسخة Git من أمر التراجع. ومع ذلك، أمر git revert لا ي 삭제 الأ commit أو ينتقل إلى حالة سابقة للفرع. بدلاً من ذلك، يقوم بإنشاء commit جديد يتراجع عن التغييرات من commit محدد.

الصيغة لتراجع commit يحمل哈希 <commit_hash> هي:

git revert <commit_hash>

يمكننا سرد الأ commit مع معرفاتها哈ش باستخدام أمر git log. ي列出 ناتج git log الأ commit من الأحدث إلى الأقدم، مثل:

على سبيل المثال، لتراجع commit يحتوي على دمج دالة طرح، سنستخدم الأمر:

git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151

باستخدام git revert يمكننا التراجع عن تغييرات commit محدد دون التأثير على تاريخ الأ commit.

ملاحظة أن git revert ليس سحريًا، واعتمادًا على تاريخ los commits، يمكن أن يؤدي إلى تعارض يجب حله يدويًا.

فوائد git revert على تغييرات يدوية

  • لماذا git revert مفيد إذا كنا قد نحتاج إلى حل تعارض يدوي؟ ألن يكون من الأسهل التراجع عن التغييرات يدويًا؟ دعونا نرى مزاياه:
  • الحفاظ على التاريخ: git revert يخلق commit جديد يتراجع عن تغييرات commit معين بينما يحافظ على تاريخCommit بأكمله. هذا يساعد في الحفاظ على تاريخ واضح للتغييرات والتراجعات.
  • التراجع الذري: يضمن أن التراجعات تكون ذرية ومتماسكة. عندما نحذف التغييرات ونقوم بالcommit يدويًا، هناك خطر من الخطأ البشري.
  • البيانات الوصفية: Commit جديد يخلقه git revert يحتوي على بيانات وصفية وmessage للcommit يصف ما تم التراجع عنه، مما يساعد في فهم المستقبل. بدون git revert، قد يفقد هذا السياق.

تراجع Merge في مواقف مختلفة

في هذا القسم، نتعلم كيفية التراجع عن merge. لغرض المثال، نحن ن假ب أننا ندمج فرعًا يُدعى feature إلى الفرع main بتنفيذ الأمر من الفرع main:

git merge feature

ما نتعلمه هنا يمكن تطبيقه على أي فرعين عن طريق استبدال الأسماء بشكل مناسب.

إعادة فك دمج لا يوجد له تعهد مرتبط

أمر git merge لا يخلق دائمًا تعهدًا جديدًا. يتم إنشاء تعهد فقط إذا كان الفرع main قد تفرع عن الفرع feature. لأن git revert يتطلب تعهدًا للعمل، لا يمكننا استخدامه في هذه الحالة.

يتفرع الفرعان main و feature عندما يتم إنشاء تعهدات جديدة على main ليست سلفًا للفرع feature. بمعنى آخر، تم إنشاء تعهدات جديدة على main بعد إنشاء feature.

إذا لم يتفرع الفرعان، عند تشغيل الأمر git merge feature على الفرع الرئيسي، سيستخدم Git الدمج السريع. هذا يعني أنه ينتقل برأس HEAD للفرع main إلى رأس HEAD للفرع feature.

يمكننا ملاحظة حدوث ذلك بالنظر إلى نتيجة git merge:

لإلغاء مثل هذا الدمج، نحتاج فقط إلى نقل رأس HEAD للفرع main إلى مكانه السابق. لهذا، نقوم بما يلي:

  1. نحدد الرأس HEAD السابق باستخدام git reflog
  2. إعادة تعيين HEAD إلى السابق باستخدام git reset --hard <previous_head>، واستبدال <previous_head> بالـ HEAD السابق.

سيبدو輻put git reflog كما يلي:

يمكننا تحديد الـ HEAD السابق عن طريق النظر في السطر الذي يقول “checkout: moving from feature to main” (يwrite feature و main لأن هذه هي أسماء فروعنا).

في هذه الحالة، الـ head السابق هو fe59838. لتحريك الـ HEAD لفرع main إليه وتراجع الدمج، نستخدم الأمر:

git reset --hard fe59838

تراجع دمج مرتبط بـ commit

إذا انحرف فرع main وفرع feature، عندئذٍ عند دمج الفرعين، يتم إنشاء commit جديد يسمى commit الدمج.

یطبق commit الدمج التغييرات من فرع إلى آخر. في هذه الحالة، التغييرات في feature تطبق على فرع main.

لتراجع التغييرات على فرع main، نستخدم git revert على commit الدمج. هذا سيقوم بإنشاء commit جديد يتراجع عن التغييرات التي تم إدخالها في فرع main بالدمج، مما يعيد حالة فرع main إلى ما كانت عليه قبل الدمج.

أولاً، نحتاج لتحديد هاش الدمج. يمكننا القيام بذلك باستخدام أمر git log:

因为合并提交具有两个 آباء، بناءً على ذلك، sintax أمر git revert مختلف قليلاً. نحتاج استخدام الخيار -m 1 لتحديد أننا نريد عكس التغييرات بالنسبة للفروع main:

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

حل النزاعات عند عكس Commit

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

  1. سيوقف Git عملية العكس: نحتاج ل manual resolve النزاعات. سيقوم Git بتعيين الملفات المتنازعة وطلب التدخل.
  2. حل النزاعات: نفتح كل ملف متنازع، نحل النزاعات المحددة بواسطة Git، ونحفظ التغييرات.
  3. تجميع الملفات المحلولة: git add <file-path>
  4. مواصلة عملية العكس: git revert --continue

الخاتمة

استخدام git revert لتراجع commits الاندماج يضمن أن كل تغيير وتصحيح مسجل في تاريخCommit.

بالإضافة إلى ذلك، فهم السيناريوهات المناسبة لتطبيق git reset مقابل git revert يتيح لنا اتخاذ قرارات أفضل، خاصة عند النظر في تدفقات العمل التعاونية أو التغييرات المحلية فقط.

يمكنك قراءة المزيد عن هذا الموضوع في قسم الأسئلة الشائعة أدناه. إذا كنت ترغب في معرفة المزيد عن Git، أنصحك بزيارة هذه الموارد:

Source:
https://www.datacamp.com/tutorial/git-revert-merge