2010-01-22 5 views

Antwort

22

Eine Änderung, die ein Konflikt ist, wenn 2 Personen beide die gleiche Datei in einer solchen Weise geändert haben, dass die zwei Änderungen nicht automatisch behoben werden können.

1) Beginnen wir mit einem Beispiel für eine konfliktfreie Zusammenführung.

Original-Datei

line1 
line2 
line3 

Person A ändert es dazu:

line1CHANGED 
line2 
line3 

Person B es dies ändert:

line1 
line2CHANGED 
line3 

Wenn diese werden in beide geprüft und zusammen Es gibt keinen Konflikt, weil es leicht auflösen kann, um diese endgültige Datei zu erzeugen:

line1CHANGED 
line2CHANGED 
line3 

Subversion wird dies automatisch als Zusammenführung behandeln.

2) Nun ein Beispiel für widersprüchliche Änderungen.

Original-Datei

line1 
line2 
line3 

Person A es dazu ändert:

line1CHANGED_BY_A 
line2 
line3 

Person B es dies ändert:

line1CHANGED_BY_B 
line2 
line3 

Dies kann nicht automatisch zusammengeführt werden, Es ist also ein Konflikt. Sie müssen das Problem lösen, indem Sie entweder die Änderung von Person A oder die Änderung von Person B akzeptieren. In diesem Fall warnt Subversion Sie vor Konflikten und erfordert eine Entscheidung von Ihnen, wie Sie diese beheben können.

3) Schließlich können Sie widersprüchliche und nicht widersprüchliche Änderungen innerhalb der gleichen Revision haben.

Original-Datei

line1 
line2 
line3 

Person A ändert es dazu:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

Person B es dies ändert:

line1CHANGED_BY_B 
line2 
line3ALSO_CHANGED_BY_B 

Jetzt, mit diesem Beispiel die beiden Menschen haben die Datei geändert, und es gibt eine widersprüchliche Änderung in Zeile 1, die aufgelöst werden muss, aber Zeile s 2 & 3 sind nicht widersprüchliche Änderungen und können automatisch gelöst werden.

Sie können dies auf verschiedene Arten beheben.

Zunächst können Sie entweder die Datei A oder B vollständig akzeptieren und die andere Datei verwerfen. Dies würde dazu führen, dass die anderen Personen keine widersprüchlichen Änderungen verlieren. Sprich: Sie wählen vollständig lösen A, Ihre endgültige Datei wäre:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

(Genau A der Datei und alle Änderungen von B verworfen)

Zweitens Sie nur die widersprüchlichen Änderungen lösen können, und behalten Sie immer noch alle nicht-widersprüchlichen Änderungen bei.In diesem Fall würden Sie entweder die Änderung von A oder B für die erste Zeile wählen und trotzdem beide Änderungen der anderen Zeile von beiden Personen erhalten. Also, sagen wir zum Beispiel Sie wählen, um Konflikte zu lösen A, Ihre endgültige Datei wäre:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3ALSO_CHANGED_BY_B 

Alternative Sie Tools wie KDiff verwenden können, die separat von jedem Konflikt Unterstützung der Überprüfung (denn natürlich können Sie mutliple Änderungen haben, widersprüchlich und nicht konfligierend, innerhalb der gleichen Datei), die Ihnen erlauben wird, verschiedene Methoden der Auflösung für jedes zu wählen.

Wenn Sie Probleme haben, das Zusammenführen mit den Befehlszeilentools zu verstehen, empfehle ich Ihnen, KDiff (oder ein anderes GUI merge/diff-Tool) zu betrachten, da sie die Dateien nebeneinander (zusammen mit dem Original) anzeigen erlauben Ihnen, visuell zu sehen, was jede Lösungsaktion tun würde.

+0

Vielen Dank für Ihre ausführliche Antwort! Ich konnte deine Beispiele in einem Svn-Projekt reproduzieren und ich verstehe endlich den Unterschied zwischen den Minenkonflikt- und Minenkommandokommandos! =) –

6

eine Funktion wie diese Betrachten (nennen wir es Revision 1)

void foo(){ 
    int bar; 
} 

der nun zwei Menschen auf diese Funktion Änderungen annehmen lassen, die beide aus Revision 1.

Alice Start:

void foo(){ 
    char bar; 
} 

Bob:

double foo(){ 
    double bar; 
    bar = 0; 
    return bar; 
} 

Nehmen wir für dieses Beispiel an, dass Alice ihre Änderungen festlegt.

Jetzt geht Bob zum Festschreiben von Änderungen, und svn wird Bob sagen, dass er veraltet ist und Änderungen aktualisieren und zusammenführen muss. Bob führt also ein Update durch, und die Zusammenführung erfolgt.

Im Grunde ist es (etwas) leicht zu sehen, dass das, was passiert, eine Analyse ist, das, was Bob 1 geändert von Revision entscheidet und was Alice von Revision 1.

double foo(){ 
    [conflict] bar; 
    bar = 0; 
    return bar; 
} 

Hinweis Eine einfache Zusammenführung produzieren so etwas wie

geändert dass sowohl Alice als auch Bob den Typ bar von int änderten, außer Alice machte es char und Bob machte es double. Die Fusion kann nicht entscheiden, welche korrekt ist (es wird keine Code-Analyse durchgeführt), so wie ein Mensch Bob helfen muss, den Konflikt zu lösen.

Das Beispiel ist natürlich etwas erfunden, und mit Ausnahme des genannten Konflikts sind alle anderen Änderungen nicht Konflikte.

Wenn Bob den Typ bar nicht geändert hätte, wären die Dateien ohne Konflikt zusammengeführt worden.

+0

Schönes Beispiel. +1 –

Verwandte Themen