git كيفية حل النزاعات دمج في جيت




15 Answers

هذه حالة استخدام محتملة ، من الأعلى:

ستقوم بإجراء بعض التغييرات ، ولكن ، لا تكون حديثًا:

git fetch origin
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

حتى تحصل على ما يصل إلى التاريخ وحاول مرة أخرى ، ولكن لديك صراع:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

لذلك قررت أن تلقي نظرة على التغييرات:

git mergetool

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

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

ثم نحاول الوقت النهائي

git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

تا-دا!

git git-merge merge-conflict-resolution git-conflict-resolution

هل هناك طريقة جيدة لشرح كيفية حل نزاعات الدمج في جيت؟




  1. تحديد الملفات التي هي في صراع (Git يجب أن تخبرك بذلك).

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

  3. بمجرد حل التعارض في ملف git add the_file .

  4. بمجرد حل جميع التعارضات ، قم بعمل git rebase --continue أو أيا كان الأمر Git الذي يجب القيام به عند الانتهاء.




يحدث تعارضات دمج عند إجراء تغييرات على ملف في نفس الوقت. هنا كيفية حلها.

git CLI

فيما يلي خطوات بسيطة ما يجب فعله عند الدخول في حالة تعارض:

  1. لاحظ قائمة الملفات التي تم Unmerged paths مع: git status (تحت قسم Unmerged paths ).
  2. حل التعارضات بشكل منفصل لكل ملف بواسطة أحد الأساليب التالية:

    • استخدام واجهة المستخدم الرسومية لحل الصراعات: git mergetool (أسهل طريقة).

    • لقبول الإصدار البعيد / الآخر ، استخدم: git checkout --theirs path/file . سيؤدي هذا إلى رفض أي تغييرات محلية قمت بها لهذا الملف.

    • لقبول المحلية / git checkout --ours path/file ، استخدم: git checkout --ours path/file

      ومع ذلك عليك أن تكون حذرا ، والتغييرات عن بعد أن الصراعات التي أجريت لسبب ما.

      ذات الصلة: ما هو المعنى الدقيق ل "لنا" و "ملكهم" في بوابة؟

    • قم بتحرير الملفات المتعارضة يدويًا وابحث عن كتلة التعليمة البرمجية بين <<<<< / >>>>> ثم اختر الإصدار إما من أعلى أو أسفل ===== . انظر: كيف يتم تقديم النزاعات .

    • يمكن حل تعارضات المسار واسم الملف بواسطة git add / git rm .

  3. وأخيرًا ، راجع الملفات الجاهزة للالتزام باستخدام git status .

    إذا كان لا يزال لديك أي ملفات تحت Unmerged paths ، وقمت بحل التضارب يدويًا ، فتأكد من أن Git تعرف أنك حلته من خلال: git add path/file .

  4. إذا تم حل كافة التعارضات بنجاح ، فقم بإجراء التغييرات من خلال: git commit -a والضغط على بعيد كالمعتاد.

راجع أيضًا: حل تعارض الدمج من سطر الأوامر في GitHub

DiffMerge

لقد نجحت في استخدام DiffMerge الذي يمكنه مقارنة الملفات ودمجها بشكل مرئي على Windows و MacOS و Linux / Unix.

يمكن أن يظهر بشكل بياني التغييرات بين 3 ملفات ويسمح بالدمج التلقائي (عندما يكون ذلك آمنًا) والتحكم الكامل في تحرير الملف الناتج.

مصدر الصورة: DiffMerge (لقطة شاشة لنظام التشغيل Linux)

ببساطة تحميل البرنامج وتشغيل في repo على النحو التالي:

git mergetool -t diffmerge .

ماك

على نظام MacOS ، يمكنك التثبيت عبر:

brew install caskroom/cask/brew-cask
brew cask install diffmerge

وربما (إذا لم يتم توفيره) فأنت تحتاج إلى الغلاف الإضافي البسيط التالي الموجود في المسار الخاص بك (على سبيل المثال /usr/bin ):

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"

ثم يمكنك استخدام اختصارات لوحة المفاتيح التالية:

  • - Alt - لأعلى / لأسفل للانتقال إلى التغييرات السابقة / التالية.
  • - Alt - يسار / يمين لقبول التغيير من اليسار أو اليمين

بدلا من ذلك يمكنك استخدام opendiff (جزء من أدوات Xcode) الذي يتيح لك دمج ملفين أو أدلة معا لإنشاء ملف ثالث أو دليل.




انظر كيف يتم تقديم التعارضات ، أو في Git ، git merge وثائق git merge لفهم ما هي علامات دمج التعارض.

يشرح قسم " كيفية حل التعارضات" أيضًا كيفية حل التعارضات :

بعد رؤية التعارض ، يمكنك تنفيذ أمرين:

  • تقرر عدم دمج. عمليات التنظيف الوحيدة التي تحتاج إليها هي إعادة تعيين ملف الفهرس إلى HEAD الالتزام بالعكس 2. ولتنظيف التغييرات في شجرة العمل التي تم إجراؤها بواسطة 2. و 3؛ git merge --abort يمكن استخدام git merge --abort لهذا الغرض.

  • حل النزاعات. ستحدد بوابة التعارضات في شجرة العمل. تحرير الملفات إلى الشكل و git add إلى الفهرس. استخدام git commit بختم الصفقة.

