هل هناك طريقة لجعل git علامة ملف كما يتعارض؟
سؤال
من الممكن ارتكاب ملفات تحتوي على بيانات الصراع. هل هناك طريقة لتمييز هذه الملفات على أنها متضاربة مرة أخرى ، بحيث يقوم تشغيل 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