سؤال

كنت أستخدم Git على Windows (msysgit) لتتبع التغييرات في بعض أعمال التصميم التي كنت أقوم بها.

اليوم كنت أعمل على جهاز كمبيوتر مختلف (مع الريبو عن بعد brian) وأحاول الآن دمج التعديلات التي تم إجراؤها اليوم مرة أخرى في نسختي المحلية العادية على الكمبيوتر المحمول الخاص بي.

على جهاز الكمبيوتر المحمول الخاص بي، لقد استخدمت git pull brian master لسحب التغييرات إلى الإصدار المحلي الخاص بي.كان كل شيء على ما يرام باستثناء مستند InDesign الرئيسي - وهذا يظهر على أنه تعارض.

النسخة على الكمبيوتر (brian) هو الأحدث الذي أريد الاحتفاظ به ولكني لا أعرف ما هي الأوامر التي تخبر الريبو باستخدام هذا الأمر.

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

يمكن لأي شخص لي نقطة في الاتجاه الصحيح؟

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

المحلول

وgit checkout يقبل الخيار --ours أو --theirs لمثل هذه الحالات. حتى إذا كان لديك الصراع دمج، وكنت أعلم أنك تريد ملف من الفرع الذي تقوم بدمج في فقط، يمكنك القيام به:

$ git checkout --theirs -- path/to/conflicted-file.txt

ولاستخدام هذا الإصدار من الملف. وبالمثل، إذا كنت تعرف أنك تريد الإصدار الخاص بك (وليس واحد يتم دمجها في) يمكنك استخدام

$ git checkout --ours -- path/to/conflicted-file.txt

نصائح أخرى

لديك لحل الصراع يدويا (نسخ ملف فوق) ومن ثم ارتكاب الملف (لا يهم إذا قمت بنسخ أكثر من ذلك أو استخدام نسخة محلية) مثل هذا

git commit -a -m "Fix merge conflict in test.foo"

وبوابة autocommits عادة بعد دمج، ولكن عندما يكشف الصراعات التي لا يمكن أن تحل من تلقاء نفسه، فإنه يطبق كافة تصحيحات أنه برزت ويترك الباقي لللك حل وارتكاب يدويا. و بوابة دمج Man صفحة ، و<ل أ href = "http://git.or.cz/course/svn.html#merge" يختلط = "noreferrer"> جيت-SVN تحطم دورة أو <وأ href = "HTTP: //www.bluishcoder. co.nz/2007/09/git-binary-files-and-cherry-picking.html "يختلط =" noreferrer "> هذا دخول بلوق قد يلقي بعض الضوء على الطريقة التي من المفترض أن تعمل.

تعديل: عرض وظيفة أدناه، لم يكن لديك فعلا لنسخ الملفات نفسك، ولكن يمكن استخدام

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

ولتحديد إصدار الملف الذي تريده. نسخ / تحرير ملف ستكون ضرورية فقط إذا كنت ترغب في مزيج من كلا الإصدارين.

يرجى وضع علامة الإجابة mipadis كما هو الصحيح.

يمكنك أيضًا التغلب على هذه المشكلة باستخدام

git mergetool

والذي يسبب git لإنشاء نسخ محلية من الملف الثنائي المتعارض وإنشاء محررك الافتراضي عليها:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

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

للحل عن طريق الحفاظ على الإصدار في الفرع الحالي (تجاهل هذا الإصدار من الفرع الذي تقوم بدمج في)، وأضيف وارتكاب الملف:

git commit -a

للحل عن طريق الكتابة فوق الإصدار في الفرع الحالي مع هذا الإصدار من الفرع الذي تقوم بدمج في، تحتاج لاسترداد تلك النسخة في دليل العمل الخاص بك أولا، ثم قم بإضافة / ارتكابها:

git checkout otherbranch theconflictedfile
git commit -a

<وأ href = "http://www.lostechies.com/blogs/joshuaflanagan/archive/2010/01/28/how-to-resolve-a-binary-file-conflict-with-git.aspx" يختلط = "noreferrer"> وأوضح بمزيد من التفصيل

والجواب mipadi للم تنجح تماما بالنسبة لي، وكنت بحاجة للقيام بذلك:

<اقتباس فقرة>   

وبوابة الخروج --ours الطريق / / file.bin

وأو، للحفاظ على نسخة يتم دمجها في:

<اقتباس فقرة>   

وبوابة الخروج --theirs الطريق / / file.bin

ثم

<اقتباس فقرة>   

وبوابة إضافة مسار / إلى / file.bin

وبعد ذلك كنت قادرا على القيام به "بوابة mergetool" مرة أخرى والاستمرار على الصراع المقبل.

من git checkout مستندات

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
عند التحقق من المسارات من الفهرس، راجع المرحلة رقم 2 (ours) أو رقم 3 (theirs) للمسارات غير المدمجة.

قد يحتوي الفهرس على إدخالات غير مدمجة بسبب فشل عملية الدمج السابقة.افتراضيًا، إذا حاولت سحب مثل هذا الإدخال من الفهرس، فستفشل عملية السحب ولن يتم سحب أي شيء.استخدام -f سوف يتجاهل هذه الإدخالات غير المدمجة.يمكن سحب المحتويات من جانب معين من الدمج من الفهرس باستخدام --ours أو --theirs.مع -m, ، يمكن تجاهل التغييرات التي تم إجراؤها على ملف شجرة العمل لإعادة إنشاء نتيجة الدمج المتعارضة الأصلية.