يمكنك العمل من خلال التعارض مع عدد من الأدوات:

  • استخدم mergetool. git mergetool لإطلاق mergetool رسومية والتي ستعمل من خلال الدمج.

  • انظر إلى الاختلافات. سيعرض git diff MERGE_HEAD ، يبرز التغييرات من كل من الإصدارين HEAD و MERGE_HEAD .

  • انظر إلى الاختلافات من كل فرع. git log --merge -p <path> على الإصدارات أولاً لإصدار HEAD ثم إصدار MERGE_HEAD .

  • انظر إلى النسخ الأصلية. git show :1:filename يعرض السلف المشترك ، git show :2:filename يُظهر إصدار HEAD ، و git show :3:filename يُظهر إصدار MERGE_HEAD .

يمكنك أيضًا قراءة حول دمج علامات التعارض وكيفية حلها في قسم Pro Git Book Basge Conflicts .




يرجى اتباع الخطوات التالية لإصلاح دمج التعارضات في Git:

  1. تحقق من حالة Git: git status

  2. احصل على patchset: إحضار git (الخروج التصحيح الصحيح من التزام Git الخاص بك)

  3. الخروج فرع محلي (temp1 في المثال الخاص بي هنا): git checkout -b temp1

  4. سحب محتويات الأخيرة من الرئيسي: سحب جيت - سيد المنشأ الأثيوبية

  5. ابدأ في mergetool وتحقق من التعارضات واصلاحها ... وتحقق من التغييرات في الفرع البعيد مع فرعك الحالي: git mergetool

  6. تحقق من الحالة مرة أخرى: حالة git

  7. حذف الملفات غير المرغوب فيها التي تم إنشاؤها محليًا بواسطة mergetool ، عادة ما تقوم mergetool بإنشاء ملف إضافي بامتداد * .orig. يرجى حذف هذا الملف لأن ذلك هو مجرد تكرار التغييرات والإصلاح محليًا وإضافة الإصدار الصحيح لملفاتك. إضافة git #your_changed_correct_files

  8. تحقق من الحالة مرة أخرى: حالة git

  9. قم بإدخال التغييرات على نفس معرف الالتزام (هذا يتجنب مجموعة تصحيح منفصلة جديدة): git commit --amend

  10. ادفع إلى الفرع الرئيسي: git push (إلى مستودع Git الخاص بك)




أرغب في الحصول على النسخة الخاصة بي بالكامل أو ترغب في مراجعة التغييرات الفردية وتحديد كل منها.

اقبل تمامًا النسخة الخاصة بي أو الخاصة بهم :

اقبل إصداري (محلي ، خاص بنا):

git checkout --ours -- <filename>
git add <filename>              # Marks conflict as resolved
git commit -m "merged bla bla"  # An "empty" commit

قبول نسختهم (عن بعد ، ملكهم):

git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"

إذا كنت تريد أن تفعل لجميع ملفات الصراع تشغيل:

git merge --strategy-option ours

أو

git merge --strategy-option theirs

مراجعة جميع التغييرات وقبولها بشكل فردي

  1. git mergetool
  2. مراجعة التغييرات وقبول أي إصدار لكل منها.
  3. git add <filename>
  4. git commit -m "merged bla bla"

mergetool الافتراضي يعمل في سطر الأوامر . يجب أن تكون كيفية استخدام mergetool سطر الأوامر سؤال منفصل.

يمكنك أيضًا تثبيت أداة مرئية لهذا ، مثل meld والتشغيل

git mergetool -t meld

وسوف تفتح النسخة المحلية (لنا) ، "قاعدة" أو "دمج" نسخة (النتيجة الحالية للدمج) والإصدار عن بعد (لهم). قم بحفظ النسخة المدمجة عند الانتهاء ، قم بتشغيل git mergetool -t meld مرة أخرى حتى تحصل على "No files need merging" ، ثم انتقل إلى Steps 3. و 4.




علاوة:

عند التحدث عن السحب / الجلب / الدمج في الإجابات السابقة ، أود مشاركة خدعة شيقة ومثمرة ،

git pull --rebase

هذا الأمر أعلاه هو الأمر الأكثر فائدة في حياتي git التي أنقذت الكثير من الوقت.

قبل دفع تغييرك الملتزم حديثًا إلى الخادم البعيد ، جرّب git pull --rebase بدلاً من git pull merge اليدوي وسيقوم تلقائيًا بمزامنة أحدث تغييرات الخادم البعيد (مع الجلب + الدمج) git pull --rebase المحلي الأخير في الأعلى في بوابة سجل. لا داعي للقلق حول السحب اليدوي / الدمج.

في حالة النزاع ، استخدم فقط

git mergetool
git add conflict_file
git rebase --continue

