سؤال

لقد كنت أستخدم Mercurial لفترة من الوقت ، وهناك "حقيقة" واحدة تُعطى عدة مرات.

في الواقع ، لقد ضربني أثناء مشاهدة مقطع فيديو صنعه Fogcreek أمس ، هذا الفيديو: Fog Creek Kiln: فتح قوة DVCs لشركتك يبدو أن هناك شيئًا لا يعمل بالنسبة لي هنا.

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

هذا يمنحهم ميزة في دمج السيناريوهات ، ثم يظهر مثالاً. إذا قمت بنقل وظيفة في فرع واحد ، وقمت بتغيير الوظيفة نفسها في فرع آخر ، فإن Mercurial قادر على دمج ذلك.

وقد رأيت هذا المذكور في مكان آخر ، على الرغم من أنني لا أستطيع العثور على أي روابط مباشرة الآن.

هذا لا يبدو أنه يعمل بالنسبة لي.


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

[ui]
merge = bc3

[merge-tools]
bc3.executable = C:\Program Files (x86)\Beyond Compare 3\bcomp.exe
bc3.args = $local $other $base $output /automerge /reviewconflicts /closescript
bc3.priority = 1
bc3.premerge = True
bc3.gui = True

لاختبار هذا ، لقد التزمت هذا الملف بمستودع:

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

ثم في اثنين من التغييرات المتوازية المختلفة المتفرعة من هذا التسلع ، فعلت التغييرين التاليين:

  1. لقد قمت بنقل وظيفة Function1 إلى أسفل الملف
  2. لقد غيرت الرسالة داخل الوظيفة 1

ثم حاولت الاندماج ، والزئبق يعطيني نافذة تعارض دمج ، في محاولة لمعرفة ما فعلته.

في الأساس ، يحاول تغيير النص في Function2 ، والذي هو الآن في الموضع الذي كان عليه الوظيفة 1 قبل نقله.

هذا لم يكن من المفترض أن يحدث!


إليك الملفات المصدر لإعادة إنتاج مثالي:

ملف الدُفعات لإنتاج المستودع:

@echo off

setlocal

if exist repo rd /s /q repo
hg init repo
cd repo

copy ..\example1.linq example.linq
hg commit -m "initial commit" --addremove --user "Bob" --date "2010-01-01 18:00:00"

copy ..\example2.linq example.linq
hg commit -m "moved function" --user "Bob" --date "2010-01-01 19:00:00"

hg update 0
copy ..\example3.linq example.linq
hg commit -m "moved function" --user "Alice" --date "2010-01-01 20:00:00"

إصدارات 3 من الملف ، example1.linq ، example2

example1.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

example2.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}

public void Function1()
{
    Debug.WriteLine("Function 1");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

example3.linq:

<Query Kind="Program" />

void Main()
{
    Function1();
    Function2();
}

public void Function1()
{
    Debug.WriteLine("Function 1b");
    for (int index = 0; index < 10; index++)
        Debug.WriteLine("f1: " + index);
}

public void Function2()
{
    Debug.WriteLine("Function 1");
}
هل كانت مفيدة؟

المحلول

حسنًا ، أنت تضرب حاليًا أحد قيود ، أي VCs الحالية (DVCs أم لا ، لا يهم).

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

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

أنا أعرف حاليًا فقط عن أداة فرق واحدة ، من MSFT ، لـ XML ، التي تحاول التعامل مع متعلق بدلالات الألفاظ من التغيير الخاص بك وليس فقط تمثيله النصي.
أعلم أيضًا أن رجال PlasticsCM يحاولون تنفيذ مثل هذه الميزة لبعض اللغات السائدة ، لكنه حقًا مكان يوجد فيه مجال للتحسين.

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