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



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.

تا-دا!

Question

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




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

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) الذي يتيح لك دمج ملفين أو أدلة معا لإنشاء ملف ثالث أو دليل.




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

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

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

  4. بمجرد حل جميع التعارضات ، قم بعمل git rebase --continue أو أيا كان الأمر 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 checkout your branch
git rebase master

In this step you will try to fix the conflict using your prefer IDE

You can follow this link to check ho to fix the conflict in the file
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 like a drafts)

Now every thing is fine and you will find your commit in gerrit

I hope that this will help every one concerning this issue.




يمكنك إصلاح التعارضات دمج في عدد من الطرق كما قد تفصيلية أخرى.

أعتقد أن المفتاح الحقيقي هو معرفة كيفية تدفق التغييرات مع المستودعات المحلية والبعيدة. مفتاح هذا هو فهم الفروع تتبع. لقد وجدت أنني أفكر في فرع التعقب بأنه "القطعة المفقودة في المنتصف" بيني دليل الملفات الفعلي المحلي والمعروف عن بعد كأصل.

أنا شخصيا حصلت على عادة من 2 أشياء للمساعدة في تجنب هذا.

بدلا من:

git add .
git commit -m"some msg"

الذي له عيبان -

أ) يتم إضافة جميع الملفات الجديدة / التي تم تغييرها والتي قد تتضمن بعض التغييرات غير المرغوب فيها.
ب) لا يمكنك مراجعة قائمة الملفات أولاً.

لذلك أنا أفعل:

git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.

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

[تحديث - مع مرور الوقت ، انتقلت أكثر إلى:

git status # Make sure I know whats going on
git add .
git commit # Then use the editor

]

أيضا (وأكثر ملاءمة لوضعك) ، أحاول تجنب:

git pull

أو

git pull origin master.

نظرًا لأن السحب يتضمن دمجًا وإذا كان لديك تغييرات محليًا لا تريد دمجها ، فيمكنك بسهولة إنهاء الشفرة المدمجة و / أو دمج التعارضات لرمز لم يكن يجب دمجه.

بدلا من ذلك أحاول القيام به

git checkout master
git fetch   
git rebase --hard origin/master # or whatever branch I want.

قد تجد أيضًا هذا مفيدًا:

git branch، fork، fetch، merge، rebase and clone، what are the difference؟




I follow the below process.

The process to fix merge conflict:

  1. First, pull the latest from the destination branch to which you want to merge git pull origin develop

  2. As you get the latest from the destination, now resolve the conflict manually in IDE by deleting those extra characters.

  3. Do a git add to add these edited files to the git queue so that it can be commit and push to the same branch you are working on.

  4. As git add is done, do a git commit to commit the changes.

  5. Now push the changes to your working branch by git push origin HEAD

This is it and you will see it resolved in your pull request if you are using Bitbucket or GitHub.




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

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

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




انظر كيف يتم تقديم التعارضات ، أو في 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 .




  1. create a new feature branch from target branch
  2. patch in the changes from conflicting feature branch
  3. resolve conflicts in diff tool as you apply patch
  4. commit/review clean pull request
  5. Delete the branch that has a conflict.

This has always been faster and easier for me than using GiT. It is especially beneficial if changes mess up a pull request and your IDE doesn't handle GiT merges very well.




استخدام الصبر

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

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

git merge -s recursive -X patience other-branch

من الوثائق:

With this option, merge-recursive spends a little extra time to avoid 
mismerges that sometimes occur due to unimportant matching lines 
(e.g., braces from distinct functions). Use this when the branches to 
be merged have diverged wildly.

مقارنة مع سلف مشترك

إذا كان لديك تعارض في الدمج وترغب في رؤية ما كان يفكر فيه الآخرون عند تعديل فرعهم ، فمن الأسهل أحيانًا مقارنة فرعهم مباشرة مع السلف المشترك (بدلاً من فرعنا). لذلك يمكنك استخدام merge-base :

git diff $(git merge-base <our-branch> <their-branch>) <their-branch>

عادةً ما تريد فقط مشاهدة التغييرات لملف معين:

git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>



There are 3 steps:

  1. Find which files cause conflicts by command
    git status
  1. Check the files, in which you would find the conflicts marked like

    <<<<<<<<head blablabla

  2. Change the way you want it ,then with commands

    git add solved_conflicts_files
    git commit -m 'merge msg'



إذا كنت تريد دمج من فرع (اختبار) لإتقان ، يمكنك اتباع الخطوات التالية:

الخطوة 1: اذهب إلى الفرع

git checkout test

git pull --rebase origin master : git pull --rebase origin master

الخطوة 3: إذا كان هناك بعض التعارضات ، انتقل إلى هذه الملفات لتعديلها.

الخطوة 4: إضافة هذه التغييرات

git add #your_changes_files

Step5: git rebase --continue

Step6: إذا كان لا يزال هناك تعارض ، العودة إلى Step3 مرة أخرى. إذا لم يكن هناك تعارض ، قم بما يلي: git push origin +test

Step7: ومن ثم لا يوجد تعارض بين الاختبار والماجستير. يمكنك استخدام الدمج مباشرة.




If you are using intelliJ as IDE Try to merge parent to your branch by

git checkout <localbranch>
git merge origin/<remotebranch>

It will show all conflicts like this

A_MBPro:test anu$ git merge origin/ Auto-merging src/test/java/com/.../TestClass.java CONFLICT (content): Merge conflict in src/test/java/com/.../TestClass.java

Now note that the file TestClass.java is shown in red in intelliJ Also git status will show

Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified:   src/test/java/com/.../TestClass.java

Open the file in intelliJ, it will have sections with

  <<<<<<< HEAD
    public void testMethod() {
    }
    =======
    public void testMethod() { ...
    }
    >>>>>>> origin/<remotebranch>

where HEAD is changes on your local branch and origin/ is changes from the remote branch. Here keep the stuff that you need and remove the stuff you don't need.After that the normal steps should do. That is

   git add TestClass.java
   git commit -m "commit message"
   git push



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

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

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

  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 (إلى مستودع git الخاص بك)






Related