العثور على التفاصيل في: http://gitolite.com/git-pull--rebase




هناك 3 خطوات:

  1. البحث عن الملفات التي تسبب التعارضات بالأمر

    git status
    
  2. تحقق من الملفات التي ستجد فيها التعارضات التي تحمل علامة

    <<<<<<<<head
    blablabla
    
  3. تغييره بالطريقة التي تريدها ، ثم ارتكبت مع الأوامر

    git add solved_conflicts_files
    git commit -m 'merge msg'
    



اعتبارًا من 12 ديسمبر 2016 ، يمكنك دمج الفروع وحل النزاعات على github.com

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

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




أنا دائما اتبع الخطوات التالية لتجنب الصراعات.

  • git checkout master (تعال إلى الفرع الرئيسي)
  • سحب git (تحديث الرئيسي الخاص بك للحصول على أحدث رمز)
  • git checkout -b mybranch (تحقق من فرع جديد وابدأ بالعمل على هذا الفرع حتى يبقى سيدك دائماً في قمة الجذع).
  • غيت اضيف. و git ارتكاب و git push (في الفرع المحلي الخاص بك بعد التغييرات)
  • git checkout master (أعود إلى سيدك).

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




يمكن أن يحدث دمج النزاعات في حالات مختلفة:

  • عند تشغيل "git fetch" ثم "git merge"
  • عند تشغيل "git fetch" ثم "git rebase"
  • عند تشغيل "git pull" (وهو في الواقع يساوي أحد الشروط المذكورة أعلاه)
  • عند تشغيل "git stash pop"
  • عندما تقوم بتطبيق تصحيحات بوابة (git patches) (التي يتم تصديرها إلى ملفات ليتم نقلها ، على سبيل المثال ، عبر البريد الإلكتروني)

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

https://sourceforge.net/projects/kdiff3/files/

راجع للشغل إذا قمت بتثبيت Git Extensions يوجد خيار في معالج الإعداد الخاص به لتثبيت Kdiff3.

ثم تكوين git configs لاستخدام Kdiff كـ mergetool الخاص به:

$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false

$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false

(تذكر استبدال المسار بالمسار الفعلي لملف Kdiff exe.)

ثم في كل مرة تواجه فيها تعارضًا للدمج ، تحتاج فقط إلى تشغيل هذا الأمر:

$git mergetool

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

إليك ما يبدو عليه Kdiff3:

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

للتحقق من دمج كل شيء بنجاح ، قم بتشغيل الأمر mergetool مرة أخرى ، يجب أن تحصل على هذه النتيجة:

$git mergetool
No files need merging



جلبه
بوابة الخروج الخاص بك فرع
git rebase الرئيسية

في هذه الخطوة ، ستحاول إصلاح التعارض باستخدام IDE الذي تفضله

يمكنك اتباع هذا الرابط للتحقق من حل المشكلة في الملف
https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/

git add
git rebase - continue
git commit --amend
git push origin HEAD: refs / drafts / master (push as a drafts )

الآن كل شيء على ما يرام وسوف تجد ارتكابك في جيريت

آمل أن يساعد هذا كل واحد فيما يتعلق بهذه القضية.




لأولئك الذين يستخدمون Visual Studio (2015 في حالتي)

  1. إغلاق المشروع الخاص بك في VS. خاصة في المشاريع الكبيرة يميل VS إلى النزول عند الدمج باستخدام واجهة المستخدم.

  2. هل الدمج في القيادة الاوامر.

    بوابة الخروج

    بوابة دمج

  3. ثم افتح المشروع في VS وانتقل إلى Team Explorer -> الفرع. توجد الآن رسالة تقول أن Merge قيد المراجعة ويتم سرد الملفات المتعارضة أسفل الرسالة مباشرةً.

  4. انقر فوق الملف المتعارض وسيكون لديك خيار الدمج ، المقارنة ، أخذ المصدر ، أخذ الهدف. أداة الدمج في VS سهلة الاستخدام للغاية.




أنا أتابع العملية أدناه.

عملية إصلاح التعارض الدمج:

  1. أولاً ، اسحب الأحدث من فرع الوجهة الذي تريد الدمج إليه git pull origin develop

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

  3. يمكنك git addإضافة هذه الملفات المحررة إلى قائمة git بحيث يمكن أن تكون commitوإلى pushنفس الفرع الذي تعمل عليه.

  4. كما git addهو الحال ، افعل git commitلارتكاب التغييرات.

  5. الآن دفع التغييرات إلى فرع عملك من قبل git push origin HEAD

هذا هو وسوف ترى حلها في طلب السحب الخاص بك إذا كنت تستخدم Bitbucket أو GitHub.




git checkout branch1

git fetch origin

git rebase -p origin/mainbranch

إذا كان هناك تعارضات دمج ، إصلاحها. ثم ، تابع عملية rebase عن طريق تشغيل:git rebase –-continue

بعد التثبيت يمكنك ارتكاب ودفع الفرع المحلي الخاص بك إلى فرع بعيد

git push origin branch1



Related