هل هناك طريقة لجعل git علامة ملف كما يتعارض؟

StackOverflow https://stackoverflow.com/questions/2780483

  •  03-10-2019
  •  | 
  •  

سؤال

من الممكن ارتكاب ملفات تحتوي على بيانات الصراع. هل هناك طريقة لتمييز هذه الملفات على أنها متضاربة مرة أخرى ، بحيث يقوم تشغيل Git Mergetool بإنشاء الملفات اللازمة وتشغيل أداة الدمج؟

هل كانت مفيدة؟

المحلول

يمكنك الحصول على محتويات ملف مع علامات الصراع باستخدام git checkout --conflict=merge -- file, ، ولكن إذا قمت بتنظيف الفهرس باستخدام git add file (أو إذا فعل واجهة المستخدم الرسومية ذلك من أجلك) ، فلن ينجح ذلك.

هنالك git update-index --unresolve, ، لكنه اختراق ، ولا يعمل بشكل موثوق للغاية. أعتقد أن الحالة التي تعيدها لن تكون كافية لـ Git-Mergetool.

من المحتمل أن تضطر إلى إعادة الدمج أو الاستخدام git update-index --cacheinfo لتعيين الإصدار مراحل يدويًا ... يمكن أن تساعدك Git-Stash في الحفاظ على النزاعات التي تم حلها بشكل صحيح.

نصائح أخرى

إذا كان الفهرس بالفعل في حالة تعارض ، فما عليك سوى التحقق من الملف مع --conflict=merge علَم:

git checkout --conflict=merge file

إذا كان الفهرس نظيفًا لأن الملف الذي لم يتم حله قد تمت إضافة [خطأ] ، فما عليك سوى إعادة ضبطه قبل التحقق منه:

git reset file
git checkout --conflict=merge file

سيتيح لك ذلك استئناف حل الصراع بشكل طبيعي (على سبيل المثال ، git mergetool).

ملاحظة: الترويج للتعليق على إجابة @jakub-narębski في إجابته الخاصة بالطلب من fourpastmidnight. قون

الحل الأكثر أناقة هو منع هذه المشكلة من البداية:
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false

بقدر ما أعرف، لن تكون قادرًا على الالتزام بينما لا يزال هناك ملف يحتوي على علامات تعارض فيه.... وهذا ليس صحيحًا تمامًا:
يذكر OP أنه يمكنك (نسخ هنا له pastbin) ، لكن هذا لن يكون كافياً ليتم تشغيل Mergetool مرة أخرى:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ git add README
lynx:~/test_clone$ git commit -a
Created commit 46ee062: It works!
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ cat README
<<<<<<< HEAD:README
testingtesting
=======
hmm
>>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$

كما تشارلز بيلي التعليقات ، وتوضح في هذا لذا أجب, تم الاستعلام عن Mergetool لأن هناك 3 حالات من نفس الملف في الفهرس:

للحصول على ملف غير مرغوب فيه في GIT GIT يتيح الإصدارات المشتركة ، المحلية والبعيدة للملف في الفهرس. (هذا هو المكان الذي يتم فيه قراءتهم للاستخدام في أداة Diff ثلاث اتجاهات بواسطة git mergetool.) يمكنك استخدام GIT Show لعرضها:

# common base:
git show :1:afile.txt

# 'ours'
git show :2:afile.txt

# 'theirs'
git show :3:afile.txt

git add (مع أي محتوى ، بما في ذلك علامات الصراع) سوف يزيل تلقائيًا 2 منها ، مما يضمن mergetool لن يكون دعا مرة أخرى.

VONC: لم أقم بإنشاء حساب في البداية (لدي الآن) ، لذلك لم أتمكن من نشر تعليق. يبدو أن استدعاء Git Mergetool لا يكتشف ذلك ، على ما يبدو:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ git add README
lynx:~/test_clone$ git commit -a
Created commit 46ee062: It works!
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ cat README
>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
No files need merging
lynx:~/test_clone$

يمكن لـ Git Mergetool قبول اسم الملف ، لكن هذا لا يعمل أيضًا:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
caracal:~/test_clone2$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
Merging the files: README

Normal merge conflict for 'README':
  {local}: modified
  {remote}: modified
Hit return to start merge resolution tool (emerge): 
caracal:~/test_clone2$ ls
#*merge*#145962bz#  README  README~  README.orig
caracal:~/test_clone2$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
No files need merging
caracal:~/test_clone2$ git mergetool README
merge tool candidates:  opendiff emerge vimdiff

README: file does not need merging
caracal:~/test_clone2$ ls
#*merge*#145962bz#  README  README~  README.orig
caracal:~/test_clone2$ 

لاحظ هنا أيضًا أنني لم ألتزم بعد الخروج من Git Mergetool.

يرجى استخدام git update-index --unresolve

نظرًا لأن GIT 1.7 يستخدم معلومات حلها من الفهرس لاستعادة جميع المراحل الثلاث (1: قاعدة ، 2: لنا ، 3: لهم): https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top