Vra

Ek het al met behulp van Mercurial vir 'n rukkie, en daar is 'n "feit" dat baie keer gegee.

In werklikheid is dit my getref terwyl jy 'n video gemaak deur Fogcreek gister hierdie video: Mis Creek oond. Ontsluit die krag van DVCS vir jou maatskappy dat dit lyk asof daar iets wat nie hier werk nie vir my nie

Op ongeveer 01:39 in die video en af ??dit maak 'n punt daarvan om te sê dat, terwyl ander weergawe beheer stelsels spore weergawes (bv. Foto's), DVCS 'soos Mercurial spoor changesets (wat gebeur het, bv. Tussen die foto's.)

Dit gee hulle 'n voorsprong in die samesmelting van scenario's, en dan wys dit 'n voorbeeld. As jy 'n funksie aan die een arm te beweeg, en dieselfde funksie verander in 'n ander tak, Mercurial in staat is om saam te smelt nie.

En ek het gesien hierdie elders genoem, al het ek geen direkte skakels nie nou kan vind.

Dit lyk nie werk vir my.


Edit: Dit is 'n probleem met die verstek "beyondcompare3" merge hulpmiddel opset vir TortoiseHg. Ek die opset hieronder bygevoeg aan my Mercurial.ini lêer, en nou is dit werk soos verwag. Seker, sal dit wel voorspel tot die GUI hulpmiddel as dit nie kan automerge, maar nou is die in hierdie vraag beskryf hier merge loop sonder enige instruksies en net doen die regte ding uit die boks

[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

Om dit te toets, ek verbind hierdie lêer na 'n bewaarplek:

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");
}

Toe ek in twee verskillende parallel changesets vertakking uit hierdie een, ek het die volgende twee veranderinge:

  1. Ek het die Function1 funksie aan die onderkant van die lêer
  2. Ek verander die boodskap binne Function1

Ek het toe probeer om saam te smelt, en Mercurial gee my 'n merge konflik venster, probeer om uit te vind wat ek gedoen het.

Eintlik is dit probeer om die teks in Function2, wat nou in die posisie dat Function1 was voordat dit verskuif verander.

Dit is nie veronderstel om te gebeur!


Hier is die bron lêers vir die vertoning my voorbeeld:

Batch lêer vir die vervaardiging van repository:

@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"

Die 3 weergawes van die lêer, example1.linq, example2.linq en example3.linq:

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");
}
Was dit nuttig?

Oplossing

Wel, wat jy tans een van die beperking van, basies, enige huidige VCS slaan (DVCS of nie, dit maak nie saak).

Die ding is dat VCS is tans taal agnostikus, die basis van hul merge algoritme is 'n tekstuele verskil. Dit beteken dat hulle op soek is na wat verandering en wat is die verband konteks .
Die belangrike rol hier is die konteks. Dit is niks meer wat 'n paar lyne voor en na die veranderinge wat jy gemaak het.

Dit beteken dat hulle is regtig sleg hanteer kode re-organisasie binne 'n dieselfde lêer, omdat jy basies skroefwerk al die konteks hulle kan staatmaak op.
Tipies, in jou voorbeeld, deur oor te skakel die twee funksies, jy nie net heeltemal omgekeer die konteks tussen die twee changesets, maar erger, deurdat geen ekstra lyne na die nuutste funksie, jy verminder implisiet die konteks van die jongste verandering, dalende die kanse dat 'n merge algoritme het in staat om uit te vind wat jy regtig het.

Ek tans net weet een verskil instrument, uit MSFT, vir XML, wat probeer om te gaan met die semantiese van jou verandering en nie net die tekstuele voorstelling.
Ek weet ook dat die ouens van PlasticSCM probeer om so 'n funksie te implementeer vir 'n paar hoofstroom tale, maar dit is regtig 'n plek waar daar ruimte vir verbetering.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top