يهدف هذا الإجراء إلى حل تعارضات الملفات الثنائية بعد إرسال طلب سحب إلى Github:

  1. لذا، على Github، وجدت أن طلب السحب الخاص بك به تعارض في ملف ثنائي.
  2. عد الآن إلى نفس فرع git على جهاز الكمبيوتر المحلي الخاص بك.
  3. أنت (أ) تعيد إنشاء/إعادة إنشاء هذا الملف الثنائي مرة أخرى، و(ب) تُلزم الملف الثنائي الناتج بنفس فرع git.
  4. ثم تقوم بدفع نفس فرع git مرة أخرى إلى Github.

على Github، بناءً على طلب السحب الخاص بك، يجب أن يختفي التعارض.

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

% git fetch

وهذا جلب أحدث ارتكاب (ق) من مستودع بعيد (قد تحتاج لتحديد اسم فرع عن بعد، وهذا يتوقف على الإعداد الخاص بك)، ولكن لا تحاول دمجها. ويسجل في ارتكاب في FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

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

لقد صادفت استراتيجيتين لإدارة فرق/دمج الملفات الثنائية باستخدام Git على النوافذ.

  1. يتيح لك Tortoise git تكوين أدوات الفرق/الدمج لأنواع مختلفة من الملفات بناءً على امتدادات الملفات الخاصة بها.انظر 2.35.4.3.فرق/دمج الإعدادات المتقدمة http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html.تعتمد هذه الإستراتيجية بالطبع على توفر أدوات الفرق/الدمج المناسبة.

  2. باستخدام سمات git، يمكنك تحديد أداة/أمر لتحويل ملفك الثنائي إلى نص ثم السماح لأداة diff/merge الافتراضية الخاصة بك بالقيام بذلك.يرى http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes.تقدم المقالة أيضًا مثالاً على استخدام البيانات التعريفية لتمييز الصور.

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

إذا كان الثنائي شيء أكثر من DLL أو شيء يمكن أن يكون تم تحريرها مباشرة مثل صورة أو ملف مزيج (ولست بحاجة إلى حذف/تحديد ملف أو آخر) سيكون الدمج الحقيقي مثل:

أقترح البحث عن أداة فرق موجهة إلى ما هو الملف الثنائي، على سبيل المثال هناك بعض الأدوات المجانية لملفات الصور على سبيل المثال

ومقارنتها.

إذا لم تكن هناك أداة فرق لمقارنة ملفاتك، إذا كان لديك المولد الأصلي من ملف bin (أي، يوجد محرر لذلك...مثل Blender 3D ، يمكنك بعد ذلك فحص هذه الملفات يدويًا ، ومشاهدة السجلات أيضًا ، واسأل الشخص الآخر عما يجب عليك تضمينه) والقيام بإخراج الملفات مع https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

ويمكنني استخدام بوابة سير العمل لبرنامج Excel - الشبكي: //www.xltrail. كوم / بلوق / بوابة-سير العمل مقابل التفوق تطبيق لحل معظم الملفات الثنائية بلدي القضايا ذات الصلة الدمج. هذا التطبيق مفتوح المصدر يساعدني على حل القضايا بشكل مثمر دون إنفاق الكثير من الوقت ويتيح لي الكرز اختيار الإصدار الصحيح من الملف دون أي التباس.

حالتي تبدو وكأنها خطأ ....باستخدام بوابة 2.21.0

لقد قمت بالسحب...اشتكت من الملفات الثنائية:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

ومن ثم لم ينتج عن أي شيء في أي من الإجابات هنا أي نتيجة منطقية.

إذا نظرت إلى الملف الذي لدي الآن ...إنه الذي قمت بتحريره.إذا قمت بذلك إما:

git checkout --theirs -- <path>
git checkout --ours -- <path>

أحصل على الإخراج:

Updated 0 paths from the index

وما زال لدي نسختي من الملف.إذا قمت بإجراء rm ثم قمت بالخروج، فسيظهر 1 بدلاً من ذلك، لكنه لا يزال يعطيني نسختي من الملف.

يقول بوابة mergetool

No files need merging

وتقول حالة بوابة

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

خيار واحد هو أن التراجع عن الالتزام...لكنني لم أكن محظوظًا وكان لدي العديد من الأخطاء، وكان هذا الخطأ الأول.لا أريد إضاعة الوقت في تكرار ذلك.

لذا لحل هذا الجنون:

لقد ركضت للتو

git commit

الذي يفقد الإصدار البعيد، وربما يهدر بعض المساحة في تخزين ملف ثنائي إضافي...ثم

git checkout <commit where the remote version exists> <path>

الذي يعطيني مرة أخرى النسخة البعيدة

ثم قم بتحرير الملف مرة أخرى... ثم الالتزام والدفع، وهو ما يعني مرة أخرى على الأرجح إضاعة المساحة مع نسخة أخرى من الملف الثنائي.

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