يمكننا تسوية تطبيق عن طريق دمج كود مشكوك فيه، سواء كان ذلك بسبب دمج عمل غير مكتمل عمداً في الفرع الرئيسي أو تجاهل خطأ حاسم قد فات اختبارات التشغيل التلقائية.
في هذا المقال، سأرشدك من خلال عملية استخدام أمر 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
إلى مكانه السابق. لهذا، نقوم بما يلي:
- نحدد الرأس
HEAD
السابق باستخدامgit reflog
- إعادة تعيين
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 الذي يتم عكسه في نزاع مع التغييرات اللاحقة في المجموعة البرمجية. في هذه الحالات:
- سيوقف Git عملية العكس: نحتاج ل manual resolve النزاعات. سيقوم Git بتعيين الملفات المتنازعة وطلب التدخل.
- حل النزاعات: نفتح كل ملف متنازع، نحل النزاعات المحددة بواسطة Git، ونحفظ التغييرات.
- تجميع الملفات المحلولة:
git add <file-path>
- مواصلة عملية العكس:
git revert --continue
الخاتمة
استخدام git revert
لتراجع commits الاندماج يضمن أن كل تغيير وتصحيح مسجل في تاريخCommit.
بالإضافة إلى ذلك، فهم السيناريوهات المناسبة لتطبيق git reset
مقابل git revert
يتيح لنا اتخاذ قرارات أفضل، خاصة عند النظر في تدفقات العمل التعاونية أو التغييرات المحلية فقط.
يمكنك قراءة المزيد عن هذا الموضوع في قسم الأسئلة الشائعة أدناه. إذا كنت ترغب في معرفة المزيد عن Git، أنصحك بزيارة هذه الموارد: