- ما هو تعارض تمرير Git؟
- أنواع التمرير
- أنواع تعارضات تمرير Git
- أوامر حل تعارضات تمرير Git
- أدوات التمرير البصرية
- كيفية حل تعارض تمرير Git
- الخاتمة
ما هو تعارض تمرير Git؟
نظام Git لتحكم الإصدار هو كل شئ عن العمل كفريق والمساهمة في المشاريع. يعمل المطورون عادةً على فروع منعزلة، وحين ينتهون، يدمجون التغييرات مع الفرع الرئيسي. هذا النوع من العمل الفريقي هو مُنتج جداً وفعال في إيجاد الأخطاء. في بعض الأحيان يعمل مطورون متعددون على نفس خط الشفرة، وحين يحاولون دمج التغييرات، ينشأ تعارض.
مثال بسيط عن تعارض Git
الرسم البياني أعلاه يعطي المثال المثالي لكيفية حدوث تضارب مزيج في Git. الفرع الرئيسي يحوي ملف يحتوي على النص “HELLO, WORLD!”. يتم تقسيم الفرع الرئيسي بواسطة مستخدم “abid”, ويغير النص إلى “HELLO, CAT!”. بينما يقوم “abid” بالتغييرات، يتم أيضًا تعديل الفرع الأصلي ليصبح “HELLO, DOG!”. سيتم مزامنة هذه الفروع وستبدأ في المشاكل بالتضارب وستتوقف العملية.
ويولد أمر الأمر `git merge` لتركيب الفروع الاثنين ويحل الصراعات تلقائيًا. ومع ذلك فإنه يحدث أن الصراعات تكون بالأسفل حيث قامان شخصين بتغيير نفس السطر من البرمجيات أو قاموا بإزالة ملفات حرجة التي كان يعمل عليها مصممٌ آخر. سيعلم Git تلك التغييرات وسيتوقف عملية المزامنة. في هذه الحالة لم يتم حل الصراع تلقائيًا؛ بل المطور يتوجب عليه التدخل اليدوي أو استخدام أدوات لحل الصراع.
أنواع المزامنة
يوجد طريقتين لتركيب التغييرات من الفرع الهدف إلى الفرع المصدر: مزامنة Git وإعادة Git. إضافة إلى ذلك، يقوم Git merge بمزامنة ما يكون مزامنة تلقائية أو غير تلقائية. إذا كان رأس الفرع الهدف موجودًا في الفرع المصدر، فإن النوع الأفتراضي للمزامنة سيكون مزامنة تلقائية وإذا كان غير موجود، فإنه مزامنة غير تلقائية. إعادة Git هي نوع آخر من المزامنة التي تعيد ترتيب تاريخ التغييرات للفرع الهدف.
المزامنة التلقائية
بشكل افتراضي، يستخدم Git merge الإنتقال السريع لدمج التعديلات المفقودة في الفرع الهدف. على سبيل المثال، يُستخدم لتحديث الفرع المحلي من خلال خادم بعيد باستخدام أمر السحب. الإنتقال السريع لا يثير مشاكل تعارض الدمج لأن Git لن يطبقه إذا كان رأس الفرع الهدف مفقودًا في الفرع المصدر.
دمج بدون إنتقال سريع
يُسمى الدمج بدون إنتقال سريع أيضًا دمجًا ثلاثيًا أو حقيقيًا. يُنشئ تعديلًا جديدًا في الفرع الهدف من خلال دمج التغييرات في الفرع المصدر والفرع الهدف. يُمزج التغييرات بعد التعديل الأخير المشترك في كلا الفروع. في حالتنا، بعد C. هذا النوع من الدمج سيطرح تعارضات Git للدمج إذا كان الفرع المصدر في خلاف مع الفرع الهدف. في الرسم البياني أعلاه، يُنشئ تعديل الدمج (X) من خلال دمج الفرع المصدر والفرع الهدف، حيث أن K و E هما والدي التعديل الدمجي.
إعادة الأساس
إعادة أساس Git تختلف قليلاً عن الأنواع الأخرى. يغيّر سلسلة تاريخ تعديلات الفرع الهدف. يدمج الفرع المصدر بطريقة تضمن للفرع الهدف جميع التغييرات من الفرع المصدر، وبعدها جميع تعديلات الفرع الهدف بعد التعديل المشترك الأخير. في حالتنا، التعديل المشترك الأخير هو C، بينما D و E من الفرع المصدر. تعديل K* مثل K ولكن برقم تعديل مختلف. بدلاً من ربط C، سيكون الربط بE. مثل الدمج بدون إنتقال سريع، إذا كانت هناك مشاكل توافقية في الفرع المصدر والفرع الهدف، سيطرح Git القضية لحل التعارض قبل إنهاء إعادة الأساس.
أنواع تعارضات دمج Git
There are two types of Git merge conflicts: at the start and during the presence of the merge process – Atlassian. In this section, we will learn about both types and the ways to resolve each scenario.
At the Start of the Merge
Git merge will fail at the beginning if there are changes in the working directory or staging area. It fails at the start to prevent the changes from being overwritten by incoming merge commits. This is due to conflicts with local changes, not with other branches or developers. To stabilize the local state, you can use commands such as git stash
, git commit
, git checkout
, or
git reset
.
During the Merge
A failure during the merge indicates that there is a conflict between the source and target branch where multiple developers have modified the same file. If the automatic merge fails, Git will prompt you to resolve the issues manually. You can also use third-party tools to assist you in visualizing and integrating the changes.
Commands for Resolving Git Merge Conflicts
In this section, we will explore various native commands to visualize and resolve Git merge conflicts.
Common Commands
git status
plaintext
يتم إنتاج سجل Git بمعطيات –merge المؤشرات قائمة بالتفاصيل التي تحتوي على الإشارات التي تتعارض مع الفرع الأصلي.
git log --merge
بشكل افتراضي، سيظهر خيار git diff
الفرق بين التغييرات التي لم تُقم بالإشارة والإشارات السابقة. يستخدم git diff لمقارنة الفروع، الإشارات، والملفات. إنه مفيد لمنع تعارضات التمركز المستقبلية.
git diff
أوامر لفشل التمركز في بداية العملية
يستخدم checkout لإلغاء التغييرات أو التحويل إلى فرع جديد أو قديم.
git checkout
يستخدم Git reset لإرجاع التغييرات في الدليل العملي ومنطقة التجهيز.
git reset --mixed
أوامر لتعارضات أثناء عملية التمركز
المعطي –abort سيوقف عملية التمركز ويعيد التغييرات إلى حالتها الأصلية قبل بدء التمركز.
git merge --abort
يستخدم git reset عادة في مرحلة عملية التمركز لإرجاع الملفات المتعارضة إلى حالتها الأصلية.
git reset
حل تعارضات ملفات محذوفة-معدلة
ستحدث تعارض Git إذا قمت بحذف الملف في الفرع الحالي، وقام شخص آخر بتعديله في فرع آخر. في هذه الحالة، يمكنك إما إضافة الملف وإشارة الإشارة،
git add <filename>
أو يمكنك إزالة الملف وإشارة الإشارة.
git rm <filename>
أدوات التمركز المرئية
أدوات الدمج هي أدوات واضحة تصوريًا لتحديد وحل جميع أنواع الصراعات الدمجية. بعض الأدوات يدعمون قدرات إضافية مثل مقارنة التغييرات، عمليات Git، وإدارة المشاريع والمستودعات. يوجد أنواعين من أدوات دمج Git: الخاصة بالطرف فقط والقائمة على واجهة المستخدم. الأدوات القائمة على الطرف يتم فتحها في PowerShell أو Bash، والأدوات القائمة على واجهة المستخدم يتم فتحها في بيئة النوافذ.
لمعرفة القائمة بالأدوات المثبتة والصالحة، استخدم:
git mergetool --tool-help
القائمة تتألف من جميع الأدوات الصالحة التي يمكن تثبيتها وتكاملها مع أوامر git.
على سبيل المثال، لدينا vim و nvim المثبتين تلقائيًا، وإذا كنت تريد رؤية الفرق بين ملف لم يتم تسجيله وتفاصيل تسجيل سابق، أكتب:
git difftool --tool=vimdiff3
أداة vimdiff3 تبرز التغييرات وتسمح لك بمقارنة التسجيلات في داخل الطرف.
الفرق بين النسختين الأخرى من نفس الملف في Vimdiff3
Meld
Meld هو أداة مجانية ومفتوحة المصدر ترفع حل الصراعات الدمجية إلى مستوى آخر. لإدماجها مع Git، عليك أولاً تحميل وتثبيت البرنامج من الموقع الرسمي. ومن ثم، أضفها إلى الإعدادات العالمية بحيث ينطلق Git بشكل تلقائي يُطلق Meld لحل الصراعات.
أوامر الإعداد التالية صالحة فقط لمستخدمي Windows. الشيء الوحيد الذي عليك فعله هو تغيير مسار ملف Meld المثبت لماك أو لينكس.
git config --global merge.tool meld git config --global mergetool.meld.path "C:/Program Files (x86)/Meld/Meld.exe" git config --global diff.tool meld git config --global difftool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
plaintext
بعد تعيين الإفتراضات، يمكنك كتابة git difftool
داخل مسار جيت المحلي لإطلاق النسخة الويندوزية من Meld، أو يمكنك إستخدام git mergetool
لحل الصراعات المزامنة كما يظهر أدناه.
حل صراع المزامنة بواسطة Meld
VSCode
VSCode توفر الطريقة الأفضل والأكثر شعبية لحل الصراعات المزامنة. عندما يفشل جيت في دمج الملفات تلقائياً، ستبرز VSCode الشفرة المتعارضة وتعطيك خيارات أربعة: قبول التغييرات الحالية، قبول التغييرات القادمة، قبول كلا التغييرتين، ومقارنة التغييرات. يمكنك استخدام هذه الخيارات لتنظيف ملفك وحل جميع القضايا المعلقة.
حل الصراع المزامنة بواسطة VSCode
إذا كنت تبحث عن حل كامل لعمليات جيت، حاول GitKraken. يأتي بعميل مجاني، وامتداد VSCode، ويوفر أداة مدمجة لحل الصراعات المزامنة.
كيفية حل صراع مزامنة جيت
في هذا القسم سنتعلم كيفية إنشاء تضارب في Git وما يتوجب علينا فعله لحله. التورية منزلقة إلى قسمين. في القسم الأول، سنتعلم كيفية حل التضاربات في Git محلياً؛ والقسم الثاني يخص حل التضاربات مع مخزن بعيد (GitHub).
تضارب لمزامنة محلي
إنشاء التضاربات سيساعدنا على تعلم كيف تظهر هذه المشاكل في البداية. يمكننا بعد ذلك استخدام طرق إبداعية لحل هذه المشكلات أو حتى تجنبها من أجل المستقبل.
سوف نقم بإنشاء مجلد Git مع ملف واحد ونجذب أول تسجيل للبدء.
- قم بإنشاء مجلد يدعى datacamp.
- تغيير دليلك إلى datacamp.
- تنشيط Git.
- إنشاء ملف README.md مع عنوان معطوف.
- تحديد التغييرات في الملف والتوثيق.
mkdir datacamp cd datacamp git init echo "# How to Resolve Git Merge Conflict" > README.md git add README.md git commit -m "first commit" >>> [main (root-commit) 8199ea2] first commit >>> 1 file changed, 1 insertion(+) >>> create mode 100644 README.md
بعد ذلك، سوف نقم بإنشاء قسم جديد يدعى readme و تغيير عنوان المعطوف من “..Git Merge..” الى “..Git..”. إضافة الملف والتسجيل بواسطة جملة -am.
git checkout -b readme echo "# How to Resolve Git Conflict" > README.md git commit -am "new branch conflict added" >>> [readme 155f694] new branch conflict added >>> 1 file changed, 1 insertion(+), 1 deletion(-)
رجوع إلى القسم الرئيسي وإضافة سطر جديد إلى ملف README.md بواسطة >>. بحفظ التغييرات والتسجيل التقني لقد تم بناء تضارب بين 版本واحد من نفس الملف.
git checkout main echo "New change in base branch" >> README.md git commit -am " a line added to base branch Readme file" >>> [main f1f1874] a line added to base branch Readme file >>> 1 file changed, 1 insertion(+)
كما يمكننا رؤية، أثناء مزامنة قسم readme، تم تواصل Git عن رسالة تقول أن فشل المزامنة الautomatic وأن علينا إجراء التغييرات يدوياً ومن ثم التسجيل للنتيجة.
git merge readme >>> Auto-merging README.md >>> CONFLICT (content): Merge conflict in README.md >>> Automatic merge failed; fix conflicts and then commit the result.
سنحل المشكلة يدوياً بفتح وتحرير الملف في Notepad. ترون الصورة أدناه تظهر السهم مع HEAD، وقطعة تقسيم، وسهم مختلف الاتجاه مع readme. قسم الHEAD الذي يراه مع التغييرات الحالية في الشعب الرئيسي، وقسم الreadme هو الشعب الذي نريد دمجه، وهو يتكون من بروتوكول مختلف.
حل صراع الدمج يدوياً
لحل المشكلة، سنأخذ مجرد الشعب القديم والسهمات والقطعة التقسيمية إلى خارج. نسخة الملف النهائي يجب أن يبدو نظيفاً، كما ترون أدناه.
تم حل الصراع
بعد أن نضع الملف ونخلق ترشيح، سيتم حل الصراع المشترك. هذه هي الطريقة الأكثر شيوعًا والأسهل لحل مشكلات. يمكنك أيضًا استخدام بيئة تطوير متكاملة (IDE) لحل المشاكل بسرعة أكبر.
git commit -am "conflict resolved in file README.md" >>> [main 9994a29] conflict resolved in file README.md
صراع مشترك بعيدًا
لإنشاء وحل صراعًا بعيدًا، علينا إنشاء مجموعة جديدة على GitHub.
إنشاء مجموعة جديدة على GitHub
في المرحلة التالية، قم بإضافة اسم بعيد (المصدر) مع عنوان إلى المستودع وأرسل جميع التغييرات من المستودع المحلي إلى الشعب البعيد باستخدام الجهة الأعلى.
git remote add origin https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git git push --set-upstream origin main >>> Enumerating objects: 12, done. >>> Counting objects: 100% (12/12), done. >>> Delta compression using up to 4 threads >>> Compressing objects: 100% (6/6), done. >>> Writing objects: 100% (12/12), 998 bytes | 499.00 KiB/s, done. >>> Total 12 (delta 2), reused 0 (delta 0), pack-reused 0 >>> remote: Resolving deltas: 100% (2/2), done. >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> * [new branch] main -> main >>> branch 'main' set up to track 'origin/main'.
لإنشاء تضارب، يجب أن نحدث في الملف README.md المحلي والبعيد. يمكنك استخدام محرر الملفات GitHub لتغيير “..Git merge..” إلى “..Sit-Merge..” ومن ثم أرسل التغييرات.
إجراء تغييرات في محرر GitHub
ومن ثم، في المستودع المحلي، غير الملف README.md لإضافة عنوان بسيط وأرسل التغييرات.
echo "# How to Resolve Merge Conflicts in Git Tutorial" > README.md git commit -am "local branch changes in README.md" >>> [main c677a13] local branch changes in README.md >>> 1 file changed, 1 insertion(+), 4 deletions(-)
وأخيرًا، أرسل التغييرات إلى الخوادم البعيدة. لاحظ أن Git قد أرتفع خطأ مع توصيات عن كيفية تمكين المشكلة.
git push >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> ! [rejected] main -> main (fetch first) >>> error: failed to push some refs to 'https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git' >>> hint: Updates were rejected because the remote contains work that you do >>> hint: not have locally. This is usually caused by another repository pushing >>> hint: to the same ref. You may want to first integrate the remote changes >>> hint: (e.g., 'git pull ...') before pushing again. >>> hint: See the 'Note about fast-forwards' in 'git push --help' for details.
سنتبع التوجيه الأسهل، وهو أن نجذب الملف من الخوادم البعيدة قبل الرفع.
ففشل الجذب بسبب تضارب في الملف README.md. يمكنك تصحيحه يدويًا باستخدام Notepad، ولكن هذه المرة سنستخدم أداة بصرية لمساعدتنا في هذه العملية.
git pull >>> remote: Enumerating objects: 5, done. >>> remote: Counting objects: 100% (5/5), done. >>> remote: Compressing objects: 100% (2/2), done. >>> remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 >>> Unpacking objects: 100% (3/3), 681 bytes | 75.00 KiB/s, done. >>> From https://github.com/kingabzpro/DataCamp-Git-Merge-Guide >>> aaf149d..49b7d14 main -> origin/main >>> Auto-merging README.md >>> CONFLICT (content): Merge conflict in README.md >>> Automatic merge failed; fix conflicts and then commit the result.
ستحدد أداة الاندماج Meld الملفات المتضاربة وستظهرها في تطبيق Meld GUI.
git mergetool >>> Merging: >>> README.md >>> Normal merge conflict for 'README.md': >>> {local}: modified file >>> {remote}: modified file
هناك ثلاث أعمدات: README_LOCAL_473.md، README.md و README_LOCAL_473.md. إذا كنت تظن أن التغييرات البعيدة مناسبة، ثم انقر على الأسهم السوداء في الأعمدة البعيدة؛ وإذا أردت الحفاظ على التغييرات المحلية، ثم انقر على الأسهم السوداء في الأعمدة المحلية. إنه بسيط جدًا.
تحليل الصراع باستخدام أداة التركيب Meld
بعد التغييرات، حفظ الملف وأجري التأكيد. كما ترون، تحميل الملف إلى ال服务器 بعيد لا يثير خطأ التركيب المزامن.
git commit -am "remote main branch conflict resolved" git push >>> Enumerating objects: 16, done. >>> Counting objects: 100% (16/16), done. >>> Delta compression using up to 4 threads >>> Compressing objects: 100% (6/6), done. >>> Writing objects: 100% (10/10), 1.08 KiB | 550.00 KiB/s, done. >>> Total 10 (delta 2), reused 0 (delta 0), pack-reused 0 >>> remote: Resolving deltas: 100% (2/2), completed with 1 local object. >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> 49b7d14..8f5c3aa main -> main
تم حل الصراعات المزامنة المحلية والبعيدة بنجاح. يتم معالجة هذه الصراعات يومياً من قبل علماء البيانات والمهندسين المتخصصين في التعلم الماكيني. لتحسين مهاراتك في العمليات التي تتعلق بGit، اتخذ دورة دروس بدءية عن Git.
الخلاصة
حل الصراعات المزامنة في Git هو مهمة تعميمية وخطرة للغاية لأنه يمكنك تحطم البرمجيات بتركيب شيء من الشيء الخاطئ. توفر أدوات التركيب ببيئة مستخدمة بسيطة وطريقة آمنة للكشف عن وحل الصراعات المزامنة. في هذا الدرس التعليمي، تعلمنا سبب ظاهرة الصراعات في Git وكيفية حلها. أيضًا تغطينا أنواع مختلفة من التركيبات والصراعات، وأوامر Git مفيدة، وأدوات بصرية. في القسم الأخير، أنشأنا صراع تركيب وحله في مخزون محلي وبعيد.
إذا كنت جديدًا في Git وتريد تعلم كيفية عمله، إذهب وقرأ: درس بدءي عن Git ودرس تعليمي GitHub.
Source:
https://www.datacamp.com/tutorial/how-to-resolve-merge-conflicts-in-git-tutorial